উল্লম্বভাবে একটি UILabel এর মধ্যে শীর্ষে পাঠ্য প্রান্তিককরণ করুন


2175

আমার কাছে UILabelদুটি লাইনের পাঠ্যের জন্য জায়গা রয়েছে। কখনও কখনও, যখন পাঠ্য খুব ছোট হয়, এই পাঠ্যটি লেবেলের উল্লম্ব কেন্দ্রে প্রদর্শিত হবে।

সর্বদা শীর্ষে থাকা অবস্থায় আমি কীভাবে উলম্বভাবে সারিবদ্ধ করব UILabel?

উল্লম্ব কেন্দ্রিক পাঠ্য সহ একটি ইউআইএলবেল উপস্থাপন করা চিত্র image

উত্তর:


2702

এটিতে উল্লম্ব-সারিবদ্ধ সেট করার কোনও উপায় নেই UILabelতবে আপনি লেবেলের ফ্রেম পরিবর্তন করে একই প্রভাব পেতে পারেন। আমি আমার লেবেলগুলিকে কমলা করে রেখেছি যাতে আপনি কী ঘটছে তা পরিষ্কার করে দেখতে পারেন।

এটি করার দ্রুত এবং সহজ উপায় এখানে:

    [myLabel sizeToFit];

একটি লেবেল চেপে ধরার জন্য সাইজটিফিট


যদি আপনার কাছে দীর্ঘ পাঠ্যযুক্ত একটি লেবেল থাকে যা একাধিক লাইন তৈরি করে, সেট numberOfLinesকরে 0(এখানে শূন্য মানে সীমাহীন সংখ্যক রেখার লাইন)।

    myLabel.numberOfLines = 0;
    [myLabel sizeToFit];

সাইজটিফিটের সাথে দীর্ঘ লেবেল পাঠ্য


দীর্ঘ সংস্করণ

আমি কোডে আমার লেবেল তৈরি করব যাতে আপনি দেখতে পাচ্ছেন কী চলছে। আপনি ইন্টারফেস বিল্ডারেও এর বেশিরভাগ সেট আপ করতে পারেন। আমার সেটআপটি মার্জিনগুলি দেখানোর জন্য ফটোশপে তৈরি করা ব্যাকগ্রাউন্ড চিত্র সহ একটি ভিউ-ভিত্তিক অ্যাপ্লিকেশন (20 পয়েন্ট)। লেবেলটি একটি আকর্ষণীয় কমলা রঙ যার ফলে আপনি দেখতে পাচ্ছেন যে মাত্রাগুলি নিয়ে কী চলছে।

- (void)viewDidLoad
{
    [super viewDidLoad];

    // 20 point top and left margin. Sized to leave 20 pt at right.
    CGRect labelFrame = CGRectMake(20, 20, 280, 150);
    UILabel *myLabel = [[UILabel alloc] initWithFrame:labelFrame];
    [myLabel setBackgroundColor:[UIColor orangeColor]];

    NSString *labelText = @"I am the very model of a modern Major-General, I've information vegetable, animal, and mineral";
    [myLabel setText:labelText];

    // Tell the label to use an unlimited number of lines
    [myLabel setNumberOfLines:0];
    [myLabel sizeToFit];

    [self.view addSubview:myLabel];
}

ব্যবহারের কিছু সীমাবদ্ধতা sizeToFitকেন্দ্র- বা ডান-প্রান্তযুক্ত পাঠ্যের সাথে খেলতে আসে। যা ঘটে তা এখানে:

    // myLabel.textAlignment = NSTextAlignmentRight;
    myLabel.textAlignment = NSTextAlignmentCenter;

    [myLabel setNumberOfLines:0];
    [myLabel sizeToFit];

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

লেবেলটি এখনও স্থির উপরের-বাম কোণে আকারযুক্ত। আপনি আসল লেবেলের প্রস্থকে একটি ভেরিয়েবলে সংরক্ষণ করতে পারেন এবং এটির পরে সেট করতে পারেন sizeToFitবা এই সমস্যাগুলি মোকাবেলায় একটি নির্দিষ্ট প্রস্থ দিতে পারেন:

    myLabel.textAlignment = NSTextAlignmentCenter;

    [myLabel setNumberOfLines:0];
    [myLabel sizeToFit];

    CGRect myFrame = myLabel.frame;
    // Resize the frame's width to 280 (320 - margins)
    // width could also be myOriginalLabelFrame.size.width
    myFrame = CGRectMake(myFrame.origin.x, myFrame.origin.y, 280, myFrame.size.height);
    myLabel.frame = myFrame;

লেবেল প্রান্তিককরণ


নোটটি sizeToFitআপনার প্রাথমিক লেবেলের সর্বনিম্ন প্রস্থকে সম্মান করবে। আপনি যদি 100 বিস্তৃত লেবেলটি দিয়ে শুরু করেন এবং তাতে কল sizeToFitকরেন, এটি আপনাকে 100 (বা কিছুটা কম) প্রস্থ সহ একটি (সম্ভবত খুব দীর্ঘ) লেবেল দেবে। পুনরায় আকার দেওয়ার আগে আপনি নিজের ন্যূনতম প্রস্থে নিজের লেবেলটি সেট করতে চাইতে পারেন।

ফ্রেমের প্রস্থের আকার পরিবর্তন করে লেবেল প্রান্তিককরণ সংশোধন করুন

আরও কয়েকটি বিষয় লক্ষণীয়:

lineBreakModeসম্মানিত করা হয় কিনা এটি কীভাবে সেট করা যায় তার উপর নির্ভর করে। NSLineBreakByTruncatingTail(ডিফল্ট) পরে sizeToFitঅন্য দুটি কাটা পদ্ধতি (মাথা এবং মাঝারি) উপেক্ষা করা হয়। NSLineBreakByClippingএছাড়াও উপেক্ষা করা হয়। NSLineBreakByCharWrappingযথারীতি কাজ করে ডান দিকের অক্ষরের সাথে মানানসই ফ্রেমের প্রস্থ এখনও সংকীর্ণ।


মার্ক অ্যামেরি মন্তব্যগুলিতে অটো লেআউট ব্যবহার করে এনআইবি এবং স্টোরিবোর্ডগুলির জন্য একটি সমাধান দিয়েছেন:

যদি আপনার লেবেলটি নিল বা স্টোরিবোর্ডে ভিউ কনট্রোলার ব্যবহার করে viewযা অটোলেআউট ব্যবহার করে তার একটি সংক্ষিপ্তসার হিসাবে অন্তর্ভুক্ত করা হয় , তবে আপনার sizeToFitকলটি এতে viewDidLoadকাজ করবে না কারণ অটোলেআউট মাপ এবং অবস্থানের পরে সংক্ষিপ্তসারগুলি viewDidLoadডাকা হবে এবং অবিলম্বে আপনার প্রভাবগুলি পূর্বাবস্থায় ফিরিয়ে আনবে sizeToFitকল করুন। তবে sizeToFitভিতরে থেকে কল করা কাজ viewDidLayoutSubviews করবে


আমার আসল উত্তর (উত্তরোত্তর / রেফারেন্সের জন্য):

স্ট্রিংয়ের জন্য উপযুক্ত ফ্রেমের উচ্চতা গণনা করার জন্য এটি NSStringপদ্ধতিটি ব্যবহার করে sizeWithFont:constrainedToSize:lineBreakMode:, তারপরে উত্স এবং প্রস্থ নির্ধারণ করে।

আপনি যে পাঠ্যটি সন্নিবেশ করতে চান তা ব্যবহার করে লেবেলের জন্য ফ্রেমের আকার পরিবর্তন করুন এই ভাবে আপনি যে কোনও সংখ্যক লাইনের সমন্বয় করতে পারেন।

CGSize maximumSize = CGSizeMake(300, 9999);
NSString *dateString = @"The date today is January 1st, 1999";
UIFont *dateFont = [UIFont fontWithName:@"Helvetica" size:14];
CGSize dateStringSize = [dateString sizeWithFont:dateFont 
        constrainedToSize:maximumSize 
        lineBreakMode:self.dateLabel.lineBreakMode];

CGRect dateFrame = CGRectMake(10, 10, 300, dateStringSize.height);

self.dateLabel.frame = dateFrame;

10
আপনাকে
অটোলেআউটটি

4
এখানে সমস্যা সমাধানের জন্য একটি সহজ উপায় stackoverflow.com/a/26632490/636559
AboulEinein

আপনি যদি অটো লেআউট এবং স্টোরিবোর্ড ব্যবহার করেন, "বিল্ড টাইম রিমুভ করুন" বিকল্পের সাথে সীমাবদ্ধতা যুক্ত করা সহায়তা করবে
জে কে এবিসি

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

3
এই উত্তরটি অহেতুক জটিল এবং এটি একটি "চারপাশে শব্দ" ব্যবহার করছে। দয়া করে আলিঙ্গনীয় বিষয়বস্তু আলিঙ্গন অগ্রাধিকার পরিবর্তন করার নীচের পরামর্শটি দেখুন। কোনও কোডের প্রয়োজন নেই ...
বিট্রি

335
  1. নতুন পাঠ্য সেট করুন:

    myLabel.text = @"Some Text"
  2. maximum number0 (স্বয়ংক্রিয়) এ লাইনের লাইন সেট করুন :

    myLabel.numberOfLines = 0
  3. সর্বোচ্চ আকারে লেবেলের ফ্রেমটি সেট করুন:

    myLabel.frame = CGRectMake(20,20,200,800)
  4. sizeToFitফ্রেমের আকার হ্রাস করার জন্য কল করুন যাতে সামগ্রীগুলি ঠিক ফিট হয়:

    [myLabel sizeToFit]

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

এছাড়াও, আমার লেবেলে শব্দ মোড়ানো সক্ষম রয়েছে।


আরে বেন, আমি কেবল আমার পুরানো কোডটির দিকে আবার তাকালাম এবং প্রয়োজনীয় উত্তরগুলি সঠিক উত্তর দিয়ে আমার উত্তর আপডেট করেছি।
জাকব এগার

এটি আমার পক্ষে ভাল কাজ করেছে। আমি আমার ইউআইএলবেলের মাত্রা নির্ধারণ করেছি এবং আইওবিতে লাইন নম্বর 0 এ পরিণত করেছি এবং তারপরে [মাইবেল সাইজটোফিট] নামক পাঠ্যটি সেট করার পরে।
ড্যান এলিস

এটিআরটি-তে লাইনের সংখ্যা নির্ধারণের পরে, আমার পক্ষে পুরোপুরি কাজ করে। পরিদর্শক
d2burke

সংখ্যা 1 এর বেশি সংখ্যক ক্ষেত্রে কাজ করে না
টম

আপনি দুটি লাইনের লেবেল চাইলে এটি কাজ করে না, তবে পাঠ্যের জন্য আরও বেশি লাইন প্রয়োজন।
হোসে ম্যানুয়েল অ্যাবারকা রদ্রিগেজ

159

এক্সটেনশন সমাধানটি উল্লেখ করে:

for(int i=1; i< newLinesToPad; i++) 
    self.text = [self.text stringByAppendingString:@"\n"];

দ্বারা প্রতিস্থাপন করা উচিত

for(int i=0; i<newLinesToPad; i++)
    self.text = [self.text stringByAppendingString:@"\n "];

প্রতিটি যুক্ত নতুন লাইনে অতিরিক্ত স্থানের প্রয়োজন হয়, কারণ আইফোনের UILabelsপিছনে থাকা গাড়ীর রিটার্ন উপেক্ষা করা হবে বলে মনে হয় :(

একইভাবে, অ্যালাইনবটমকে @" \n@%"জায়গায় "\n@%"পরিবর্তিতভাবে আপডেট করা উচিত (চক্রের সূচনা করার জন্য অবশ্যই "for (int i = 0 ...") দ্বারা প্রতিস্থাপন করতে হবে।

নিম্নলিখিত এক্সটেনশনটি আমার পক্ষে কাজ করে:

// -- file: UILabel+VerticalAlign.h
#pragma mark VerticalAlign
@interface UILabel (VerticalAlign)
- (void)alignTop;
- (void)alignBottom;
@end

// -- file: UILabel+VerticalAlign.m
@implementation UILabel (VerticalAlign)
- (void)alignTop {
    CGSize fontSize = [self.text sizeWithFont:self.font];
    double finalHeight = fontSize.height * self.numberOfLines;
    double finalWidth = self.frame.size.width;    //expected width of label
    CGSize theStringSize = [self.text sizeWithFont:self.font constrainedToSize:CGSizeMake(finalWidth, finalHeight) lineBreakMode:self.lineBreakMode];
    int newLinesToPad = (finalHeight  - theStringSize.height) / fontSize.height;
    for(int i=0; i<newLinesToPad; i++)
        self.text = [self.text stringByAppendingString:@"\n "];
}

- (void)alignBottom {
    CGSize fontSize = [self.text sizeWithFont:self.font];
    double finalHeight = fontSize.height * self.numberOfLines;
    double finalWidth = self.frame.size.width;    //expected width of label
    CGSize theStringSize = [self.text sizeWithFont:self.font constrainedToSize:CGSizeMake(finalWidth, finalHeight) lineBreakMode:self.lineBreakMode];
    int newLinesToPad = (finalHeight  - theStringSize.height) / fontSize.height;
    for(int i=0; i<newLinesToPad; i++)
        self.text = [NSString stringWithFormat:@" \n%@",self.text];
}
@end

তারপরে প্রতিটি আপনার লেবেল পাঠ্য কার্যভারটি কল করুন [yourLabel alignTop];বা তারপরে [yourLabel alignBottom];


@ ডিডিএস আমি লক্ষ্য করেছি যে আপনি VerticalAlignপরে প্রথম বন্ধনী জুড়ছেন @implementation UILabel। অবজেক্টিভ-সি-তে নতুন হওয়ার আগে আমি এই সিনট্যাক্সের আগে আগে দৌড়িনি। এটাকে কি বলে?
জুলিয়ান

আশ্চর্যজনক, বিভাগগুলি সম্পর্কে জানতেন না, এটি আমাকে উদ্দেশ্য-সি ভাষার জন্য আরও বেশি প্রশংসা দেয়। একটি ভাল প্রোগ্রামার হওয়ার জন্য আরও বেশি ভাষা শেখা গুরুত্বপূর্ণ।
জেরোইনইজখফ

একটি upvote দিয়েছেন। তবে প্রথমত এই কাজ করবে না যদি আপনি কোন লাইনের সংখ্যাটি জানেন না যা কোন নেতিবাচক
Tjirp

আমি পাঠ্যটির 3 টি লাইন দেখাব এবং পাঠ্যটিকে শীর্ষে সারিবদ্ধ করব। সুতরাং, আমি কি 3 টি লাইন সেট করে রেখেছি যখন আমি এটি 3 এ সেট করি, আমি যদি পাঠ্য কম ("তবে এটি একটি লাইনে ফিট করে)" "" দেখছি। কীভাবে এটি "..." এড়ানো যায়
সত্যম

1
আমি এই বিভাগটির একটি সম্পাদনা পোস্ট করেছি, আশা করি এটি শীঘ্রই অনুমোদিত হবে। পদ্ধতি sizeWithFont:constrainedToSize:lineBreakMode:এবং আকারবিহীন ফন্ট: উভয়ই আইওএস 7-এ অবমূল্যায়িত। এছাড়াও, এই বিভাগটি কেবলমাত্র লেবেলগুলিতে কাজ করে যখন সংখ্যাটি
অফলাইন

146

শুধু ক্ষেত্রে এটি কারো সাহায্য বা সাহায্যের, আমি একই সমস্যা ছিল কিন্তু কেবল ব্যবহার করা থেকে সুইচিং দ্বারা সমস্যা সমাধানের পেরেছিলেন UILabelব্যবহার করে UITextView। আমি প্রশংসা করি এটি সবার জন্য নয় কারণ কার্যকারিতাটি কিছুটা আলাদা।

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

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


1
অনেকগুলি ইউআইএলবেল পাঠ্য দর্শনে রূপান্তরিত হলে এটি পারফরম্যান্সকে কীভাবে প্রভাব ফেলবে তা নিশ্চিত নয়।
নিনজিনার

2
এই থ্রেডের অন্যান্য সমস্ত সমাধান আইওএস 7 (যে কারণেই হোক না কেন) আমার জন্য কাজ করে নি। তবে কেবল একটি ব্যবহার করে UITextViewআমাকে তাত্ক্ষণিক পছন্দসই ফলাফল দিয়েছে।
ক্লিফটন ল্যাব্রাম

1
এটি একটি কার্যনির্বাহী, এটিকে সত্যিক দেখানোর জন্য এটি এখনও কিছু সামঞ্জস্যের প্রয়োজন, তবে আমি দেখলাম, থাম্বস আপ এটি সবচেয়ে সহজতম কোনও কোড সমাধান নয়।
Itai স্পেক্টর

1
আমি এই সমাধানটি পছন্দ করি। মঞ্জুরি, এখানে পারফরম্যান্সের সমস্যা এবং এগুলি হতে পারে, তুলনামূলকভাবে সহজ দৃষ্টিতে একটি সাধারণ লেবেলের জন্য, এটি আমার যা প্রয়োজন তার জন্য উপযুক্ত (এবং আমি কোনও পারফরম্যান্সের প্রভাব দেখতে পাচ্ছি না)
জে কেটিং 8

1
এই পদ্ধতির একটি ছোট অসুবিধা হ'ল এটি পাঠ্যের অতিরিক্ত অভ্যন্তরীণ প্যাডিং প্রবর্তন করবে। একটি দ্রুত সংশোধন একটি নেতিবাচক বাধা প্রবর্তন করা হয়।
সিরা লাম

122

কোন ঝাঁকুনি নেই, গোলমাল নেই

@interface MFTopAlignedLabel : UILabel

@end


@implementation MFTopAlignedLabel

- (void)drawTextInRect:(CGRect) rect
{
    NSAttributedString *attributedText = [[NSAttributedString alloc]     initWithString:self.text attributes:@{NSFontAttributeName:self.font}];
    rect.size.height = [attributedText boundingRectWithSize:rect.size
                                            options:NSStringDrawingUsesLineFragmentOrigin
                                            context:nil].size.height;
    if (self.numberOfLines != 0) {
        rect.size.height = MIN(rect.size.height, self.numberOfLines * self.font.lineHeight);
    }
    [super drawTextInRect:rect];
}

@end

কোনও মুস, কোনও উদ্দেশ্য-সি, কোনও গোলমাল নয় তবে সুইফট 3:

class VerticalTopAlignLabel: UILabel {

    override func drawText(in rect:CGRect) {
        guard let labelText = text else {  return super.drawText(in: rect) }

        let attributedText = NSAttributedString(string: labelText, attributes: [NSFontAttributeName: font])
        var newRect = rect
        newRect.size.height = attributedText.boundingRect(with: rect.size, options: .usesLineFragmentOrigin, context: nil).size.height

        if numberOfLines != 0 {
            newRect.size.height = min(newRect.size.height, CGFloat(numberOfLines) * font.lineHeight)
        }

        super.drawText(in: newRect)
    }

}

সুইফট 4.2

class VerticalTopAlignLabel: UILabel {

    override func drawText(in rect:CGRect) {
        guard let labelText = text else {  return super.drawText(in: rect) }

        let attributedText = NSAttributedString(string: labelText, attributes: [NSAttributedString.Key.font: font])
        var newRect = rect
        newRect.size.height = attributedText.boundingRect(with: rect.size, options: .usesLineFragmentOrigin, context: nil).size.height

        if numberOfLines != 0 {
            newRect.size.height = min(newRect.size.height, CGFloat(numberOfLines) * font.lineHeight)
        }

        super.drawText(in: newRect)
    }

}

কোনও পার্শ্ব প্রতিক্রিয়া ছাড়াই আমার পক্ষে সুইফ্ট সংস্করণটি কাজ করেছিল! মহান কাজ!
l.vsilev

2
সম্ভবত এখানে সেরা উত্তর, সমস্ত পরিস্থিতিতে কাজ করে। লেবেল ইউআইটিবেলভিউসেলতে থাকলে সাইজ টুফিট কাজ করে না। ভাল কাজ.
রাজত চৌহান

79

উপরের উত্তরটির মতো, তবে এটি বেশ সঠিক ছিল না, বা কোডে চড় মারা সহজ তাই আমি এটিকে কিছুটা পরিষ্কার করে ফেললাম। এই এক্সটেনশনটিকে এটির নিজস্ব .h ও .m ফাইলটিতে যুক্ত করুন বা আপনি যে প্রয়োগটি ব্যবহার করতে চান তার ঠিক উপরে পেস্ট করুন:

#pragma mark VerticalAlign
@interface UILabel (VerticalAlign)
- (void)alignTop;
- (void)alignBottom;
@end


@implementation UILabel (VerticalAlign)
- (void)alignTop
{
    CGSize fontSize = [self.text sizeWithFont:self.font];

    double finalHeight = fontSize.height * self.numberOfLines;
    double finalWidth = self.frame.size.width;    //expected width of label


    CGSize theStringSize = [self.text sizeWithFont:self.font constrainedToSize:CGSizeMake(finalWidth, finalHeight) lineBreakMode:self.lineBreakMode];


    int newLinesToPad = (finalHeight  - theStringSize.height) / fontSize.height;

    for(int i=0; i<= newLinesToPad; i++)
    {
        self.text = [self.text stringByAppendingString:@" \n"];
    }
}

- (void)alignBottom
{
    CGSize fontSize = [self.text sizeWithFont:self.font];

    double finalHeight = fontSize.height * self.numberOfLines;
    double finalWidth = self.frame.size.width;    //expected width of label


    CGSize theStringSize = [self.text sizeWithFont:self.font constrainedToSize:CGSizeMake(finalWidth, finalHeight) lineBreakMode:self.lineBreakMode];


    int newLinesToPad = (finalHeight  - theStringSize.height) / fontSize.height;

    for(int i=0; i< newLinesToPad; i++)
    {
        self.text = [NSString stringWithFormat:@" \n%@",self.text];
    }
}
@end

এবং তারপরে ব্যবহার করতে, আপনার পাঠ্যটিকে লেবেলে রাখুন এবং তারপরে উপযুক্ত করার জন্য উপযুক্ত পদ্ধতিটি কল করুন:

[myLabel alignTop];

অথবা

[myLabel alignBottom];

মাপের সাথে ফন্ট হ্রাস করা হয়েছে
21

68

এটি সম্পাদন করার আরও তাত্পর্যপূর্ণ (এবং জঘন্য) উপায় হ'ল ইউলিবেলের লাইন ব্রেক ব্রেকটি "ক্লিপ" এ সেট করা এবং একটি নির্দিষ্ট পরিমাণ নিউলাইন যোগ করা।

myLabel.lineBreakMode = UILineBreakModeClip;
myLabel.text = [displayString stringByAppendingString:"\n\n\n\n"];

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


3
'ক্লিপ' -তে লাইন ব্রেক ব্রেকটি সেট করা লেবেলটির স্বয়ংক্রিয় আকার নির্ধারণের মধ্যে গোলমাল করছে। UILineBreakModeWordWrapপরিবর্তে ব্যবহার করুন।
নিলস ভ্যান ডের রেস্ট

এবং আরও ভাল স্পেস যোগ করুন "। n \ n"
ডিজেডেন্স

68

স্টোরিবোর্ড ব্যবহার করে সবচেয়ে সহজ পদ্ধতি:

এম্বেড করুন লেবেল মধ্যে StackView এবং সেট অ্যাট্রিবিউট ইন্সপেক্টর মধ্যে StackView দুই বৈশিষ্ট্যাবলী করুন:

1- Axisথেকে Horizontal,

2- AlignmentথেকেTop

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


1
আরও ভাল ফলাফলের জন্য আপনি এই স্ট্যাকভিউ> ভিউ> ইউআইএলবেলটি করতে পারেন, কারণ আপনি যখন কেবল কোনও স্ট্যাকভিউয়ের মধ্যে একটি ইউআইএলবেল এম্বেড করবেন তখন স্ট্যাকভিউ ন্যূনতম আকারে ইউআইএলবেলকে ফিট করতে পারে
ড্যানিয়েল বেল্ট্রামি

UILabelকিছু UIViewসাবক্লাসে রাখার দুর্দান্ত ধারণা (প্লেইন UIViewসাধারণত পর্যাপ্ত পরিমাণে থাকে) এবং সেই লেবেলটি নিচের দিকে বাড়তে দিন। ধন্যবাদ!
ভিক্টর কুচেরা

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

আপনার লেবেলটি নির্বাচিত সহ সম্পাদক-> এম্বেড মেনু কমান্ডের সাহায্যে আপনার জন্য লেবেল সীমাবদ্ধতাগুলি এক্সকোড দ্বারা সাফ হয়ে যায়, আপনি কেবল স্ট্যাকভিউয়ের জন্য সীমাবদ্ধতাগুলি সেট করতে পারেন। এই পদ্ধতির একটি 'সুইফ্টইউআই' লেআউট পদ্ধতির সবচেয়ে কাছাকাছি যা আমি এটি আবিষ্কার করেছি।
রকেট গার্ডেন

কেন এই কাজ করে?
নভেলিজেটর

60

পরিবর্তে UILabelআপনি ব্যবহার করতে পারেন UITextFieldযা উল্লম্ব সারিবদ্ধ বিকল্প রয়েছে:

textField.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter;
textField.userInteractionEnabled = NO; // Don't allow interaction

7
ক্যাভেট: ইউআইটিেক্সটফিল্ড কেবলমাত্র একটি একক লাইনের পাঠ্যকে অনুমতি দেয়।
ডেভিড জেমস

2
ডেভিড জেমস মন্তব্যটি সম্পূর্ণ করতে: ইউআইটিএক্সটভিউ আরও উপযুক্ত হবে
সিড্রিকসৌব্রি

49

আমি এটির সাথে দীর্ঘ সময় ধরে লড়াই করেছি এবং আমি আমার সমাধানটি ভাগ করে নিতে চাই।

এটি আপনাকে এমন একটি দেবে UILabelযা পাঠ্যটিকে 0.5 স্কেলের নীচে অটোশ্রিং করবে এবং পাঠ্যটিকে উল্লম্বভাবে কেন্দ্র করবে। এই বিকল্পগুলি স্টোরিবোর্ড / আইবিতেও উপলব্ধ।

[labelObject setMinimumScaleFactor:0.5];
[labelObject setBaselineAdjustment:UIBaselineAdjustmentAlignCenters];

এটি দেওয়া সমস্ত উত্তরগুলির মধ্যে নিখুঁত হিসাবে কাজ করেছে। ধন্যবাদ @ ডেভিড গ্রিকো। এই বৈশিষ্ট্যগুলির পাশাপাশি, আমরা যদি হ'ল ফন্টসাইজটোফিটউইথকে অ্যাডজাস্টগুলি সেট করে রাখি তবে লেবেলের ফ্রেমটি পরিবর্তন না করেই পাঠ্যটি ফ্রেমে ফিট হবে।
অশোক

43

একটি নতুন ক্লাস তৈরি করুন

LabelTopAlign

.h ফাইল

#import <UIKit/UIKit.h>


@interface KwLabelTopAlign : UILabel {

}

@end

.m ফাইল

#import "KwLabelTopAlign.h"


@implementation KwLabelTopAlign

- (void)drawTextInRect:(CGRect)rect {
    int lineHeight = [@"IglL" sizeWithFont:self.font constrainedToSize:CGSizeMake(rect.size.width, 9999.0f)].height;
    if(rect.size.height >= lineHeight) {
        int textHeight = [self.text sizeWithFont:self.font constrainedToSize:CGSizeMake(rect.size.width, rect.size.height)].height;
        int yMax = textHeight;
        if (self.numberOfLines > 0) {
            yMax = MIN(lineHeight*self.numberOfLines, yMax);    
        }

        [super drawTextInRect:CGRectMake(rect.origin.x, rect.origin.y, rect.size.width, yMax)];
    }
}

@end

সম্পাদন করা

এখানে একটি সরল বাস্তবায়ন যা একই কাজ করে:

#import "KwLabelTopAlign.h"

@implementation KwLabelTopAlign

- (void)drawTextInRect:(CGRect)rect
{
    CGFloat height = [self.text sizeWithFont:self.font
                            constrainedToSize:rect.size
                                lineBreakMode:self.lineBreakMode].height;
    if (self.numberOfLines != 0) {
        height = MIN(height, self.font.lineHeight * self.numberOfLines);
    }
    rect.size.height = MIN(rect.size.height, height);
    [super drawTextInRect:rect];
}

@end

আসল উত্তরের জন্য +1। ভিন্ন sizeToFitসমাধান আসলে এই তোলে UILabelকরা কোনো উপরের টেক্সট, এমনকি যদি আপনি পরিবর্তনশীল একটি লম্বা এক বা তদ্বিপরীত সঙ্গে একটি সংক্ষিপ্ত পাঠ প্রতিস্থাপন করুন।
স্নেকE

38

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

ইন্টারফেস বিল্ডারে

  • সেট UILabelবৃহত্তম সম্ভাব্য পাঠ্যের আকারে
  • সেট Linesবৈশিষ্ট্য পরিদর্শকের '0' তে

আপনার কোডে

  • লেবেলের পাঠ্য সেট করুন
  • sizeToFitআপনার লেবেল কল

টুকিটাকি সংকেতলিপি:

self.myLabel.text = @"Short Title";
[self.myLabel sizeToFit];

দুর্দান্ত কাজ করেছে, আমার ক্ষেত্রে ব্যতীত আমাকে 2-তে লাইন স্থাপনের দরকার ছিল - একটি ইউআইটিবেলভিউসিলের অভ্যন্তরে একটি ইউআইএলবেল থাকতে হবে এবং 0 এ সেট করে এটি ওভারল্যাপ করে দিয়েছে, তবে 2 টিতে সেট করা হয়েছে (সেলটিতে 2 লাইনের জন্য যথেষ্ট জায়গা রয়েছে)
eselk

34

অ্যাডাপটিভ ইউআই (আইওএস 8 বা তার পরে) এর জন্য স্টোরিবোর্ড থেকে ইউআইএলবেলের উল্লম্ব প্রান্তিককরণটি noOfLines= 0` এবং বৈশিষ্ট্য পরিবর্তন করে সেট করতে হবে

সীমাবদ্ধতাসমূহ

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

  2. পরিবর্তন Content Compression Resistance Priority For Vertical= 1000` যাতে উল্লম্ব> অনুভূমিক।

ইউআইএলবেলের সীমাবদ্ধতা

সম্পাদিত:

noOfLines=0

এবং নিম্নলিখিত সীমাবদ্ধতাগুলি পছন্দসই ফলাফল অর্জনের জন্য যথেষ্ট।

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


এটা দুর্দান্ত ছিল। উল্লম্ব> অনুভূমিক কাজটি কেন করেছিল তা আপনি ব্যাখ্যা করতে পারেন? ধন্যবাদ।
গ্যাব্রিয়েল

33

ইউআইএলবেলের একটি সাবক্লাস তৈরি করুন। একটি যাদুমন্ত্র মত কাজ করে:

// TopLeftLabel.h

#import <Foundation/Foundation.h>

@interface TopLeftLabel : UILabel 
{
}

@end

// TopLeftLabel.m

#import "TopLeftLabel.h"

@implementation TopLeftLabel

- (id)initWithFrame:(CGRect)frame 
{
    return [super initWithFrame:frame];
}

- (CGRect)textRectForBounds:(CGRect)bounds limitedToNumberOfLines:(NSInteger)numberOfLines 
{
    CGRect textRect = [super textRectForBounds:bounds limitedToNumberOfLines:numberOfLines];    
    textRect.origin.y = bounds.origin.y;
    return textRect;
}

-(void)drawTextInRect:(CGRect)requestedRect 
{
    CGRect actualRect = [self textRectForBounds:requestedRect limitedToNumberOfLines:self.numberOfLines];
    [super drawTextInRect:actualRect];
}

@end

যেমনটি এখানে আলোচনা করা হয়েছে


27

এই উদ্দেশ্য অর্জনের জন্য আমি একটি ব্যবহার ফাংশন লিখেছি। আপনি একবার দেখে নিতে পারেন:

// শীর্ষের সাথে উল্লম্ব সারিবদ্ধ করতে একটি বহু-লাইন লেবেলের উচ্চতা সামঞ্জস্য করুন
+ (শূন্য) সারিবদ্ধ লেবেলওথ টপ: (ইউআইএলবেল *) লেবেল {
  সিজি সাইজ ম্যাক্স সাইজ = সিজি সাইজমেক (লেবেল.ফ্রেম.সাইজ.উইথথ, 999);
  label.adjustsFontSizeToFitWidth = NO;

  // প্রকৃত উচ্চতা পান
  সিজি সাইজ রিয়েলসাইজ = [লেবেল.টেক্সট সাইজ উইথফোন: লেবেল.ফন্ট কনস্ট্রেইনডটসাইজ: ম্যাক্স সাইজ লাইনব্র্যাকমোড: লেবেল.লাইনব্রেইকমোড];
  সিজিআরেক্ট রেক্ট = লেবেল.ফ্রেম;
  rect.size.height = আসলসাইজ.হাইট;
  label.frame = rect;
}

.ব্যবহারবিধি? (যদি lblHello ইন্টারফেস বিল্ডার দ্বারা তৈরি করা হয়, তাই আমি কিছু ইউআইএবেল বৈশিষ্ট্য বিশদ বিবরণ এড়িয়ে যাই)

lblHello.text = @ "হ্যালো ওয়ার্ল্ড! হ্যালো ওয়ার্ল্ড! হ্যালো ওয়ার্ল্ড! হ্যালো ওয়ার্ল্ড! হ্যালো ওয়ার্ল্ড! হ্যালো ওয়ার্ল্ড! হ্যালো ওয়ার্ল্ড! হ্যালো ওয়ার্ল্ড!";
lblHello.numberOfLines = 5;
[ইউলিটস এলাইনল্যাবললিথথপ: এলবিএলহেলো];

আমি আমার ব্লগে এটি একটি নিবন্ধ হিসাবেও লিখেছি: http://fstoke.me/blog/?p=2819


27

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

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

এখানে, আমি এটির সমাধানের বিকল্প উপায়টি ব্যবহার করেছি, কেবলমাত্র লেবেলের শেষের দিকে নিউলাইনগুলি প্যাড করে (প্লিজ নোট করুন যে আমি আসলে উত্তরাধিকার সূত্রে পেয়েছি UILabel, তবে এটি প্রয়োজনীয় নয়):

CGSize fontSize = [self.text sizeWithFont:self.font];

finalHeight = fontSize.height * self.numberOfLines;
finalWidth = size.width;    //expected width of label

CGSize theStringSize = [self.text sizeWithFont:self.font constrainedToSize:CGSizeMake(finalWidth, finalHeight) lineBreakMode:self.lineBreakMode];

int newLinesToPad = (finalHeight  - theStringSize.height) / fontSize.height;

for(int i = 0; i < newLinesToPad; i++)
{
    self.text = [self.text stringByAppendingString:@"\n "];
}

22

আমি আমার অ্যাপ্লিকেশনটিতে যা করেছি তা হ'ল ইউিলাবেলের লাইন সম্পত্তিটি 0 তে সেট করার পাশাপাশি ইউআইএলবেলের নীচের সীমাবদ্ধতা তৈরি করা এবং নীচের চিত্রটিতে যেমন> = 0 তে সেট করা হচ্ছে তা নিশ্চিত করা। এখানে চিত্র বর্ণনা লিখুন


19

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

@interface TopAlignedLabelContainer : UIView
{
}

@end

@implementation TopAlignedLabelContainer

- (void)layoutSubviews
{
    CGRect bounds = self.bounds;

    for (UILabel *label in [self subviews])
    {
        if ([label isKindOfClass:[UILabel class]])
        {
            CGSize fontSize = [label.text sizeWithFont:label.font];

            CGSize textSize = [label.text sizeWithFont:label.font
                                     constrainedToSize:bounds.size
                                         lineBreakMode:label.lineBreakMode];

            label.numberOfLines = textSize.height / fontSize.height;

            label.frame = CGRectMake(0, 0, textSize.width,
                 fontSize.height * label.numberOfLines);
        }
    }
}

@end


16

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

অটো লেআউটটি এই সমস্যাটিকে বেশ তুচ্ছ করে তোলে। ধরে নিই আমরা লেবেলে যুক্ত করছি UIView *view, নিম্নলিখিত কোডটি এটি সম্পাদন করবে:

UILabel *label = [[UILabel alloc] initWithFrame:CGRectZero];
[label setText:@"Some text here"];
[label setTranslatesAutoresizingMaskIntoConstraints:NO];
[view addSubview:label];

[view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[label]|" options:0 metrics:nil views:@{@"label": label}]];
[view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[label]" options:0 metrics:nil views:@{@"label": label}]];

লেবেলের উচ্চতা স্বয়ংক্রিয়ভাবে গণনা করা হবে (এটি ব্যবহার করে intrinsicContentSize) এবং লেবেলটি শীর্ষের দিকে অনুভূমিকভাবে অবস্থিত হবে view


15

আমি উপরের অনেকগুলি পদ্ধতি ব্যবহার করেছি এবং কেবলমাত্র আমি ব্যবহৃত এবং দ্রুত এবং নোংরা পদ্ধতির যোগ করতে চাই:

myLabel.text = [NSString stringWithFormat:@"%@\n\n\n\n\n\n\n\n\n",@"My label text string"];

নিশ্চিত হয়ে নিন যে স্ট্রিংয়ে থাকা নিউলাইনগুলির সংখ্যা যে কোনও পাঠ্যকে উপলভ্য উল্লম্ব স্থানটি পূরণ করবে এবং UILabel কে কোনও প্রবহমান পাঠকে ছাঁটাই করতে সেট করবে।

কারণ কখনও কখনও যথেষ্ট ভাল যথেষ্ট ভাল


তবে আইওএস ডিভাইসের স্ক্রিনের আকারের উচ্চতার ক্ষেত্রে তার পরিবর্তনের কারণে ইউইলবেল পরিবর্তনের উচ্চতার জন্য অ্যাকাউন্টে '\ n' পরিবর্তনশীল সংখ্যার প্রয়োজন হবে (যা একটি সম্ভাবনা)। সুতরাং এই পদ্ধতিটি দীর্ঘমেয়াদী বিশেষভাবে কার্যকর নয়।
রামবাতিনো

দ্রষ্টব্য: "দ্রুত এবং ময়লা" না "সর্বকালের জন্য নিখুঁত সমাধান" " শুধু Sayin'.
কোড রোডি

2
@ কোডরোডি দ্রুত এবং নোংরা আমার জন্য কৌশলটি করেছে, আসল উত্তরটি নিয়ে আমার বেশ কয়েকটি লেআউট সমস্যা ছিল। আমি এটি "সঠিক উপায়ে" করতে পারি, তবে আমাকে কিছু সময় সাশ্রয় করার জন্য আপনাকে ধন্যবাদ!
সেরফিন হোচার্ট 21

@ ডিগ্যাম্বিত দয়া করে নোট করুন: "দ্রুত এবং নোংরা "
কোড রোডি

1
সাম্প্রতিককালে ভিউগুলি লোড করার সময় আমি কিছু শিখেছি UITextViewসেটি হ'ল dlopenপাঠ্য ইনপুটটিকে সমর্থন করার জন্য এটি কল করতে পারে। এটি ইউআই থ্রেডে বড় ব্যবধান সৃষ্টি করতে পারে, সুতরাং এই পদ্ধতির আরও পারফরম্যান্স!
ইয়ানো

14

আমি এমন একটি লেবেল রাখতে চেয়েছিলাম যা মাল্টি-লাইন, ন্যূনতম ফন্টের আকার রাখতে সক্ষম ছিল এবং এর প্যারেন্ট ভিউতে অনুভূমিক এবং উল্লম্ব উভয়ই কেন্দ্রিক। আমি আমার লেবেলটিকে আমার দর্শনে প্রোগ্রামযুক্তভাবে যুক্ত করেছি:

- (void) customInit {
    // Setup label
    self.label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)];
    self.label.numberOfLines = 0;
    self.label.lineBreakMode = UILineBreakModeWordWrap;
    self.label.textAlignment = UITextAlignmentCenter;

    // Add the label as a subview
    self.autoresizesSubviews = YES;
    [self addSubview:self.label];
}

এবং তারপরে যখন আমি আমার লেবেলের পাঠ্যটি পরিবর্তন করতে চাই ...

- (void) updateDisplay:(NSString *)text {
    if (![text isEqualToString:self.label.text]) {
        // Calculate the font size to use (save to label's font)
        CGSize textConstrainedSize = CGSizeMake(self.frame.size.width, INT_MAX);
        self.label.font = [UIFont systemFontOfSize:TICKER_FONT_SIZE];
        CGSize textSize = [text sizeWithFont:self.label.font constrainedToSize:textConstrainedSize];
        while (textSize.height > self.frame.size.height && self.label.font.pointSize > TICKER_MINIMUM_FONT_SIZE) {
            self.label.font = [UIFont systemFontOfSize:self.label.font.pointSize-1];
            textSize = [ticker.blurb sizeWithFont:self.label.font constrainedToSize:textConstrainedSize];
        }
        // In cases where the frame is still too large (when we're exceeding minimum font size),
        // use the views size
        if (textSize.height > self.frame.size.height) {
            textSize = [text sizeWithFont:self.label.font constrainedToSize:self.frame.size];
        }

        // Draw 
        self.label.frame = CGRectMake(0, self.frame.size.height/2 - textSize.height/2, self.frame.size.width, textSize.height);
        self.label.text = text;
    }
    [self setNeedsDisplay];
}

আশা করি যে কাউকে সাহায্য করবে!


14

FXLabel (GitHub দিকে) সেট করে বাক্সের এই আউট করে label.contentModeকরতে UIViewContentModeTop। এই উপাদানটি আমার দ্বারা তৈরি করা হয়নি, তবে এটি এমন একটি উপাদান যা আমি ঘন ঘন ব্যবহার করি এবং এতে প্রচুর বৈশিষ্ট্য রয়েছে এবং এটি বেশ কার্যকর বলে মনে হচ্ছে।


11

যে কেউ এটি পড়ার জন্য কারণ আপনার লেবেলের অভ্যন্তর পাঠ্যটি উল্লম্বভাবে কেন্দ্রিক নয়, মনে রাখবেন কিছু ফন্টের প্রকারগুলি সমানভাবে ডিজাইন করা হয়নি। উদাহরণস্বরূপ, আপনি যদি জ্যাপফিনো আকার 16 দিয়ে একটি লেবেল তৈরি করেন তবে আপনি দেখতে পাবেন যে পাঠ্যটি পুরোপুরি উল্লম্বভাবে কেন্দ্রিক নয়।

তবে, হেলভেটিকার সাথে কাজ করা আপনার পাঠ্যটিকে উল্লম্বভাবে কেন্দ্র করবে।


অনেক কাস্টম ফন্ট উল্লম্ব কেন্দ্র প্রান্তিক হয় না। ইউআইএলবেল বা ইউআইটিেক্সটভিউ সর্বদা উল্লম্ব কেন্দ্ররেখায় থাকে। আইওএস প্রোগ্রামিংয়ে উল্লম্ব সারিবদ্ধতা সম্পর্কে ভাবার দরকার নেই।
অমিত সিং

11

ব্যবহার textRect(forBounds:limitedToNumberOfLines:)

class TopAlignedLabel: UILabel {
    override func drawText(in rect: CGRect) {
        let textRect = super.textRect(forBounds: bounds, limitedToNumberOfLines: numberOfLines)
        super.drawText(in: textRect)
    }
}

আপনি স্যার দেবতা!
ডায়োগো অ্যান্টুনস

1
এই উত্তরের সর্বোত্তম এবং পরিষ্কার সমাধান হিসাবে এটি আরও বেশি উপায়ে পাওয়া উচিত !
মাইকেল ওচস

10

সাবক্লাস ইউিলাবেল এবং অঙ্কনের আয়তক্ষেত্রটিকে সীমাবদ্ধ করুন:

- (void)drawTextInRect:(CGRect)rect
{
    CGSize sizeThatFits = [self sizeThatFits:rect.size];
    rect.size.height = MIN(rect.size.height, sizeThatFits.height);

    [super drawTextInRect:rect];
}

আমি নিউলাইন প্যাডিং জড়িত সমাধানটি চেষ্টা করেছি এবং কিছু ক্ষেত্রে ভুল আচরণে চলে এসেছি। আমার অভিজ্ঞতার সাথে অঙ্কনের চেয়ে বেশি আঁকাগুলি আঁকার চেয়েও আঁকানো সহজ easiernumberOfLines

পিএস আপনি সহজেই এইভাবে ইউআইভিউ কনটেন্টমডকে সমর্থন করে তা কল্পনা করতে পারেন:

- (void)drawTextInRect:(CGRect)rect
{
    CGSize sizeThatFits = [self sizeThatFits:rect.size];

    if (self.contentMode == UIViewContentModeTop) {
        rect.size.height = MIN(rect.size.height, sizeThatFits.height);
    }
    else if (self.contentMode == UIViewContentModeBottom) {
        rect.origin.y = MAX(0, rect.size.height - sizeThatFits.height);
        rect.size.height = MIN(rect.size.height, sizeThatFits.height);
    }

    [super drawTextInRect:rect];
}

10

আপনি যদি অটোলেআউট ব্যবহার করছেন তবে কোড বা আইবিতে উল্লম্ব সামগ্রী হুগিংপ্রিয়রিটি 1000 এ সেট করুন। আইবিতে আপনাকে এরপরে 1 এর অগ্রাধিকারটি সেট করে এবং তারপরে মুছে ফেলে উচ্চতার প্রতিবন্ধকতা সরিয়ে ফেলতে হবে।


8

যতক্ষণ না আপনি কোনও জটিল কাজ করছেন না, আপনি তার UITextViewপরিবর্তে ব্যবহার করতে পারেন UILabels

স্ক্রোলটি অক্ষম করুন।

আপনি যদি চান যে পাঠ্যটি পুরোপুরি প্রদর্শিত হবে কেবল ব্যবহারকারী sizeToFitএবং sizeThatFits:পদ্ধতিগুলি


8

দ্রুতগতিতে,

let myLabel : UILabel!

আপনার লেবেলের পাঠ্যটিকে স্ক্রিনে ফিট করতে এবং এটি শীর্ষে রয়েছে

myLabel.sizeToFit()

আপনার লেবেলের ফন্টটি স্ক্রিনের প্রস্থ বা নির্দিষ্ট প্রস্থের আকারের সাথে মানিয়ে নিতে।

myLabel.adjustsFontSizeToFitWidth = YES

এবং লেবেলের জন্য কিছু পাঠ্যসূচী:

myLabel.textAlignment = .center

myLabel.textAlignment = .left

myLabel.textAlignment = .right

myLabel.textAlignment = .Natural

myLabel.textAlignment = .Justified


এর পুরানো বাক্য গঠন থেকে সিনট্যাক্সের পরিবর্তন [myLabel sizeToFit]। ধন্যবাদ!
ভেলকুন

7

এটি একটি পুরানো সমাধান, আইওএস> = 6 এ অটোলেআউট ব্যবহার করুন

আমার সমাধান:

  1. আমার দ্বারা লাইনগুলি বিভক্ত করুন (লেবেল মোড়ানো সেটিংস উপেক্ষা করে)
  2. আমার দ্বারা লাইনগুলি আঁকুন (লেবেল সারিবদ্ধতা উপেক্ষা করে)

@interface UITopAlignedLabel : UILabel

@end

@implementation UITopAlignedLabel

#pragma mark Instance methods

- (NSArray*)splitTextToLines:(NSUInteger)maxLines {
    float width = self.frame.size.width;

    NSArray* words = [self.text componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
    NSMutableArray* lines = [NSMutableArray array];

    NSMutableString* buffer = [NSMutableString string];    
    NSMutableString* currentLine = [NSMutableString string];

    for (NSString* word in words) {
        if ([buffer length] > 0) {
            [buffer appendString:@" "];
        }

        [buffer appendString:word];

        if (maxLines > 0 && [lines count] == maxLines - 1) {
            [currentLine setString:buffer];
            continue;
        }

        float bufferWidth = [buffer sizeWithFont:self.font].width;

        if (bufferWidth < width) {
            [currentLine setString:buffer];
        }
        else {
            [lines addObject:[NSString stringWithString:currentLine]];

            [buffer setString:word];
            [currentLine setString:buffer];
        }
    }

    if ([currentLine length] > 0) {
        [lines addObject:[NSString stringWithString:currentLine]];
    }

    return lines;
}

- (void)drawRect:(CGRect)rect {
    if ([self.text length] == 0) {
        return;
    }

    CGContextRef context = UIGraphicsGetCurrentContext();

    CGContextSetFillColorWithColor(context, self.textColor.CGColor);
    CGContextSetShadowWithColor(context, self.shadowOffset, 0.0f, self.shadowColor.CGColor);

    NSArray* lines = [self splitTextToLines:self.numberOfLines];
    NSUInteger numLines = [lines count];

    CGSize size = self.frame.size;
    CGPoint origin = CGPointMake(0.0f, 0.0f);

    for (NSUInteger i = 0; i < numLines; i++) {
        NSString* line = [lines objectAtIndex:i];

        if (i == numLines - 1) {
            [line drawAtPoint:origin forWidth:size.width withFont:self.font lineBreakMode:UILineBreakModeTailTruncation];            
        }
        else {
            [line drawAtPoint:origin forWidth:size.width withFont:self.font lineBreakMode:UILineBreakModeClip];
        }

        origin.y += self.font.lineHeight;

        if (origin.y >= size.height) {
            return;
        }
    }
}

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