লেবেলের প্রস্থের উপর নির্ভর করে ইউআইকোলিকেশনভিউয়ের গতিশীল কক্ষ প্রস্থ


94

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

এখানে কোড

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    arrayOfStats =  @[@"time:",@"2",@"items:",@"10",@"difficulty:",@"hard",@"category:",@"main"];
}

- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:     (NSInteger)section{
    return [arrayOfStats count];
}

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath{

    return CGSizeMake(??????????);
}

- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView{

    return 1;
}

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{

    Cell *cell = (Cell *) [collectionView dequeueReusableCellWithReuseIdentifier:@"qw" forIndexPath:indexPath];
    cell.myLabel.text = [NSString stringWithFormat:@"%@",[arrayOfStats objectAtIndex:indexPath.item]];
    // make label width depend on text width
    [cell.myLabel sizeToFit];

    //get the width and height of the label (CGSize contains two parameters: width and height)
    CGSize labelSize = cell.myLbale.frame.size;

    NSLog(@"\n width  = %f height = %f", labelSize.width,labelSize.height);

    return cell;
}

অনুরূপ ধরণের সমস্যা ... স্ট্যাকওভারফ্লো . com/ প্রশ্ন / 24915443/ … ???
ফ্যাটি

উত্তর:


85

বিনিময়ে sizeForItemAtIndexPathপাঠ্যের আকার

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath{

    return [(NSString*)[arrayOfStats objectAtIndex:indexPath.row] sizeWithAttributes:NULL];
}

4
আপনি কল্পনা করতে পারবেন না কিভাবে আমি আপনাকে ধন্যবাদ! এটা সত্যিই কাজ করে। এখন আমার কেবলমাত্র [সেল.মাইবেল সাইজটফিট] সমস্যাটি সমাধান করা দরকার কারণ এটি কেবল স্ক্রোলিংয়ের পরে তার পুরো আকারে প্রদর্শিত হবে। তবে আমি আপনার সমাধানের খুব কাছেও যাই নি।
স্পন্দিত

আপনার সহায়তার জন্য আপনাকে ধন্যবাদ তবে আমার এখনও একটি সমস্যা আছে। আমি যখন সেলামি করি না [সেল.মাইবেল সাইজের টোফিট] আমার কাছে শব্দগুলি কেটে ফেলা হয় এবং নীচে অক্ষরগুলি কেটে যায় তবে আমি স্ক্রোল করার পরে এটি ঠিক হয়ে যায় (শব্দের স্বাভাবিক আকার হয় এবং অক্ষরগুলি কিছুটা লাফিয়ে যায়)। আমি যদি [সেল.মাইবেল সাইজের টোফিট] বার্তাটি মন্তব্য এবং অক্ষম করে থাকি (আমি আইবি নিয়ে খেলা করার সিদ্ধান্ত নিয়েছি এবং এটি ভাল কাজ করে) আমার শব্দের শেষে এবং নীচে কাটা আছে। আমি একটি স্ক্রিনশট তৈরি করেছি goo.gl/HaoQQV এটি রেটিনাবিহীন প্রদর্শনগুলিতে খুব তীক্ষ্ণ নয় তবে আপনি দেখতে পাচ্ছেন যে অক্ষরগুলি কেটে গেছে। কীভাবে সমাধান করবেন সে সম্পর্কে আপনার পরামর্শটি সত্যই প্রশংসিত হবে!
সজ্জা

4
সাইজটওফিটের পরিবর্তে, মাপের লেখার সিজি সাইজ পেতেঅ্যাট্রিবিউট ব্যবহার করুন, তারপরে নতুন আকারের সাথে লেবেলের ফ্রেমটি সেট করুন।
বশির_ক্যাড

পরামর্শের জন্য আপনাকে ধন্যবাদ তবে আমি এখনও নীচে এবং শেষে আমার লেবেল কাটা আছে। আপনার পরামর্শটি বাস্তবায়নে আমি ভুল করছি। আমার কোডটি এখানে
সজ্জা করুন

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{ Cell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"qw" forIndexPath:indexPath]; cell.myLbale.text = [NSString stringWithFormat:@"%@",[arrayOfStats objectAtIndex:indexPath.item]]; CGSize textSize; textSize = [[arrayOfStats objectAtIndex:indexPath.item] sizeWithAttributes:@{NSFontAttributeName:[UIFont systemFontOfSize:12.0f]}]; [cell.myLbale sizeThatFits:textSize]; //[cell.myLbale sizeToFit]; return cell; }
স্পন্দিত

50

সুইফট 4.2+ +

মূলনীতিটি হ'ল:

  1. নিশ্চিত করুন প্রতিনিধি স্থাপন করা হয়েছে (উদাঃ collectionView.delegate = self)

  2. প্রয়োগ করুন UICollectionViewDelegateFlowLayout(এতে প্রয়োজনীয় পদ্ধতির স্বাক্ষর রয়েছে)।

  3. কল collectionView...sizeForItemAtপদ্ধতি।

  4. পদ্ধতি কল করতে ব্রিজ কাস্ট Stringকরার দরকার নেই । সুইফটটি বাক্সের বাইরে রয়েছে।NSStringsize(withAttributes:String

  5. বৈশিষ্ট্যগুলি আপনি একই হিসাবে সেট করেছেন (NS)AttributedString, যেমন হরফ পরিবার, আকার, ওজন ইত্যাদি ,চ্ছিক প্যারামিটার।


নমুনা সমাধান:

extension ViewController: UICollectionViewDelegateFlowLayout {
    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
        return "String".size(withAttributes: nil)
    }
}

তবে আপনি সম্ভবত আপনার ঘরের সাথে সম্পর্কিত কংক্রিট স্ট্রিং বৈশিষ্ট্যগুলি উল্লেখ করতে চান, অতএব চূড়ান্ত রিটার্নটি দেখতে এমন হবে:

extension ViewController: UICollectionViewDelegateFlowLayout {
    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
        // dataArary is the managing array for your UICollectionView.
        let item = dataArray[indexPath.row]
        let itemSize = item.size(withAttributes: [
            NSAttributedString.Key.font : UIFont.boldSystemFont(ofSize: 14)
        ])
        return itemSize
    }
}

আপনি আকারটি গণনা করতে ইউআইএলবেল ব্যবহার করবেন না কেন? প্রস্তাবিত সমাধানটি এখানে:

let label = UILabel(frame: CGRect.zero)
label.text = textArray[indexPath.item]
label.sizeToFit()

হ্যাঁ, আপনি একই ফলাফল পান। এটি সরল মনে হয় এবং এটি যেতে-যেতে সমাধান হিসাবে মনে হতে পারে। তবে এটি অনুচিত কারণ: 1) এটি ব্যয়বহুল, 2) ওভারহেড এবং 3) নোংরা।

এটি ব্যয়বহুল কারণ ইউআইএলবেল একটি জটিল ইউআই অবজেক্ট, যা প্রতিটি পুনরাবৃত্তির উপর তৈরি করা হচ্ছে যখনই আপনার ঘরটি এটির প্রয়োজন না সত্ত্বেও প্রদর্শিত হবে। এটি একটি ওভারহেড সমাধান কারণ আপনার কেবল একটি পাঠ্যের আকার নেওয়া দরকার তবে আপনি পুরো ইউআই অবজেক্টটি তৈরি করতে পারেন। এবং এটি যে কারণে নোংরা।


4
সেট করতে ভুলবেন নাcollectionView.delegate == self // or whatever-object-which-do-it
ফিটস্যু

দুর্দান্ত উত্তর। যদিও আমি যে আকারটি পাচ্ছিলাম তা প্রয়োজনের তুলনায় কিছুটা ছোট ছিল, বিভিন্ন দৈর্ঘ্যের স্ট্রিংয়ের উপর, আমি নিজেই আকারটি কিছুটা পরিবর্তন করার সিদ্ধান্ত নিয়েছি। প্রস্থে অতিরিক্ত 5 পয়েন্ট যুক্ত করা কৌশলটি করেছে:CGSize(width: title.size(withAttributes: [NSAttributedString.Key.font : UIFont.boldSystemFont(ofSize: 16)]).width + 5, height: 50)
স্টারস্কি

37

আমি দ্রুত 4.2 এর জন্য একটি ছোট কৌশল পেয়েছি

গতিশীল প্রস্থ এবং স্থির উচ্চতার জন্য:

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
        let label = UILabel(frame: CGRect.zero)
        label.text = textArray[indexPath.item]
        label.sizeToFit()
        return CGSize(width: label.frame.width, height: 32)
    }

গতিশীল উচ্চতা এবং নির্দিষ্ট প্রস্থের জন্য:

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
            let label = UILabel(frame: CGRect.zero)
            label.text = textArray[indexPath.item]
            label.sizeToFit()
            return CGSize(width: 120, height: label.frame.height)
        }

8
এটি ব্যবহারে সতর্কতা অবলম্বন করুন। প্রতিটি কক্ষ গণনার জন্য একটি নতুন ইউআইএলবেল তৈরি করা এবং অঙ্কন করা খুব ব্যয়বহুল।
অ্যান্থনিআর

UICollectionViewDelegateFlowLayout যোগ করার প্রয়োজন
cristianego

4
এটি ডামি লেবেল তৈরি করা ব্যয়বহুল বলে মন্তব্য করার জন্য, আপনি বেশ কয়েকটিটির পরিবর্তে কেবল একটি ডামি লেবেল তৈরি করতে পারেন। আপনি যা দেখতে চান তা হ'ল লেবেল বৈশিষ্ট্যগুলির পাঠ্য আকার। দিনের শেষে যদিও এটি পাঠ্যের আকারের মাধ্যমে গণনা করা মূলত একই sizeWithAttributes, তাই সম্ভবত এটি পছন্দসই উত্তর।
স্টিফেন পল

@ হাসান ধন্যবাদ ভাই এটি আমার পক্ষে কাজ করেছে, তবে আমি প্রস্থে একটি সমস্যা পেয়েছি তাই সিজি সাইজ (প্রস্থ: লেবেল.ফ্রেম.উইথ + 50, উচ্চতা: 32) যুক্ত করে প্রস্থে একটি সমস্যা পেয়েছি। তারপরে এটি কাজ করেছিল, আমি মনে করি এই উত্তরটি শীর্ষ তালিকায় থাকা উচিত।
আরশাদ শাইক

27

কোডের নীচে চেকআউট আপনি খুব সংক্ষিপ্ত সিজি সাইজ দিচ্ছেন।

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath{

    NSString *testString = @"SOME TEXT";
    return [testString sizeWithAttributes:NULL];
}

@ ভিনিশ টিপি আপনার প্রতিক্রিয়ার জন্য আপনাকে ধন্যবাদ, আমি অবশ্যই এটি পরীক্ষা করে দেখাব এবং আপনাকে জানাব!
সজ্জা

+1000 এটি অবশ্যই কাজ করে। আপনার এবং বশিরের পোস্টে সবুজ চেক চিহ্ন থাকা উচিত।
রকি রাকুন

কোন ধারণা কীভাবে সুইফট 3 দিয়ে এটি করবেন?
ইউকেডাটাগীক

4
ম্যানকে ধন্যবাদ, তার পার্টির সময় !!
রবি



0

// ভিডেডডলোড যুক্ত করুন

UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init];
    [layout setScrollDirection:UICollectionViewScrollDirectionHorizontal];
    layout.estimatedItemSize = CGSizeMake(self.breadScrumbCollectionView.frame.size.width, 30); 
self.breadScrumbCollectionView.collectionViewLayout = layout;
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.