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




cocoa-touch uikit (20)

একটি UILabel (একটি গতিশীল টেক্সট দীর্ঘ লাইন) মধ্যে নিম্নলিখিত লেখা আছে বিবেচনা করুন:

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

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

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

আমি ডান দিক শিরোনাম করছি না দয়া করে আমাকে জানাতে। ধন্যবাদ।


Uilabel গতিশীল উচ্চতা গণনা আমার পদ্ধতির।

    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
}

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

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

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

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

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

আপডেট পদ্ধতি

+ (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;
}

আপনি TableViewController's (UITableViewCell *)tableView:cellForRowAtIndexPath প্রয়োগ করতে পারেন (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: ব্যবহার করুন sizeWithFont:constrainedToSize:lineBreakMode: পাঠ্যের উচ্চতা গণনা করার পদ্ধতি।


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

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

  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
    }

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

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

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

সুতরাং আপনি স্টোরেবোর্ড ধন্যবাদ, উচ্চতা এবং প্রস্থ প্রোগ্রামগতভাবে গণনা সম্পর্কে চিন্তা করতে হবে না।


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

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

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

neededSize.height

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

-(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;
}

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

[cell.contentView addSubview:cellLabel];

টেবিলের মধ্যে দেখুন: cellForRowAtIndexPath: যে পদ্ধতিটি যখন আমি সেল সম্পাদন করি তখন পূর্বের দৃশ্যের শীর্ষে লেবেল দৃশ্য ক্রমাগত রেন্ডার করা হয়েছিল। পাঠটি পিক্সেলেট হয়ে ওঠে, এবং যখন কিছু মুছে ফেলা বা পরিবর্তন করা হয়, আগের সংস্করণটি নতুন সংস্করণের অধীনে দৃশ্যমান ছিল। এখানে আমি কিভাবে সমস্যার সমাধান করেছি:

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

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


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

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

এবং যারা iOS 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)
        }
    }

}

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

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

যেহেতু আকার WithFont অব্যবহৃত হয় আমি পরিবর্তে এই এক ব্যবহার।

এই এক লেবেল নির্দিষ্ট গুণাবলী পেতে।

-(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);
}

সুইফট 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)

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;

সুইফ্ট 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() সেট করার সাথে মজাদার লাইন sizeToFit() হয়, এটি দীর্ঘ পাঠ্যের জন্য ঘর দেবে, তবে sizeToFit() এটি কেবল প্রয়োজনীয় ব্যবহার করতে বাধ্য করবে, তবে সর্বদা এটি সেট করার পরে কল করুন .frame.size.height

আমি ডিবাগ উদ্দেশ্যে একটি .backgroundColor সেটিং করার সুপারিশ করি, এইভাবে আপনি প্রতিটি ক্ষেত্রে রেন্ডার করা ফ্রেমটি দেখতে পারেন।


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

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()

-(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;    
}

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];






uilabel