পাঠ্যের উপর নির্ভর করে UILabel উচ্চতা সামঞ্জস্য করুন


315

একটি UILabel(গতিশীল পাঠ্যের একটি দীর্ঘ রেখা) এ আমার নিম্নোক্ত পাঠ্যটি বিবেচনা করুন :

যেহেতু এলিয়েন আর্মি দলকে বিশাল পরিমাণে ছাড়িয়ে যায়, খেলোয়াড়দের অবশ্যই তাদের সুবিধার্থে পোস্ট-অ্যাপোক্ল্যাপটিক ওয়ার্ল্ডকে তাদের সুবিধার্থে ব্যবহার করতে হবে, যেমন ডাম্পস্টারস, পিলার, গাড়ি, ধ্বংসস্তূপ এবং অন্যান্য সামগ্রীর পিছনে কভার সন্ধান করা।

আমি UILabel'sউচ্চতাটি পুনরায় আকার দিতে চাই যাতে পাঠ্যটি মাপসই হয় I'm আমি UILabelপাঠ্যটি মোড়ানোর জন্য নীচের বৈশিষ্ট্যগুলি ব্যবহার করছি ।

myUILabel.lineBreakMode = UILineBreakModeWordWrap;
myUILabel.numberOfLines = 0;

আমি যদি সঠিক দিকে না যাচ্ছি তবে দয়া করে আমাকে জানান। ধন্যবাদ।



নীচে সুইফ্ট সংস্করণ: stackoverflow.com/a/33945342/1634890
জুয়ান বোয়েরো

উত্তর:


409

sizeWithFont constrainedToSize:lineBreakMode:ব্যবহার করার পদ্ধতি। এটি কীভাবে ব্যবহার করবেন তার উদাহরণ নীচে:

//Calculate the expected size based on the font and linebreak mode of your label
// FLT_MAX here simply means no constraint in height
CGSize maximumLabelSize = CGSizeMake(296, FLT_MAX);

CGSize expectedLabelSize = [yourString sizeWithFont:yourLabel.font constrainedToSize:maximumLabelSize lineBreakMode:yourLabel.lineBreakMode];   

//adjust the label the the new height.
CGRect newFrame = yourLabel.frame;
newFrame.size.height = expectedLabelSize.height;
yourLabel.frame = newFrame;

এটি 9999 ব্যবহার করে, আপনি কীভাবে এটি টেক্সটে নমনীয় করবেন?
কোয়ান্টাম্পোটাটো

1
@ কোয়ান্টাম্পোট্যাটো 9999 কেবলমাত্র স্থান গ্রহণের ক্ষেত্রে পাঠ্য সর্বাধিক স্থান গ্রহণের অনুমতি রয়েছে। আপনার ইউআইয়ের জন্য কাজ করে এমন কোনও নম্বর আপনি ব্যবহার করতে পারেন।
পাইজামসাম

9
আপনি যদি নিজের লেবেলগুলির আকার এইভাবে রাখছেন তবে আপনি এটি ভুল করছেন । আপনার ব্যবহার করা উচিত [label sizeToFit]
মারিওন আর্নে

5
ভুলে যাবেন না, sizeWithFontiOS এ 7. অবচিত stackoverflow.com/questions/18897896/...
attomos

7
এটি অবচয়;
এমএসএমকিউ

242

আপনি সঠিক পথে যাচ্ছিলেন আপনাকে যা করতে হবে তা হ'ল:

myUILabel.numberOfLines = 0;
myUILabel.text = @"Enter large amount of text here";
[myUILabel sizeToFit];

5
মাপার জন্য আকারটি হ'ল আমার পাঠ্যটি মোড়ানোর জন্য ঠিক যা প্রয়োজন ছিল তা দীর্ঘ, আমার ইউআইএলএবেল.লাইনব্র্যাকমোড = ইউআইলাইনব্রেইকমোড ওয়ার্ড র‌্যাপ; myUILabel.numberOfLines = 0;
জ্যাক BeNimble

2
উত্তরের হিসাবে চিহ্নিত হিসাবে একটি সহজ সমাধান সঠিকভাবে কাজ করে works
স্মারকগুলি

4
@ ইন্ডার কুমার রাঠোর - আমি এটি সর্বদা একাধিক লাইনের জন্য ব্যবহার করি, সেইজন্য নম্বরটি অফলাইন = 0; আমি অনুমান করি যে এটি প্রথমে প্রিফার্ড প্রস্থটি নির্ধারণ করছে না, তবে আমি ধরে নিয়েছি যে ইতিমধ্যে ইউআইএলবেলটির সূচনা দিয়ে সম্পন্ন হয়েছে।
ডোনালিয়া

@ ডোন .. আমি আপনার পছন্দটি পছন্দ করি না .. আপনি কি এর ফ্রেমের কথা বলছেন ??
ইন্দ্র কুমার রাঠোর

@ ডোনালিয়া, আপনাকে অনেক ধন্যবাদ সমাধানের জন্য আপনার সহজ পদ্ধতির সাহায্যে আমার সমস্যাটিও সমাধান করতে সহায়তা করে।
নাভেদ

44

IOS 6 এ অ্যাপল করার জন্য একটি সম্পত্তি যোগ করেনি UILabel : যে ব্যাপকভাবে লেবেল গতিশীল উল্লম্ব মাপ পরিবর্তনকারী সরলীকৃত preferredMaxLayoutWidth

এই সম্পত্তিটি লাইনব্রেকমোড = এনএসলাইনব্রেইকবাই ওয়ার্ড ওয়ার্যাপিং এবং সাইজ টোফিট পদ্ধতির সাথে একত্রে ব্যবহার করে একটি ইউআইএলবেল উদাহরণটি পুরো পাঠ্যকে সামঞ্জস্য করে সহজেই মাপ দেয়।

আইওএস ডকুমেন্টেশনের একটি উদ্ধৃতি:

পছন্দসইম্যাক্স লেআউটউইথ একটি মাল্টিলাইন লেবেলের জন্য পছন্দের সর্বাধিক প্রস্থ (পয়েন্টে)।

আলোচনা এই বৈশিষ্ট্যটি লেবেলের আকারকে প্রভাবিত করে যখন এতে লেআউট সীমাবদ্ধতা প্রয়োগ করা হয়। বিন্যাসের সময়, পাঠ্যটি এই সম্পত্তি দ্বারা নির্দিষ্ট প্রস্থের বাইরে প্রসারিত হলে অতিরিক্ত পাঠ্য এক বা একাধিক নতুন লাইনে প্রবাহিত হবে, যার ফলে লেবেলের উচ্চতা বৃদ্ধি পাবে।

একটি নমুনা:

...
UILabel *status = [[UILabel alloc] init];
status.lineBreakMode = NSLineBreakByWordWrapping;
status.numberOfLines = 5; // limits to 5 lines; use 0 for unlimited.

[self addSubview:status]; // self here is the parent view

status.preferredMaxLayoutWidth = self.frame.size.width; // assumes the parent view has its frame already set.

status.text = @"Some quite lengthy message may go here…";
[status sizeToFit];
[status setNeedsDisplay];
...

39

কোডের একক লাইন না যুক্ত এই কাজটি পুরোপুরি পরীক্ষা করে দেখুন। (অটোলেআউট ব্যবহার করে)

আমি আপনার প্রয়োজন অনুযায়ী আপনার জন্য একটি ডেমো তৈরি করেছি । নীচের লিঙ্ক থেকে এটি ডাউনলোড করুন,

ইউআইভিউ এবং ইউআইএলবেলকে অটোরেসাইজ করুন

ধাপে ধাপে গাইড: -

পদক্ষেপ 1: - ইউআইভিউতে সীমাবদ্ধতা সেট করুন

1) শীর্ষস্থানীয় 2) শীর্ষ 3) ট্রিলিং (মূল দর্শন থেকে)

এখানে চিত্র বর্ণনা লিখুন

পদক্ষেপ 2: - লেবেল 1 এ সীমাবদ্ধতা সেট করুন

1) শীর্ষস্থানীয় 2) শীর্ষ 3) ট্রেলিং (এটির তত্ত্বাবধান থেকে)

এখানে চিত্র বর্ণনা লিখুন

পদক্ষেপ 3: - লেবেল 2 এ সীমাবদ্ধতা সেট করুন

1) শীর্ষস্থানীয় 2) ট্রেলিং (এটির তত্ত্বাবধান থেকে)

এখানে চিত্র বর্ণনা লিখুন

পদক্ষেপ 4: - বেশিরভাগ ছদ্মবেশী ইউআইভিউ থেকে ইউআইএলবেলকে বন্টন দেয়।

এখানে চিত্র বর্ণনা লিখুন

পদক্ষেপ 5: - (ptionচ্ছিক) সীমাবদ্ধতা UIButton সেট করুন

1) শীর্ষস্থানীয় 2) নীচে 3) চলমান 4) স্থির উচ্চতা (মূল দর্শন থেকে)

এখানে চিত্র বর্ণনা লিখুন

আউটপুট: -

এখানে চিত্র বর্ণনা লিখুন

দ্রষ্টব্য: - আপনি লেবেল সম্পত্তিতে লাইন সংখ্যা = 0 নির্ধারণ করেছেন তা নিশ্চিত করুন।

এখানে চিত্র বর্ণনা লিখুন

আমি আশা করি এই তথ্যটি ইউআইএলবেলের উচ্চতা অনুসারে অটোরিসাইজ ইউআইভিউউ ও টেক্সট অনুসারে ইউলাইবেলকে স্বয়ংক্রিয়রূপে বুঝতে যথেষ্ট হবে।


এবং যদি আপনি হোয়াইট-ব্যাকগ্রাউন্ড ভিউয়ের আওতায় কিছু মতামত পেতে চান? এটির উচ্চতা না দেওয়ার জন্য এসবিতে "এর জন্য বাধা প্রয়োজন: ওয়াই অবস্থান বা উচ্চতা" এর জন্য কয়েকটি লাল রেখা দেখাবে
বোগদান রাজন

এটি সঠিক উত্তর হিসাবে চিহ্নিত করা প্রয়োজন। ইব সাথে সঠিক পথ এটি।
রানা তাল্লাল

অনেক চেষ্টা, কিন্তু এটি প্রশ্নের উত্তর দিচ্ছে না ...
SPQR3

@ এসপিকিউআর 3 কি সমস্যা? এটি প্রচুর লোক এবং এটির কাজকে সূক্ষ্ম করতে সহায়তা করে।
বাদল শাহ

36

প্রোগ্রামযুক্তভাবে এটি করার পরিবর্তে, আপনি ডিজাইনের সময় স্টোরিবোর্ড / এক্সআইবিতে এটি করতে পারেন।

  • সেট UIlabel এর লাইনের সংখ্যা থেকে সম্পত্তি 0 অ্যাট্রিবিউট পরিদর্শক হবে।
  • তারপরে প্রয়োজনীয়তা অনুসারে প্রস্থের সীমাবদ্ধতা / (বা) নেতৃস্থানীয় এবং অনুসরণের সীমাবদ্ধতা সেট করুন।
  • তারপরে ন্যূনতম মান সহ উচ্চতার সীমাবদ্ধতা সেট করুন । পরিশেষে আপনি যে উচ্চতার সীমাবদ্ধতাটি যুক্ত করেছেন তা নির্বাচন করুন এবং আকার পরিদর্শকের মধ্যে পরস্পর বিশিষ্ট পরিদর্শকের পাশে, উচ্চতার সীমাবদ্ধতার সম্পর্কটিকে এর থেকে সমান - আরও বেশি থেকে পরিবর্তন করুন ।

এটি একটি ইউআইটিবেল ভিউ-র কাস্টম xib কক্ষে এম্বেড করা ইউআইএলবেলের পক্ষে কাজ করে।
গ্যাং ফ্যাং

আপনার উত্তর অনুসারে আমি আমার লেবেলে স্থির উচ্চতা নির্ধারণ করেছি এবং লো (250) এ অগ্রাধিকার সেট করেছি এবং ত্রুটিগুলি অদৃশ্য হয়ে যায়। (এর থেকে বড় - বেশি স্থাপনের প্রয়োজন নেই)
হামিদ রেজা আনসারী

15

সাহায্যের জন্য বলছি ধন্যবাদ, এখানে কোডটি চেষ্টা করেছি যা আমার জন্য কাজ করছে

   UILabel *instructions = [[UILabel alloc]initWithFrame:CGRectMake(10, 225, 300, 180)];
   NSString *text = @"First take clear picture and then try to zoom in to fit the ";
   instructions.text = text;
   instructions.textAlignment = UITextAlignmentCenter;
   instructions.lineBreakMode = NSLineBreakByWordWrapping;
   [instructions setTextColor:[UIColor grayColor]];

   CGSize expectedLabelSize = [text sizeWithFont:instructions.font 
                                constrainedToSize:instructions.frame.size
                                    lineBreakMode:UILineBreakModeWordWrap];

    CGRect newFrame = instructions.frame;
    newFrame.size.height = expectedLabelSize.height;
    instructions.frame = newFrame;
    instructions.numberOfLines = 0;
    [instructions sizeToFit];
    [self addSubview:instructions];

2
মাপের সাথে ফন্ট হ্রাস করা হয়।
এমএসএমকিউ

12

উপরে iOS7 এর পূর্ববর্তী এবং iOS7 এর সমাধান

//
//  UILabel+DynamicHeight.m
//  For StackOverFlow
//
//  Created by Vijay on 24/02/14.
//  Copyright (c) 2014 http://Vijay-Apple-Dev.blogspot.com. All rights reserved.
//

#import <UIKit/UIKit.h>

#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v)  ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending)

#define SYSTEM_VERSION_LESS_THAN(v)                 ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedAscending)

#define iOS7_0 @"7.0"

@interface UILabel (DynamicHeight)

/*====================================================================*/

/* Calculate the size,bounds,frame of the Multi line Label */

/*====================================================================*/
/**
 *  Returns the size of the Label
 *
 *  @param aLabel To be used to calculte the height
 *
 *  @return size of the Label
 */

-(CGSize)sizeOfMultiLineLabel;

@end


//
//  UILabel+DynamicHeight.m
//  For StackOverFlow
//
//  Created by Vijay on 24/02/14.
//  Copyright (c) 2014 http://Vijay-Apple-Dev.blogspot.com. All rights reserved.
//

#import "UILabel+DynamicHeight.h"

@implementation UILabel (DynamicHeight)
/*====================================================================*/

/* Calculate the size,bounds,frame of the Multi line Label */

/*====================================================================*/
/**
 *  Returns the size of the Label
 *
 *  @param aLabel To be used to calculte the height
 *
 *  @return size of the Label
 */
-(CGSize)sizeOfMultiLineLabel{

    NSAssert(self, @"UILabel was nil");

    //Label text
    NSString *aLabelTextString = [self text];

    //Label font
    UIFont *aLabelFont = [self font];

    //Width of the Label
    CGFloat aLabelSizeWidth = self.frame.size.width;


    if (SYSTEM_VERSION_LESS_THAN(iOS7_0)) {
        //version < 7.0

        return [aLabelTextString sizeWithFont:aLabelFont
                            constrainedToSize:CGSizeMake(aLabelSizeWidth, MAXFLOAT)
                                lineBreakMode:NSLineBreakByWordWrapping];
    }
    else if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(iOS7_0)) {
        //version >= 7.0

        //Return the calculated size of the Label
        return [aLabelTextString boundingRectWithSize:CGSizeMake(aLabelSizeWidth, MAXFLOAT)
                                              options:NSStringDrawingUsesLineFragmentOrigin
                                           attributes:@{
                                                        NSFontAttributeName : aLabelFont
                                                        }
                                              context:nil].size;

    }

    return [self bounds].size;

}

@end

ইউআইটিএবলভিউকন্ট্রোলারের সাবক্লাসে, আমাকে এই পদ্ধতিটি কোথায় কল করা উচিত?
হোমাম

আপনি যেখানে লেবেলের উচ্চতা গণনা করতে চান তারপরে এই পদ্ধতিটি কল করুন। তারপরে সারণী দর্শনটির উচ্চতা সামঞ্জস্য করুন। সূচি পদ্ধতিতে সারি করার জন্য যেখানে আপনার টেবিলভিউ উচ্চতা রয়েছে। আপনার প্রয়োজন হিসাবে সমস্ত উল্লম্ব লেবেল পাঠ্য গণনা করুন
বিজয়- অ্যাপল- Dev.blogspot.com

বিজয় আকার উইথফন্ট চিত্রিত হয়।
user3182143

10

যেহেতু আকারের সাথে ফন্ট হ্রাস করা হয়েছে আমি তার পরিবর্তে এটি ব্যবহার করি।

এই এক লেবেল নির্দিষ্ট বৈশিষ্ট্য পেতে।

-(CGFloat)heightForLabel:(UILabel *)label withText:(NSString *)text{

    NSAttributedString *attributedText = [[NSAttributedString alloc] initWithString:text attributes:@{NSFontAttributeName:label.font}];
    CGRect rect = [attributedText boundingRectWithSize:(CGSize){label.frame.size.width, CGFLOAT_MAX}
                                           options:NSStringDrawingUsesLineFragmentOrigin
                                           context:nil];

    return ceil(rect.size.height);
}

6

এখানে একটি বিভাগ সংস্করণ:

UILabel + AutoSize.h # গুরুত্বপূর্ণ

@interface UILabel (AutoSize)

- (void) autosizeForWidth: (int) width;

@end

UILabel + + AutoSize.m

#import "UILabel+AutoSize.h"

@implementation UILabel (AutoSize)

- (void) autosizeForWidth: (int) width {
    self.lineBreakMode = UILineBreakModeWordWrap;
    self.numberOfLines = 0;
    CGSize maximumLabelSize = CGSizeMake(width, FLT_MAX);
    CGSize expectedLabelSize = [self.text sizeWithFont:self.font constrainedToSize:maximumLabelSize lineBreakMode:self.lineBreakMode];
    CGRect newFrame = self.frame;
    newFrame.size.height = expectedLabelSize.height;
    self.frame = newFrame;
}

@end

6

আপনি TableViewController's (UITableViewCell *)tableView:cellForRowAtIndexPath নিম্নলিখিত পদ্ধতিতে পদ্ধতি প্রয়োগ করতে পারেন (উদাহরণস্বরূপ):

#define CELL_LABEL_TAG 1

- (UITableViewCell *)tableView:(UITableView *)tableView  cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    NSString *text = @"my long text";

    static NSString *MyIdentifier = @"MyIdentifier";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:MyIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero  reuseIdentifier:identifier] autorelease];
    }

    CGFloat width = [UIScreen mainScreen].bounds.size.width - 50;
    CGFloat height = [self textHeight:text] + 10;
    CGRect frame = CGRectMake(10.0f, 10.0f, width, height);

    UILabel *cellLabel = [[UILabel alloc] initWithFrame:frame];
    cellLabel.tag = CELL_LABEL_TAG;
    cellLabel.textColor = [UIColor blackColor];
    cellLabel.backgroundColor = [UIColor clearColor];
    cellLabel.textAlignment = UITextAlignmentLeft;
    cellLabel.font = [UIFont systemFontOfSize:12.0f];
    [cell.contentView addSubview:cellLabel];
    [cellLabel release];

    return cell;
}

UILabel *label = (UILabel *)[cell viewWithTag:CELL_LABEL_TAG];
label.text = text;
label.numberOfLines = 0;
[label sizeToFit];
return cell;

পাঠ্যের উচ্চতা গণনা করতেও NSStringএর sizeWithFont:constrainedToSize:lineBreakMode:পদ্ধতি ব্যবহার করুন ।


6

UILabel এক্সটেনশন উপর ভিত্তি করে এই উত্তর জন্য সুইফট 4 এবং উপরে

extension UILabel {

    func retrieveTextHeight () -> CGFloat {
        let attributedText = NSAttributedString(string: self.text!, attributes: [NSFontAttributeName:self.font])

        let rect = attributedText.boundingRect(with: CGSize(width: self.frame.size.width, height: CGFloat.greatestFiniteMagnitude), options: .usesLineFragmentOrigin, context: nil)

        return ceil(rect.size.height)
    }

}

যেমন ব্যবহার করা যেতে পারে:

self.labelHeightConstraint.constant = self.label.retrieveTextHeight()

4

এবং যারা আইওএস 8 এ স্থানান্তরিত হচ্ছে তাদের জন্য, সুইফটের জন্য এখানে একটি শ্রেণিবদ্ধকরণ রয়েছে:

extension UILabel {

    func autoresize() {
        if let textNSString: NSString = self.text {
            let rect = textNSString.boundingRectWithSize(CGSizeMake(self.frame.size.width, CGFloat.max),
                options: NSStringDrawingOptions.UsesLineFragmentOrigin,
                attributes: [NSFontAttributeName: self.font],
                context: nil)
            self.frame = CGRectMake(self.frame.origin.x, self.frame.origin.y, self.frame.size.width, rect.height)
        }
    }

}

4

আমার পক্ষে সবচেয়ে সহজ এবং সর্বোত্তম উপায়টি হ'ল লেবেলের জন্য উচ্চতার সীমাবদ্ধতা প্রয়োগ করা এবং স্টোরিবোর্ডে কমকে (অর্থাৎ 250) অগ্রাধিকার সেট করা ।

সুতরাং আপনাকে স্টোরিবোর্ডের জন্য উচ্চতা এবং প্রস্থের প্রোগ্রামিক্যালি গণনা সম্পর্কে চিন্তা করার দরকার নেই।


এটা xibs সঙ্গে কাজ করবে?
জয়ন্ত কাঁচাট

4

ইউআইএলবেলের গতিশীল উচ্চতা গণনা করার জন্য আমার পদ্ধতি।

    let width = ... //< width of this label 
    let text = ... //< display content

    label.numberOfLines = 0
    label.lineBreakMode = .byWordWrapping
    label.preferredMaxLayoutWidth = width

    // Font of this label.
    //label.font = UIFont.systemFont(ofSize: 17.0)
    // Compute intrinsicContentSize based on font, and preferredMaxLayoutWidth
    label.invalidateIntrinsicContentSize() 
    // Destination height
    let height = label.intrinsicContentSize.height

কাজ করতে মোড়ানো:

func computeHeight(text: String, width: CGFloat) -> CGFloat {
    // A dummy label in order to compute dynamic height.
    let label = UILabel()

    label.numberOfLines = 0
    label.lineBreakMode = .byWordWrapping
    label.font = UIFont.systemFont(ofSize: 17.0)

    label.preferredMaxLayoutWidth = width
    label.text = text
    label.invalidateIntrinsicContentSize()

    let height = label.intrinsicContentSize.height
    return height
}

3

আপডেট পদ্ধতি

+ (CGFloat)heightForText:(NSString*)text font:(UIFont*)font withinWidth:(CGFloat)width {

    CGSize constraint = CGSizeMake(width, 20000.0f);
    CGSize size;

    CGSize boundingBox = [text boundingRectWithSize:constraint
                                                  options:NSStringDrawingUsesLineFragmentOrigin
                                               attributes:@{NSFontAttributeName:font}
                                                  context:nil].size;

    size = CGSizeMake(ceil(boundingBox.width), ceil(boundingBox.height));

    return size.height;
}

3

উদ্দেশ্য-সি ব্যবহার করে ইউআইএলবেল উচ্চতা পেতে কোডের এই এক লাইন:

labelObj.numberOfLines = 0;
CGSize neededSize = [labelObj sizeThatFits:CGSizeMake(screenWidth, CGFLOAT_MAX)];

এবং .Hight ব্যবহার করে আপনি নীচের হিসাবে লেবেলের উচ্চতা পাবেন:

neededSize.height

সেরা বর্তমান উত্তর।
মাইক

3

আপনি নীচের কোড ব্যবহার করে উচ্চতা পেতে পারেন

আপনাকে পাস করতে হবে

  1. পাঠ্য 2. ফন্ট 3. লেবেল প্রস্থ

    func heightForLabel(text: String, font: UIFont, width: CGFloat) -> CGFloat {
    
       let label:UILabel = UILabel(frame: CGRect(x: 0, y: 0, width: width, height: CGFloat.greatestFiniteMagnitude))
       label.numberOfLines = 0
       label.lineBreakMode = NSLineBreakMode.byWordWrapping
       label.font = font
       label.text = text
       label.sizeToFit()
    
       return label.frame.height
    }

2

এই পোস্টের জন্য ধন্যবাদ। এটি আমাকে একটি দুর্দান্ত চুক্তিতে সহায়তা করেছিল। আমার ক্ষেত্রে আমি পৃথক দর্শন নিয়ামকটিতেও পাঠ্য সম্পাদনা করছি। আমি লক্ষ্য করেছি যে আমি যখন ব্যবহার করি:

[cell.contentView addSubview:cellLabel];

টেবিলের ভিউ: সেলফোর্ডআউটইন্টেক্সপথ: পদ্ধতিটি যে প্রতিবার আমি যখন ঘরে সম্পাদনা করতাম তখন লেবেল ভিউটি পূর্ববর্তী দর্শনের শীর্ষে নিয়মিতভাবে রেন্ডার করা হত। পাঠ্যটি পিক্সिलेটেড হয়ে গেছে এবং যখন কোনও কিছু মুছে ফেলা বা পরিবর্তন করা হয়েছিল, তখন পূর্ববর্তী সংস্করণটি নতুন সংস্করণে প্রদর্শিত হয়েছিল। আমি কীভাবে সমস্যার সমাধান করেছি তা এখানে:

if ([[cell.contentView subviews] count] > 0) {
    UIView *test = [[cell.contentView subviews] objectAtIndex:0];
    [test removeFromSuperview];
}
[cell.contentView insertSubview:cellLabel atIndex:0];

আর অদ্ভুত লেয়ারিং নেই। এটি পরিচালনা করার আরও ভাল উপায় যদি থাকে তবে দয়া করে আমাকে জানান।


2
UILabel *itemTitle = [[UILabel alloc] initWithFrame:CGRectMake(10.0f, 10,100, 200.0f)];
itemTitle.text = @"aseruy56uiytitfesh";
itemTitle.adjustsFontSizeToFitWidth = NO;
itemTitle.autoresizingMask = UIViewAutoresizingFlexibleWidth;
itemTitle.font = [UIFont boldSystemFontOfSize:18.0];
itemTitle.textColor = [UIColor blackColor];
itemTitle.shadowColor = [UIColor whiteColor];
itemTitle.shadowOffset = CGSizeMake(0, 1);
itemTitle.backgroundColor = [UIColor blueColor];
itemTitle.lineBreakMode = UILineBreakModeWordWrap;
itemTitle.numberOfLines = 0;
[itemTitle sizeToFit];
[self.view addSubview:itemTitle];

এটিকে এখানে সমস্ত বৈশিষ্ট্য লেবেলে ব্যবহার করা হয় এবং আইটেম টাইটেল টেক্সট হিসাবে পাঠ্য বাড়িয়ে এটি পরীক্ষা করে

itemTitle.text = @"diofgorigjveghnhkvjteinughntivugenvitugnvkejrfgnvkhv";

এটি আপনার প্রয়োজন অনুযায়ী পারফেক্ট উত্তরটি প্রদর্শন করবে


2

আপনি এটি একটি পদ্ধতি হিসাবেও ব্যবহার করতে পারেন। @ পাইজামসাম অনেক সত্য তাই আমি কেবল এর পদ্ধতি তৈরি করছি। এটি অন্য কারও জন্য সহায়ক হতে পারে

-(CGRect)setDynamicHeightForLabel:(UILabel*)_lbl andMaxWidth:(float)_width{
    CGSize maximumLabelSize = CGSizeMake(_width, FLT_MAX);

    CGSize expectedLabelSize = [_lbl.text sizeWithFont:_lbl.font constrainedToSize:maximumLabelSize lineBreakMode:_lbl.lineBreakMode];

    //adjust the label the the new height.
    CGRect newFrame = _lbl.frame;
    newFrame.size.height = expectedLabelSize.height;
    return newFrame;
}

এবং ঠিক এটি সেট করুন

label.frame = [self setDynamicHeightForLabel:label andMaxWidth:300.0];

2

সুইফট 3-এ এটি করার জন্য কোডটি নিম্নলিখিত:

 let labelSizeWithFixedWith = CGSize(width: 300, height: CGFloat.greatestFiniteMagnitude)
            let exactLabelsize = self.label.sizeThatFits(labelSizeWithFixedWith)
            self.label.frame = CGRect(origin: CGPoint(x: 20, y: 20), size: exactLabelsize)

2

উপরের উত্তর যুক্ত করা:

স্টোরিবোর্ডের মাধ্যমে এটি সহজেই অর্জন করা যায়।

  1. ইউআইএলবেলের জন্য সীমাবদ্ধতা সেট করুন my (আমার ক্ষেত্রে আমি উপরে, বাম এবং স্থির প্রস্থটি করেছি)
  2. অ্যাট্রিবিউট ইন্সপেক্টরটিতে লাইন সংখ্যা 0 তে সেট করুন
  3. অ্যাট্রিবিউট ইন্সপেক্টরটিতে ওয়ার্ড র‌্যাপে লাইন ব্রেক সেট করুন ।

ইউআইএলবেল উচ্চতা সামঞ্জস্য করুন


1

একটি লাইন ক্রিস উত্তর ভুল।

newFrame.size.height = maximumLabelSize.height;

হতে হবে

newFrame.size.height = expectedLabelSize.height;

তা ছাড়া এটি সঠিক সমাধান।


1

অবশেষে, এটি কাজ করে। তোমাদেরকে ধন্যবাদ.

আমি এটি কাজ করতে পারছিলাম না কারণ আমি heightForRowAtIndexPathপদ্ধতিটিতে লেবেলের আকার পরিবর্তন করার চেষ্টা করছিলাম :

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath

এবং (হ্যাঁ মূর্খ আমাকে), আমি cellForRowAtIndexPathপদ্ধতিতে ডিফল্ট হিসাবে লেবেলটিকে পুনরায় আকার দিচ্ছিলাম - আমি আগে লেখা কোডটি উপেক্ষা করছি:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

1
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    cellIdentifier = @"myCell";
    cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
    cell.myUILabel.lineBreakMode = UILineBreakModeWordWrap;        
    cell.myUILabel.numberOfLines = 0;
    cell.myUILabel.text = @"Some very very very very long text....."
    [cell.myUILabel.criterionDescriptionLabel sizeToFit];    
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [self tableView:tableView cellForRowAtIndexPath:indexPath];
    CGFloat rowHeight = cell.myUILabel.frame.size.height + 10;

    return rowHeight;    
}

2
আপনার সমাধান কীভাবে ওপি'র সমস্যা সমাধান করে তাতে আপনি কিছু ব্যাখ্যা যুক্ত করতে পারেন?

1
আপনি ইউআইটিএবলভিউসেল * সেল = জিজ্ঞাসা করতে পারবেন না [স্ব টেবিলভিউ: টেবিলভিউ সেলফোরউআউটআইডেক্সপথ: সূচিপথ]; উচ্চতার জন্যরোআউট ইন্ডেক্সপথ, আপনি জিও টি এবং অসীম লুপ করবেন
পিটার লাপিসু

1
NSString *str = @"Please enter your text......";
CGSize lblSize = [str sizeWithFont:[UIFont systemFontOfSize:15] constrainedToSize: CGSizeMake(200.0f, 600.0f) lineBreakMode: NSLineBreakByWordWrapping];

UILabel *label = [[UILabel alloc]init];
label.frame = CGRectMake(60, 20, 200, lblSize.height);
label.numberOfLines = 0;
label.lineBreakMode = NSLineBreakByWordWrapping;
label.font = [UIFont systemFontOfSize:15];
label.text = str;
label.backgroundColor = [UIColor clearColor];
[label sizeToFit];
[self.view addSubview:label];

1

আমার কোড:

UILabel *label      = [[UILabel alloc] init];
label.numberOfLines = 0;
label.lineBreakMode = NSLineBreakByWordWrapping;
label.text          = text;
label.textAlignment = NSTextAlignmentCenter;
label.font          = [UIFont fontWithName:_bodyTextFontFamily size:_bodyFontSize];

CGSize size = [label sizeThatFits:CGSizeMake(width, MAXFLOAT)];


float height        = size.height;
label.frame         = CGRectMake(x, y, width, height);

1

এই পদ্ধতিটি নিখুঁত উচ্চতা দেবে

-(float) getHeightForText:(NSString*) text withFont:(UIFont*) font andWidth:(float) width{
CGSize constraint = CGSizeMake(width , 20000.0f);
CGSize title_size;
float totalHeight;


title_size = [text boundingRectWithSize:constraint
                                options:NSStringDrawingUsesLineFragmentOrigin
                             attributes:@{ NSFontAttributeName : font }
                                context:nil].size;

totalHeight = ceil(title_size.height);

CGFloat height = MAX(totalHeight, 40.0f);
return height;
}

স্পষ্ট বৈশিষ্ট্য ছাড়াই অন্য কোথাও থেকে সামগ্রী অনুলিপি করবেন না। এটি চৌর্যবৃত্তি হিসাবে দেখা হয়। দেখুন stackoverflow.com/help/referencing ( stackoverflow.com/a/25158206/444991 )।
ম্যাট

1

সুইফট 2:

    yourLabel.text = "your very long text"
    yourLabel.numberOfLines = 0
    yourLabel.lineBreakMode = NSLineBreakMode.ByWordWrapping
    yourLabel.frame.size.width = 200
    yourLabel.frame.size.height = CGFloat(MAXFLOAT)
    yourLabel.sizeToFit()

আকর্ষণীয় রেখাগুলি সর্বাধিক ভাসমানটিতে sizeToFit()সেট frame.size.heightকরার সাথে একত্রে রয়েছে , এটি দীর্ঘ পাঠ্যের জন্য জায়গা দেবে, তবে sizeToFit()এটি কেবল প্রয়োজনীয়টি ব্যবহার করতে বাধ্য করবে, তবে সেটটি সেট করার পরে সর্বদা এটি কল করে .frame.size.height

আমি .backgroundColorডিবাগ উদ্দেশ্যে একটি সেট করার পরামর্শ দিচ্ছি , আপনি প্রতিটি কেসটির জন্য ফ্রেমটি রেন্ডার করা দেখতে পাচ্ছেন।


1
yourLabel.frame.heightএকমাত্র সম্পত্তি হ'ল
ফিল হাডসন

2
আপনার লেবেল.ফ্রেম.সাইজ.উইথ এবং আপনার লেবেল.ফ্রেম.সাইজ.হাইটটি কেবল পাশাপাশি পড়া হয়
CalZone

1
myLabel.text = "your very long text"
myLabel.numberOfLines = 0
myLabel.lineBreakMode = NSLineBreakMode.ByWordWrapping

উপরে বাম নীচের ডান সহ স্টোরিবোর্ডে ইউআইএলএল জন্য সীমাবদ্ধতাগুলি সেট করুন

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