আমি কোনও ইউআইএসক্রোলভিউ এর সামগ্রীতে ফিট করার জন্য কীভাবে আকার করব size


130

একটি করার উপায় আছে? UIScrollViewযে সামগ্রীটি স্ক্রোল করছে তার উচ্চতা (বা প্রস্থ) এর সাথে কী স্বয়ংক্রিয়-সামঞ্জস্য করার ?

কিছুটা এইরকম:

[scrollView setContentSize:(CGSizeMake(320, content.height))];

উত্তর:


306

UIScrollViewএর অন্তর্ভুক্ত সাবউউভিউয়ের উপর ভিত্তি করে সামগ্রীর আকারের আপডেট করতে আমি সর্বকালের সেরা পদ্ধতিটি পেয়েছি:

উদ্দেশ্য গ

CGRect contentRect = CGRectZero;

for (UIView *view in self.scrollView.subviews) {
    contentRect = CGRectUnion(contentRect, view.frame);
}
self.scrollView.contentSize = contentRect.size;

দ্রুতগতি

let contentRect: CGRect = scrollView.subviews.reduce(into: .zero) { rect, view in
    rect = rect.union(view.frame)
}
scrollView.contentSize = contentRect.size

9
আমি এটি চালিয়ে যাচ্ছি viewDidLayoutSubviewsতাই অটোলেআউটটি শেষ হবে, আইওএস 7 এ এটি ভাল কাজ করেছে, তবে কোনও কারণের কারণে ওএস আইওএল 6 এর পরীক্ষা করা কাজটি শেষ করেনি, তাই আমার কিছু উচ্চতার মান রয়েছে, তাই আমি viewDidAppearএখন ঠিকঠাক কাজ করে চলেছি .. কেবল কারোর এটির প্রয়োজন হতে পারে তা উল্লেখ করার জন্য। ধন্যবাদ
হাতেম আলিমাম

1
আইওএস 6 আইপ্যাডের সাথে নীচের ডানদিকে কোণে রহস্যজনক ইউআইআইমেজভিউ (7x7) ছিল। আমি কেবলমাত্র (দৃশ্যমান && আলফা) ইউআই উপাদানগুলি গ্রহণ করে তা ফিল্টার করেছি, তারপরে এটি কার্যকর হয়েছিল। ভাবছেন যদি সেই চিত্রটি ভিউ স্ক্রোলবারের সাথে সম্পর্কিত ছিল তবে অবশ্যই আমার কোড নয়।
জেএম

5
যখন স্ক্রোল সূচকগুলি সক্ষম হয় দয়া করে সাবধান! একটি ইউআইআইমেজভিউ এসডিকে দ্বারা স্বয়ংক্রিয়ভাবে প্রতিটিের জন্য তৈরি করা হবে। আপনার অবশ্যই এটির জন্য অ্যাকাউন্ট করতে হবে অন্যথায় আপনার সামগ্রীর আকার ভুল হবে। (দেখুন stackoverflow.com/questions/5388703/... )
AmitP

এই সমাধানটি সুইফট 4
এথান হ্যামফ্রিজ

প্রকৃতপক্ষে, আমরা সিজিআরেক্ট.জারো থেকে মিলন শুরু করতে পারি না, এটি কেবলমাত্র যদি আপনি নেতিবাচক স্থানাঙ্কে কিছু মতামত বাস করেন তবে কাজ করে works আপনার ইউনিয়ন সাবভিউ ফ্রেমগুলি শূন্য থেকে নয়, প্রথম সাবভিউ থেকে শুরু করা উচিত। উদাহরণস্বরূপ, আপনার কাছে কেবলমাত্র একটি মতামত রয়েছে যা ফ্রেম (50, 50, 100, 100) সহ একটি ইউআইভিউ। আপনার সামগ্রীর আকার হবে (0, 0, 150, 150), না (50, 50, 100, 100)।
ইভজেনি

74

ইউআইএসক্রোলভিউ স্বয়ংক্রিয়ভাবে এর সামগ্রীর উচ্চতা জানে না। আপনাকে নিজের জন্য উচ্চতা এবং প্রস্থের গণনা করতে হবে

এরকম কিছু করে করুন

CGFloat scrollViewHeight = 0.0f;
for (UIView* view in scrollView.subviews)
{
   scrollViewHeight += view.frame.size.height;
}

[scrollView setContentSize:(CGSizeMake(320, scrollViewHeight))];

তবে এটি কেবল তখনই কাজ করে যদি ভিউগুলি একে অপরের নীচে থাকে। যদি একে অপরের পাশে আপনার মতামত থাকে তবে আপনাকে কেবলমাত্র একটির উচ্চতা যুক্ত করতে হবে যদি আপনি স্ক্রোলারের সামগ্রীটিকে সত্যিকারের চেয়ে বড় সেট করতে না চান।


আপনার কি মনে হয় এরকম কিছু কাজ করবে? সিজিফ্লোট স্ক্রোলভিউহাইট = স্ক্রোলভিউ.কন্টেন্টসাইজ.হাইট; [স্ক্রোলভিউ সেটকন্টেন্টসাইজ: (সিজি সাইজমেক (320, স্ক্রোলভিউহাইট))]]; বিটিডাব্লু, আকারের পরে উচ্চতার জন্য জিজ্ঞাসা করতে ভুলবেন না। স্ক্রোলভিউহাইট + = ভিউ.ফ্রেম.সাইজ.হাইট
জুরিয়ার

উচ্চতায় স্ক্রোলভিউহাইট শুরু করা স্ক্রোলারটিকে তার সামগ্রীর চেয়ে বড় করে তোলে। আপনি যদি এটি করেন তবে স্ক্রোলার সামগ্রীটির প্রাথমিক উচ্চতায় দৃশ্যমান দৃশ্যের উচ্চতা যুক্ত করবেন না। যদিও আপনার প্রাথমিক গ্যাপ বা অন্য কিছু দরকার হতে পারে।
এমেনিগ্রো

21
বা কেবল করুন:int y = CGRectGetMaxY(((UIView*)[_scrollView.subviews lastObject]).frame); [_scrollView setContentSize:(CGSizeMake(CGRectGetWidth(_scrollView.frame), y))];
গ্যাল

@ সেনতাজ, ধন্যবাদ, আমি এটিকে কেবল একটি আনুষ্ঠানিক উত্তর হিসাবে যুক্ত করেছি :)
গাল

40

সমাধান যদি আপনি অটো লেআউট ব্যবহার করছেন:

  • সেট translatesAutoresizingMaskIntoConstraintsথেকে NOজড়িত সকল দৃশ্য উপর।

  • আপনার স্ক্রোল ভিউটির বাইরে স্ক্রোল ভিউয়ের সীমাবদ্ধতার সাথে আকার দিন।

  • স্ক্রোল ভিউয়ের মধ্যে সংক্ষিপ্তসারগুলি সংক্ষিপ্তসারগুলি ব্যবহার করুন, সুনির্দিষ্ট হয়েছিলেন যে সীমাবদ্ধতাগুলি স্ক্রোল ভিউয়ের চারটি প্রান্তে বেঁধে দেয় এবং তাদের আকার পেতে স্ক্রোল ভিউয়ের উপর নির্ভর করে না।

সূত্র: https://developer.apple.com/library/ios/technotes/tn2154/_index.html


10
ইমো এটি বিশ্বের আসল সমাধান যেখানে অটো লেআউট দিয়ে সবকিছু ঘটে। অন্যান্য সমাধানগুলি সম্পর্কে: আপনি প্রতিটি ভিউয়ের উচ্চতা এবং কখনও কখনও প্রস্থের গণনা করার ক্ষেত্রে কী গুরুতর?
ফকস

এই ভাগ করার জন্য আপনাকে ধন্যবাদ! এটি গ্রহণযোগ্য উত্তর হওয়া উচিত।
SePröbläm

2
আপনি যখন স্ক্রোলভিউয়ের সামগ্রীর উচ্চতার উপর ভিত্তি করে উচ্চতা তৈরি করতে চান তখন এটি কাজ করে না। (উদাহরণস্বরূপ পর্দা কেন্দ্রিক একটি পপআপ যেখানে আপনি নির্দিষ্ট পরিমাণ সামগ্রী পর্যন্ত স্ক্রোল করতে চান না)।
লেগম

এটি প্রশ্নের উত্তর দেয় না
ইগোর ভাসেলিভ

দুর্দান্ত সমাধান। তবে, আমি আরও একটি বুলেট যুক্ত করব ... "কোনও শিশু স্ট্যাক ভিউয়ের উচ্চতাটি যদি উল্লম্বভাবে বৃদ্ধি করা উচিত তবে তা সীমাবদ্ধ করবেন না Just এটিকে কেবল স্ক্রোল দেখার প্রান্তে পিন করুন" "
অ্যান্ড্রু কিরনা

35

আমি এপুজ এবং জিসিসির উত্তরে এটি যুক্ত করেছি। এটি সাবভিউগুলির y অবস্থান ব্যবহার করে এবং স্ক্রোল বারগুলি অন্তর্ভুক্ত করে না। সম্পাদনা দৃশ্যমান যে সর্বনিম্ন সাব ভিউয়ের নীচে ব্যবহার করে।

+ (CGFloat) bottomOfLowestContent:(UIView*) view
{
    CGFloat lowestPoint = 0.0;

    BOOL restoreHorizontal = NO;
    BOOL restoreVertical = NO;

    if ([view respondsToSelector:@selector(setShowsHorizontalScrollIndicator:)] && [view respondsToSelector:@selector(setShowsVerticalScrollIndicator:)])
    {
        if ([(UIScrollView*)view showsHorizontalScrollIndicator])
        {
            restoreHorizontal = YES;
            [(UIScrollView*)view setShowsHorizontalScrollIndicator:NO];
        }
        if ([(UIScrollView*)view showsVerticalScrollIndicator])
        {
            restoreVertical = YES;
            [(UIScrollView*)view setShowsVerticalScrollIndicator:NO];
        }
    }
    for (UIView *subView in view.subviews)
    {
        if (!subView.hidden)
        {
            CGFloat maxY = CGRectGetMaxY(subView.frame);
            if (maxY > lowestPoint)
            {
                lowestPoint = maxY;
            }
        }
    }
    if ([view respondsToSelector:@selector(setShowsHorizontalScrollIndicator:)] && [view respondsToSelector:@selector(setShowsVerticalScrollIndicator:)])
    {
        if (restoreHorizontal)
        {
            [(UIScrollView*)view setShowsHorizontalScrollIndicator:YES];
        }
        if (restoreVertical)
        {
            [(UIScrollView*)view setShowsVerticalScrollIndicator:YES];
        }
    }

    return lowestPoint;
}

1
চমৎকার! ঠিক যেটা আমার দরকার ছিল.
রিচার্ড

2
ক্লাসের অংশ না হয়ে এই জাতীয় পদ্ধতিতে আমি অবাক হই।
জোও পোর্তেলা

আপনি কেন self.scrollView.showsHorizontalScrollIndicator = NO; self.scrollView.showsVerticalScrollIndicator = NO;শুরুতে এবং self.scrollView.showsHorizontalScrollIndicator = YES; self.scrollView.showsVerticalScrollIndicator = YES;পদ্ধতিটির শেষে করেছিলেন?
জোও পোর্তেলা

ধনী ধন্যবাদ :) +1 উত্তরের জন্য।
শ্রাদ্ধে

1
@ রিচি আপনি সঠিক স্ক্রোল সূচকগুলি দৃশ্যমান হলে সাবউভিউ হয় তবে যুক্তি প্রদর্শন / লুকিয়ে রাখা ভুল। আপনাকে দুটি বিওএল লোকাল যুক্ত করতে হবে: পুনরুদ্ধারক্ষেত্র = কোন, পুনরুদ্ধার = ভার্চুয়াল = না। যদি হোরাইজেন্টাল দেখায় তবে এটি লুকান, পুনরুদ্ধার হরাইজেন্টালটি হ্যাঁ সেট করুন। উল্লম্ব জন্য একই। এরপরে / ইন লুপ সন্নিবেশের পরে যদি বিবৃতিটি থাকে: তবে পুনরুদ্ধার হরাইঞ্জোনাল, এটি প্রদর্শন করতে সেট করুন, উলম্বের জন্য একই। আপনার কোড কেবলমাত্র উভয় সূচক দেখাতে বাধ্য করবে
অবৈধ-অভিবাসী

13

যে কেউ এটি রূপান্তর করতে খুব অলস হয় তার জন্য দ্রুত স্বীকৃত উত্তরটি এখানে দেওয়া হল:

var contentRect = CGRectZero
for view in self.scrollView.subviews {
    contentRect = CGRectUnion(contentRect, view.frame)
}
self.scrollView.contentSize = contentRect.size

এবং সুইফট 3-এর জন্য আপডেট করা হয়েছে: var কন্টেন্ট রেক্ট = সিজিআরেক্ট.জারো সেল্ফ.স্ক্রোলভিউ.সুবিউভিউগুলিতে দেখার জন্য {কন্টেন্টআরেক্ট = কন্টেন্টআরেক্ট.উইউন (ভিউ.ফ্রেম)} সেল্ফ.স্ক্রোলভিউ.কন্টেন্টসাইজ = কনটেন্ট রেক্ট.সাইজ
ড্র ..

এটি কি মূল থ্রেডে ডাকতে হবে? এবং লেআউটআউটভিউগুলিতে?
মাকসিম নিয়াজেভ

8

@ লিভিটানের উত্তরের একটি সুইফট 3 রূপান্তর এখানে দেওয়া হয়েছে:

EXTENSION কে

import UIKit


extension UIScrollView {

    func resizeScrollViewContentSize() {

        var contentRect = CGRect.zero

        for view in self.subviews {

            contentRect = contentRect.union(view.frame)

        }

        self.contentSize = contentRect.size

    }

}

, USAGE

scrollView.resizeScrollViewContentSize()

ব্যবহার করা খুব সহজ!


খুব দরকারী. অনেকগুলি পুনরাবৃত্তির পরে আমি এই সমাধানটি খুঁজে পেয়েছি এবং এটি নিখুঁত।
হার্ডিক শাহ

বাহ! সবেমাত্র এটি বাস্তবায়িত হয়েছে।
arvidurs

7

নিম্নলিখিত এক্সটেনশনটি সুইফটে সহায়ক হবে ।

extension UIScrollView{
    func setContentViewSize(offset:CGFloat = 0.0) {
        // dont show scroll indicators
        showsHorizontalScrollIndicator = false
        showsVerticalScrollIndicator = false

        var maxHeight : CGFloat = 0
        for view in subviews {
            if view.isHidden {
                continue
            }
            let newHeight = view.frame.origin.y + view.frame.height
            if newHeight > maxHeight {
                maxHeight = newHeight
            }
        }
        // set content size
        contentSize = CGSize(width: contentSize.width, height: maxHeight + offset)
        // show scroll indicators
        showsHorizontalScrollIndicator = true
        showsVerticalScrollIndicator = true
    }
}

প্রদত্ত উত্তরের সাথে যুক্তিও একই রকম। যাইহোক, এটি এর মধ্যে লুকানো দর্শন বাদ দেয় UIScrollViewএবং স্ক্রোল সূচকগুলি গোপনের পরে গণনা করা হয়।

এছাড়াও, এখানে একটি functionচ্ছিক ফাংশন প্যারামিটার রয়েছে এবং আপনি ফাংশনটিতে প্যারামিটার পাস করে একটি অফসেট মান যুক্ত করতে সক্ষম হন।


এই সমাধানটিতে অনেক বেশি অনুমান রয়েছে, আপনি কেন এমন পদ্ধতিতে স্ক্রোলিং সূচকগুলি দেখিয়ে যাচ্ছেন যা সামগ্রীর আকার নির্ধারণ করে?
ক্যাপে

5

@ লেভিয়াথন থেকে দুর্দান্ত এবং সর্বোত্তম সমাধান। কেবল এফপি (ফাংশনাল প্রোগ্রামিং) পদ্ধতির সাহায্যে সুইফটে অনুবাদ করা।

self.scrollView.contentSize = self.scrollView.subviews.reduce(CGRect(), { 
  CGRectUnion($0, $1.frame) 
}.size

আপনি যদি লুকানো দর্শনগুলি উপেক্ষা করতে চান তবে হ্রাস করার আগে আপনি সাবউভিউগুলি ফিল্টার করতে পারেন।
অ্যান্ডি

সুইফট 3 এর জন্য আপডেট হয়েছে:self.contentSize = self.subviews.reduce(CGRect(), { $0.union($1.frame) }).size
জন রজারস

4

কোন শিশু "আরও দূরে পৌঁছেছে" গণনা করে আপনি ইউআইএসক্রোলভিউয়ের ভিতরে থাকা সামগ্রীর উচ্চতা পেতে পারেন। এটি গণনা করতে আপনাকে মূল উত্স Y (শুরু) এবং আইটেমের উচ্চতা বিবেচনা করতে হবে।

float maxHeight = 0;
for (UIView *child in scrollView.subviews) {
    float childHeight = child.frame.origin.y + child.frame.size.height;
    //if child spans more than current maxHeight then make it a new maxHeight
    if (childHeight > maxHeight)
        maxHeight = childHeight;
}
//set content size
[scrollView setContentSize:(CGSizeMake(320, maxHeight))];

জিনিসগুলি এইভাবে করার মাধ্যমে আইটেমগুলি (সাবউভিউগুলি) একে অপরের অধীনে সরাসরি স্ট্যাক করা উচিত নয়।


আপনি লুপের অভ্যন্তরে এই একটি লাইনারটিও ব্যবহার করতে পারেন: ম্যাক্সহাইট = ম্যাক্স (ম্যাক্সহাইট, চাইল্ড.ফ্রেম.রিগিন.ই + চাইল্ড.ফ্রেম.সাইজ.হাইট) ;)
টমাস সিজি ডি ভিলেনা

3

@ ইমেনগ্রোর সমাধানের ভিত্তিতে আমি আরও একটি সমাধান নিয়ে এসেছি

NSInteger maxY = 0;
for (UIView* subview in scrollView.subviews)
{
    if (CGRectGetMaxY(subview.frame) > maxY)
    {
        maxY = CGRectGetMaxY(subview.frame);
    }
}
maxY += 10;
[scrollView setContentSize:CGSizeMake(scrollView.frame.size.width, maxY)];

মূলত, আমরা সনাক্ত করতে পারি যে ভিউটিতে কোন উপাদানটি সবচেয়ে নিচে রয়েছে এবং নীচে একটি 10px প্যাডিং যুক্ত করে


3

যেহেতু একটি স্ক্রোলভিউতে অন্যান্য স্ক্রোলভিউ বা পৃথক ডিপথ সাবভিউ গাছ থাকতে পারে, গভীরতার সাথে পুনরাবৃত্তভাবে চালানো ভাল is এখানে চিত্র বর্ণনা লিখুন

সুইফট 2

extension UIScrollView {
    //it will block the mainThread
    func recalculateVerticalContentSize_synchronous () {
        let unionCalculatedTotalRect = recursiveUnionInDepthFor(self)
        self.contentSize = CGRectMake(0, 0, self.frame.width, unionCalculatedTotalRect.height).size;
    }

    private func recursiveUnionInDepthFor (view: UIView) -> CGRect {
        var totalRect = CGRectZero
        //calculate recursevly for every subView
        for subView in view.subviews {
            totalRect =  CGRectUnion(totalRect, recursiveUnionInDepthFor(subView))
        }
        //return the totalCalculated for all in depth subViews.
        return CGRectUnion(totalRect, view.frame)
    }
}

ব্যবহার

scrollView.recalculateVerticalContentSize_synchronous()

2

বা কেবল করুন:

int y = CGRectGetMaxY(((UIView*)[_scrollView.subviews lastObject]).frame); [_scrollView setContentSize:(CGSizeMake(CGRectGetWidth(_scrollView.frame), y))];

(এই সমাধানটি এই পৃষ্ঠায় একটি মন্তব্য হিসাবে আমার দ্বারা যুক্ত হয়েছিল this এই মন্তব্যের জন্য ১৯ টি আপ-ভোট পাওয়ার পরে, আমি এই সমাধানটিকে সম্প্রদায়ের সুবিধার জন্য একটি আনুষ্ঠানিক উত্তর হিসাবে যুক্ত করার সিদ্ধান্ত নিয়েছি!)


2

সুইফট 4 এর জন্য হ্রাস ব্যবহার করে:

self.scrollView.contentSize = self.scrollView.subviews.reduce(CGRect.zero, {
   return $0.union($1.frame)
}).size

কমপক্ষে একটি সাবউভিউয়ের উত্স == সিজিপয়েন্ট।জায়ো আছে বা সুনির্দিষ্টভাবে একটি নির্দিষ্ট (উদাহরণস্বরূপ বৃহত্তম) সাবভিউয়ের উত্স শূন্যকে নির্ধারণ করা উচিত কিনা তাও দেখার বিষয়।
পল বি

এটি কেবলমাত্র সিজিআরেক্ট () এর সাথে তাদের মতামত স্থাপনকারীদের জন্য কাজ করে। আপনি যদি সীমাবদ্ধতাগুলি ব্যবহার করেন তবে এটি কাজ করছে না।
লিনাস_হোলগ্রাম

1

আকারটি এর ভিতরে থাকা সামগ্রী এবং ক্লিপিং বিকল্পগুলির উপর নির্ভর করে। যদি এটি একটি পাঠ্যদর্শন হয়, তবে এটি মোড়ানো, পাঠ্যের কতগুলি লাইন, ফন্টের আকার এবং এই জাতীয় উপর নির্ভর করে। আপনার নিজের গুণন করা প্রায় অসম্ভব। সুসংবাদটি হ'ল, ভিউটি লোড হওয়ার পরে এবং ভিউইলঅপায়ারে এটি গণনা করা হয়। এর আগে, এটি সমস্ত অজানা এবং সামগ্রীর আকার ফ্রেম আকারের সমান হবে। তবে, ভিউউইল অ্যাপ্ল পদ্ধতিতে এবং এর পরে (যেমন ভিউডিডঅ্যাপিয়ার) সামগ্রীর আকারটি আসল হবে।


1

রিচির কোডটি মোড়ানো আমি একটি কাস্টম ইউআইএসক্রোলভিউ ক্লাস তৈরি করেছি যা সামগ্রীতে পুনরায় আকার পরিবর্তন করতে স্বয়ংক্রিয়ভাবে চলে!

SBScrollView.h

@interface SBScrollView : UIScrollView
@end

SBScrollView.m:

@implementation SBScrollView
- (void) layoutSubviews
{
    CGFloat scrollViewHeight = 0.0f;
    self.showsHorizontalScrollIndicator = NO;
    self.showsVerticalScrollIndicator = NO;
    for (UIView* view in self.subviews)
    {
        if (!view.hidden)
        {
            CGFloat y = view.frame.origin.y;
            CGFloat h = view.frame.size.height;
            if (y + h > scrollViewHeight)
            {
                scrollViewHeight = h + y;
            }
        }
    }
    self.showsHorizontalScrollIndicator = YES;
    self.showsVerticalScrollIndicator = YES;
    [self setContentSize:(CGSizeMake(self.frame.size.width, scrollViewHeight))];
}
@end

কীভাবে ব্যবহার করবেন:
কেবলমাত্র আপনার ভিউ কন্ট্রোলারে .h ফাইলটি আমদানি করুন এবং সাধারণ ইউআইএসক্রোলভিউয়ের পরিবর্তে একটি এসবিএসক্রোলভিউ দৃষ্টান্ত ঘোষণা করুন।


2
লেআউটসুভিউগুলি দেখে মনে হচ্ছে এটি যেমন লেআউট সম্পর্কিত কোডের জন্য সঠিক জায়গা। তবে একটি ইউআইএসক্রোলভিউ বিন্যাসে সাবভিউ স্ক্রল করার সময় যখনই সামগ্রী অফসেট আপডেট হয় তখনই তাকে ডাকা হয়। এবং যেহেতু সাধারণত স্ক্রোল করার সময় সামগ্রীর আকার পরিবর্তন হয় না এটি বরং অপচয়।
21:51

সেটা সত্য. এই অদক্ষতা থেকে বাঁচার একটি উপায় হ'ল [স্বতঃআগ্রহ করা] এবং [স্ব-আইডিসিলিটারিং] পরীক্ষা করা এবং যদি উভয়ই মিথ্যা থাকে তবে কেবল বিন্যাস সম্পাদন করা।
গ্রেগ ব্রাউন


0

এটি সত্যই সামগ্রীর উপর নির্ভর করে: কন্টেন্ট.ফ্রেম.হাইট আপনাকে যা দিতে চান তা দিতে পারে? বিষয়বস্তু একক জিনিস, বা জিনিসগুলির সংকলন নির্ভর করে।


0

আমি সবচেয়ে ভাল কাজ করার জন্য লিবিয়াথনের উত্তরও পেয়েছি। তবে এটি একটি অদ্ভুত উচ্চতা গণনা করা হয়েছিল was সাবভিউগুলি লুপ করার সময়, যদি স্ক্রোলভিউটি স্ক্রোল সূচকগুলি দেখানোর জন্য সেট করা থাকে তবে সেগুলি সাবভিউয়ের অ্যারেতে থাকবে। এই ক্ষেত্রে সমাধানটি হ'ল লুপিংয়ের আগে অস্থায়ীভাবে স্ক্রোল সূচকগুলি অক্ষম করা উচিত, তারপরে তাদের পূর্বের দৃশ্যমানতার সেটিংসটি পুনরায় প্রতিষ্ঠিত করুন।

-(void)adjustContentSizeToFit ইউআইএসক্রোলভিউয়ের একটি কাস্টম সাবক্লাসে একটি সর্বজনীন পদ্ধতি।

-(void)awakeFromNib {    
    dispatch_async(dispatch_get_main_queue(), ^{
        [self adjustContentSizeToFit];
    });
}

-(void)adjustContentSizeToFit {

    BOOL showsVerticalScrollIndicator = self.showsVerticalScrollIndicator;
    BOOL showsHorizontalScrollIndicator = self.showsHorizontalScrollIndicator;

    self.showsVerticalScrollIndicator = NO;
    self.showsHorizontalScrollIndicator = NO;

    CGRect contentRect = CGRectZero;
    for (UIView *view in self.subviews) {
        contentRect = CGRectUnion(contentRect, view.frame);
    }
    self.contentSize = contentRect.size;

    self.showsVerticalScrollIndicator = showsVerticalScrollIndicator;
    self.showsHorizontalScrollIndicator = showsHorizontalScrollIndicator;
}

0

আমি মনে করি এটি ইউআইএসক্রোলভিউয়ের সামগ্রী দেখার আকার আপডেট করার একটি ঝরঝরে উপায় হতে পারে।

extension UIScrollView {
    func updateContentViewSize() {
        var newHeight: CGFloat = 0
        for view in subviews {
            let ref = view.frame.origin.y + view.frame.height
            if ref > newHeight {
                newHeight = ref
            }
        }
        let oldSize = contentSize
        let newSize = CGSize(width: oldSize.width, height: newHeight + 20)
        contentSize = newSize
    }
}

0

কেন কোড একক লাইন না ??

_yourScrollView.contentSize = CGSizeMake(0, _lastView.frame.origin.y + _lastView.frame.size.height);

0
import UIKit

class DynamicSizeScrollView: UIScrollView {

    var maxHeight: CGFloat = UIScreen.main.bounds.size.height
    var maxWidth: CGFloat = UIScreen.main.bounds.size.width

    override func layoutSubviews() {
        super.layoutSubviews()
        if !__CGSizeEqualToSize(bounds.size,self.intrinsicContentSize){
            self.invalidateIntrinsicContentSize()
        }
    }

    override var intrinsicContentSize: CGSize {
        let height = min(contentSize.height, maxHeight)
        let width = min(contentSize.height, maxWidth)
        return CGSize(width: width, height: height)
    }

}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.