UILabel - পাঠ্য মাপসই স্বয়ংক্রিয় আকারের লেবেল?


144

এতে থাকা পাঠ্যটিকে ফিট করার জন্য কি ইউআইএলবেল বাক্স / সীমানাকে স্বয়ংক্রিয় আকার দেওয়া সম্ভব? (এটি যদি দেখায় না এটি প্রদর্শন থেকে বড় হয়ে যায়)

সুতরাং যদি কোনও ব্যবহারকারী "হ্যালো" বা "আমার নামটি সত্যিই দীর্ঘ হয় আমি এটি এই বাক্সে ফিট করতে চাই", এটি কখনও ছাঁটা হয় না এবং সেই অনুসারে লেবেলটি আরও প্রশস্ত করা হয়?


যে কেউ দয়া করে আমাকে
সুইফ্ট

উত্তর:


98

দয়া করে আমার সংক্ষিপ্তসারটি দেখুন যেখানে আমি UILabelখুব অনুরূপ কোনও UILabelকিছুর জন্য বিভাগ তৈরি করেছি , আমার বিভাগটি সমস্ত সামগ্রী দেখানোর জন্য উচ্চতাটিকে প্রসারিত করতে দেয় : https://gist.github.com/1005520

অথবা এই পোস্টটি দেখুন: https://stackoverflow.com/a/7242981/662605

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

@implementation UILabel (dynamicSizeMeWidth)

- (void)resizeToStretch{
    float width = [self expectedWidth];
    CGRect newFrame = [self frame];
    newFrame.size.width = width;
    [self setFrame:newFrame];
}

- (float)expectedWidth{
    [self setNumberOfLines:1];

    CGSize maximumLabelSize = CGSizeMake(CGRectGetWidth(self.bounds), CGFLOAT_MAX);

    CGSize expectedLabelSize = [[self text] sizeWithFont:[self font] 
                                            constrainedToSize:maximumLabelSize
                                            lineBreakMode:[self lineBreakMode]]; 
    return expectedLabelSize.width;
}

@end

আপনি আরও সহজভাবে ক্লাস sizeToFitথেকে উপলব্ধ পদ্ধতিটি ব্যবহার করতে পারেন তবে UIViewনিরাপদ থাকার জন্য লাইনের সংখ্যা 1 সেট করে।


আইওএস 6 আপডেট

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


আইওএস 8 আপডেট

sizeWithFont:অবচয় করা হয়েছে তাই sizeWithAttributes:পরিবর্তে ব্যবহার করুন:

- (float)expectedWidth{
    [self setNumberOfLines:1];

    CGSize expectedLabelSize = [[self text] sizeWithAttributes:@{NSFontAttributeName:self.font}];

    return expectedLabelSize.width;
}

8
আইওএস 6 অটোলআউট পদ্ধতিটি ব্যবহার করে আমি আমার লেবেলের উচ্চতার প্রতিবন্ধকতাটি শেষ করেছিলাম rid উচ্চতর সীমাবদ্ধতার সম্পর্কটিকে 'বৃহত্তর থান বা সমান' তে সেট করার ফলে উচ্চতা বাড়তে দেওয়া হয়েছিল।
মাইকেল লুটন

2
মাপের ফন্ট: সীমাবদ্ধ টোসাইজ: লাইনব্র্যাকমোড: পদ্ধতিটি আইওএস 7
বর্ণিত

1
পাঠ্য কম / বেশি হলে ইউআইএলবেল নিজেকে পুনরায় আকার দিচ্ছে না। আমি অটো-লেআউট ব্যবহার করছি। ইউআইএলবেল তৈরির চেষ্টা করা হলেও সেগুলি তৈরি করা হয় সেলফোরআরএটআইডেক্স সূচনা করা হয় cell প্রচুর জিনিস চেষ্টা করেছেন। আমার পক্ষে কিছুই কাজ করছে না। ইউলাবেলের পটভূমি একই প্রস্থ নেয়। সহায়তা !!!
কোরডিভিওস

@ ড্যানিয়েল আমি লাইনের সংখ্যা = 0 নির্ধারণ করেছি, তবে এটি কার্যকর নয়। আমি অনুভূমিক এবং উল্লম্বভাবে কেন্দ্রের সীমাবদ্ধতাগুলি সেট করেছি। আমার করা একটি অতিরিক্ত জিনিস হ'ল ইউআইবিএবেলের একটি সাবক্লাস তৈরি করা এবং এটি Lab লেবেলের জন্য এটি ব্যবহার করা
জস্মিত

অটলেআউটের সহজ সমাধান সহ: (1) লাইনগুলিকে 0 তে সেট করুন, (2) কনস্ট্যান্ট 0 দিয়ে "বৃহত্তর থান বা সমান" প্রস্থের সীমাবদ্ধতা নির্ধারণ করুন, (3) ধ্রুবক 0, "বৃহত্তর থান বা সমান" এ উচ্চতা সীমাবদ্ধ করুন ৪) আপনি সাধারণত যেমনটি করতেন তেমনভাবে সারিবদ্ধ করুন, উদাহরণস্বরূপ অনুভূমিকভাবে এবং উল্লম্বভাবে কেন্দ্র করে।
এরিক ভ্যান ডের নিউট

76

ব্যবহার [label sizeToFit];থেকে ড্যানিয়েলস শ্রেণী একই ফলাফল অর্জন করবে।

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


3
সুইফ্টটি ব্যবহার করার সময় আমাকে এটিকে ডিসপ্যাচ_সি্যানসি (ডিসপ্যাচ_জেট_মাইন_ইউ (), {}) ব্যবহার করে মূল থ্রেডে চালাতে হয়েছিল;
জিৎ

@ জিজার আপনি জানেন কেন?
ফুর্লোস্কে

13
@ ফারলোএসকে ইউআই-তে কোনও পরিবর্তন অবশ্যই মূল থ্রেডে করা উচিত।
গিলহর্মে টরেস কাস্ত্রো

32

আমরা যদি এটি চাই UILabel এটি পাঠ্য আকারের উপর ভিত্তি করে সঙ্কুচিত এবং প্রসারিত হওয়া তবে অটোলেআউট সহ স্টোরিবোর্ড সেরা বিকল্প। এটি অর্জনের পদক্ষেপগুলি নীচে দেওয়া হল

ধাপ

  1. ইউআইএলবেলকে দৃশ্যের নিয়ামক হিসাবে রাখুন এবং যেখানেই চান সেখানে এটি রাখুন। এছাড়াও করা 0জন্য numberOfLinesসম্পত্তি UILabel

  2. এটিকে শীর্ষ, শীর্ষস্থানীয় এবং ট্রেলিং স্পেস পিনের সীমাবদ্ধতা দিন।

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

  1. এখন এটি সতর্কতা দেবে, হলুদ তীরটিতে ক্লিক করুন।

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

  1. ক্লিক করুন Update Frameএবং ক্লিক করুন Fix Misplacement। পাঠ্য কম থাকলে এই ইউআইএলবেল সঙ্কুচিত হবে এবং পাঠ্য বেশি থাকলে প্রসারিত হবে।

1
আমি স্থানীয়করণের জন্য পরীক্ষা করিনি, তবে এটির জন্য এটিও কাজ করা উচিত।
যোগেশ সুথার

2
আমি "পছন্দের প্রস্থ" "সুস্পষ্ট" চেকবক্সটি পরীক্ষা না করা পর্যন্ত এটি কোনও বিদ্যমান প্রকল্পের সাথে কাজ করতে পারিনি, তবে এটি সব ঠিকঠাক হয়ে গেছে।
zorro2b

25

এটি অন্যান্য উত্তরগুলির মতো এটি জটিল নয়।

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

বাম এবং উপরের প্রান্তটি পিন করুন

লেবেলের বাম এবং উপরের অংশগুলিকে পিন করতে সীমাবদ্ধতা যুক্ত করতে কেবল অটো লেআউট ব্যবহার করুন।

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

এরপরে এটি স্বয়ংক্রিয়ভাবে আকার পরিবর্তন করবে।

মন্তব্য

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

    import UIKit
    class ViewController: UIViewController {
    
        @IBOutlet weak var myLabel: UILabel!
    
        @IBAction func changeTextButtonTapped(sender: UIButton) {
            myLabel.text = "my name is really long i want it to fit in this box"
        }
    }
  • আপনি যদি নিজের লেবেলটি মোড়ানো করতে চান তবে আইবিতে 0 টি রেখার সংখ্যা সেট করুন এবং কোডটিতে যুক্ত করুন myLabel.preferredMaxLayoutWidth = 150 // or whatever। (আমি লেবেলের নীচে আমার বোতামটিও পিন করে রেখেছি যাতে লেবেলের উচ্চতা বৃদ্ধি পেলে এটি নীচে নেমে যায়))

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

  • আপনি যদি কোনওটির ভিতরে গতিশীল আকারের লেবেলগুলির সন্ধান করেন UITableViewCellতবে এই উত্তরটি দেখুন

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


হাই, আমি আকার পরিবর্তিত লেবেল পেয়েছি কিন্তু ঘরের উচ্চতার আকার কীভাবে পরিবর্তন করা যায় তা আমি বুঝতে পারি না। আপনি কি দয়া করে আমাকে জানাতে পারেন কীভাবে ঘরের উচ্চতার আকার পরিবর্তন করতে হয়।
বিবেক

@ ভিভেক, যতক্ষণ না আপনার উচ্চতায় কোনও বাধা নেই, এটি স্বয়ংক্রিয়ভাবে আকার পরিবর্তন করতে হবে।
সুরগাচ

হ্যাঁ, তবে কীভাবে সম্ভব যখন আমি কাস্টম সেল ব্যবহার করি এবং আমি তার ঘরে 2 টি লেবেল রাখি।
বিবেক

@ বিবেক, দুঃখিত, আমি আপনার প্রশ্নটি ভুলভাবে লিখেছি। আপনি ইতিমধ্যে এই উত্তরটি দিয়ে কাজ করার জন্য একটি লেবেল পেয়েছেন ?
সুরগাচ


5

আমি উপরে ড্যানিয়েলের উত্তর ভিত্তিক কিছু পদ্ধতি তৈরি করেছি।

-(CGFloat)heightForLabel:(UILabel *)label withText:(NSString *)text
{
    CGSize maximumLabelSize     = CGSizeMake(290, FLT_MAX);

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

    return expectedLabelSize.height;
}

-(void)resizeHeightToFitForLabel:(UILabel *)label
{
    CGRect newFrame         = label.frame;
    newFrame.size.height    = [self heightForLabel:label withText:label.text];
    label.frame             = newFrame;
}

-(void)resizeHeightToFitForLabel:(UILabel *)label withText:(NSString *)text
{
    label.text              = text;
    [self resizeHeightToFitForLabel:label];
}

5

আমি আমার পরিস্থিতিটির জন্য যা কাজ করছি তা এখানে:

1) ইউআইএলবেলের উচ্চতাতে অটোলেআউট ব্যবহার করে>> 0 0 সীমাবদ্ধতা রয়েছে। প্রস্থ স্থির করা হয়েছে। 2) পাঠ্যটি ইউআইএলবেলে বরাদ্দ করুন, যার ইতিমধ্যে সেই সময়ে একটি তদারকি রয়েছে (এটি কতটা জরুরি তা নিশ্চিত নয়)। 3) তারপরে, করুন:

    label.sizeToFit()
    label.layoutIfNeeded()

লেবেলের উচ্চতা এখন যথাযথভাবে সেট করা আছে।


3
@implementation UILabel (UILabel_Auto)

- (void)adjustHeight {

    if (self.text == nil) {
        self.frame = CGRectMake(self.frame.origin.x, self.frame.origin.y, self.bounds.size.width, 0);
        return;
    }

    CGSize aSize = self.bounds.size;
    CGSize tmpSize = CGRectInfinite.size;
    tmpSize.width = aSize.width;

    tmpSize = [self.text sizeWithFont:self.font constrainedToSize:tmpSize];

    self.frame = CGRectMake(self.frame.origin.x, self.frame.origin.y, aSize.width, tmpSize.height);
}

@end

এটি বিভাগ পদ্ধতি। ইউিলাবেলের উচ্চতা সামঞ্জস্য করতে এই পদ্ধতিটি কল করার চেয়ে আপনাকে অবশ্যই প্রথমে পাঠ্য সেট করতে হবে।


2

আপনি দুটি উপায় ব্যবহার করে পাঠ্য এবং অন্যান্য সম্পর্কিত নিয়ন্ত্রণ অনুসারে আপনার লেবেলকে আকার দিতে পারেন-

  1. আইওএস 7.0 এবং তারপরের জন্য

    CGSize labelTextSize = [labelText boundingRectWithSize:CGSizeMake(labelsWidth, MAXFLOAT)
                                              options:NSStringDrawingUsesLineFragmentOrigin
                                           attributes:@{
                                                        NSFontAttributeName : labelFont
                                                        }
                                              context:nil].size;

আইওএস 7.0 এর আগে এটি লেবেলের আকার গণনা করতে ব্যবহার করা যেতে পারে

CGSize labelTextSize = [label.text sizeWithFont:label.font 
                            constrainedToSize:CGSizeMake(label.frame.size.width, MAXFLOAT)  
                                lineBreakMode:NSLineBreakByWordWrapping];

// লেবেলটেক্সটহাইটের উপর ভিত্তি করে অন্যান্য নিয়ন্ত্রণগুলি পুনরায় ফ্রেম করুন

CGFloat labelTextHeight = labelTextSize.height;
  1. আপনি যদি UILabel এর উদাহরণে সাইজটোফিট ব্যবহার করতে পারেন তার চেয়ে আপনি যদি লেবেলের পাঠ্যের আকারটি গণনা করতে না চান-

    [label setNumberOfLines:0]; // for multiline label
    [label setText:@"label text to set"];
    [label sizeToFit];// call this to fit size of the label according to text

// এর পরে আপনি অন্যান্য সম্পর্কিত নিয়ন্ত্রণগুলি পুনরায় ফ্রেম করতে লেবেল ফ্রেমটি পেতে পারেন


2
  1. স্টোরিবোর্ডে অনুপস্থিত সীমাবদ্ধতা যুক্ত করুন।
  2. স্টোরিবোর্ডে ইউআইএলবেল নির্বাচন করুন এবং "লাইন" বৈশিষ্ট্যটি 0 তে সেট করুন।
  3. আইডি: লেবেল সহ কন্ট্রোলআরআইএল-এ ইউআইএলবেলকে রেফিট করুন
  4. কন্ট্রোল.আরমি এবং [label sizeToFit];ভিউডিডলড যুক্ত করুন

1

অটো লেআউট নিয়ে আমার একটি বিশাল সমস্যা ছিল। আমাদের টেবিলের ঘরে দুটি ধারক রয়েছে। আইটেমের বিবরণ (0 - 1000 অক্ষর) এর উপর নির্ভর করে দ্বিতীয় ধারকটিকে পুনরায় আকার দেওয়া হয়েছে এবং তাদের ভিত্তিতে সারি পুনরায় আকার দেওয়া উচিত।

অনুপস্থিত উপাদানটি ছিল বিবরণের নীচে বাধা।

আমি গতিশীল উপাদানটির নীচের সীমাবদ্ধতা = 0 থেকে > = 0 থেকে পরিবর্তন করেছি ।


এটি আমার জীবন বাঁচিয়েছিল। যদি আপনি অনুসরণ করার চেষ্টা করছেন: github.com/honghaoz/… এটি সঠিক উত্তর।
জাস্টিন ফাইলেস

0

প্রতিবার ফিট! :)

    name.text = @"Hi this the text I want to fit to"
    UIFont * font = 14.0f;
    CGSize size = [name.text sizeWithAttributes:@{NSFontAttributeName: font}];
    nameOfAssessment.frame = CGRectMake(400, 0, size.width, 44);
    nameOfAssessment.font = [UIFont systemFontOfSize:font];

0

আপনি একটি লাইন আউটপুট প্রদর্শন করতে পারেন তারপরে সম্পত্তি লাইন = 0 সেট করতে পারেন এবং একাধিক লাইন আউটপুট প্রদর্শন করতে পারেন তবে সম্পত্তি লাইন = 1 এবং আরও সেট করুন

[self.yourLableName sizeToFit];

-1

এই পদ্ধতির এছাড়াও আছে:

[self.myLabel changeTextWithAutoHeight:self.myStringToAssignToLabel width:180.0f];

আমিই এই উত্তরটি কে হ্রাস করেছিলাম তা নয় তবে আমি কেবল এটিই নির্দেশ করতে চেয়েছিলাম যে আমি কোনও changeTextWithAutoHeight:width:পদ্ধতি দেখতে পাচ্ছি না UILabel। ইউআইকিট ডকুমেন্টেশনে এই পদ্ধতিটি কোথায় পাওয়া যাবে দয়া করে কোনও লিঙ্ক সরবরাহ করতে পারেন?
আদিল হুসেন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.