উত্তর:
এটিতে উল্লম্ব-সারিবদ্ধ সেট করার কোনও উপায় নেই 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;
adjustsFontSizeToFitWidth
কাজটির দরকার হয় তবে সাইজটিফিটটি ব্যবহার করুন তারপরে লেবেলের ফ্রেমটি 0, 0 এ সেট করুন, দ্য উইডথ ইউওয়ান্ট, লেবেল.ফ্রেম.সাইজ.হাইট (যা সাইজেরটফিট দ্বারা নির্ধারিত নতুন উচ্চতা) তখন প্রযোজ্যadjustsFontSizeToFitWidth
নতুন পাঠ্য সেট করুন:
myLabel.text = @"Some Text"
maximum number
0 (স্বয়ংক্রিয়) এ লাইনের লাইন সেট করুন :
myLabel.numberOfLines = 0
সর্বোচ্চ আকারে লেবেলের ফ্রেমটি সেট করুন:
myLabel.frame = CGRectMake(20,20,200,800)
sizeToFit
ফ্রেমের আকার হ্রাস করার জন্য কল করুন যাতে সামগ্রীগুলি ঠিক ফিট হয়:
[myLabel sizeToFit]
লেবেলগুলির ফ্রেমটি এখন আপনার পাঠ্যের সাথে মানানসই যথেষ্ট উচ্চ এবং প্রশস্ত। উপরের বামটি অপরিবর্তিত হওয়া উচিত। আমি এটি শুধুমাত্র শীর্ষের বাম-সংযুক্ত পাঠ্য দ্বারা পরীক্ষা করেছি। অন্যান্য অ্যালাইনমেন্টের জন্য আপনাকে পরবর্তী সময়ে ফ্রেমটি সংশোধন করতে হতে পারে।
এছাড়াও, আমার লেবেলে শব্দ মোড়ানো সক্ষম রয়েছে।
এক্সটেনশন সমাধানটি উল্লেখ করে:
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
। অবজেক্টিভ-সি-তে নতুন হওয়ার আগে আমি এই সিনট্যাক্সের আগে আগে দৌড়িনি। এটাকে কি বলে?
sizeWithFont:constrainedToSize:lineBreakMode:
এবং আকারবিহীন ফন্ট: উভয়ই আইওএস 7-এ অবমূল্যায়িত। এছাড়াও, এই বিভাগটি কেবলমাত্র লেবেলগুলিতে কাজ করে যখন সংখ্যাটি
শুধু ক্ষেত্রে এটি কারো সাহায্য বা সাহায্যের, আমি একই সমস্যা ছিল কিন্তু কেবল ব্যবহার করা থেকে সুইচিং দ্বারা সমস্যা সমাধানের পেরেছিলেন UILabel
ব্যবহার করে UITextView
। আমি প্রশংসা করি এটি সবার জন্য নয় কারণ কার্যকারিতাটি কিছুটা আলাদা।
আপনি যদি ব্যবহারে স্যুইচ করেন UITextView
, আপনি সমস্ত স্ক্রোল ভিউ বৈশিষ্ট্য পাশাপাশি ব্যবহারকারী ইন্টারঅ্যাকশন সক্ষম করেছেন ... এটি লেবেলের মতো আরও কাজ করতে বাধ্য করবে।
UITextView
আমাকে তাত্ক্ষণিক পছন্দসই ফলাফল দিয়েছে।
কোন ঝাঁকুনি নেই, গোলমাল নেই
@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)
}
}
উপরের উত্তরটির মতো, তবে এটি বেশ সঠিক ছিল না, বা কোডে চড় মারা সহজ তাই আমি এটিকে কিছুটা পরিষ্কার করে ফেললাম। এই এক্সটেনশনটিকে এটির নিজস্ব .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];
এটি সম্পাদন করার আরও তাত্পর্যপূর্ণ (এবং জঘন্য) উপায় হ'ল ইউলিবেলের লাইন ব্রেক ব্রেকটি "ক্লিপ" এ সেট করা এবং একটি নির্দিষ্ট পরিমাণ নিউলাইন যোগ করা।
myLabel.lineBreakMode = UILineBreakModeClip;
myLabel.text = [displayString stringByAppendingString:"\n\n\n\n"];
এই সমাধানটি সবার জন্য কার্যকর হবে না - বিশেষত, আপনি যদি এখনও আপনার স্ট্রিংয়ের শেষে "..." দেখাতে চান তবে এটি যদি আপনার প্রদর্শিত রেখার সংখ্যাটি অতিক্রম করে, আপনার একটি ব্যবহার করতে হবে কোডের দীর্ঘতর বিট - তবে অনেকগুলি ক্ষেত্রে এটি আপনার যা প্রয়োজন তা আপনাকে পেয়ে যাবেন।
UILineBreakModeWordWrap
পরিবর্তে ব্যবহার করুন।
স্টোরিবোর্ড ব্যবহার করে সবচেয়ে সহজ পদ্ধতি:
এম্বেড করুন লেবেল মধ্যে StackView এবং সেট অ্যাট্রিবিউট ইন্সপেক্টর মধ্যে StackView দুই বৈশিষ্ট্যাবলী করুন:
1- Axis
থেকে Horizontal
,
2- Alignment
থেকেTop
UILabel
কিছু UIView
সাবক্লাসে রাখার দুর্দান্ত ধারণা (প্লেইন UIView
সাধারণত পর্যাপ্ত পরিমাণে থাকে) এবং সেই লেবেলটি নিচের দিকে বাড়তে দিন। ধন্যবাদ!
UILabel
এবং স্ট্যাকভিউকে তার কাজটি করতে দেওয়া উচিত। ধন্যবাদ!
পরিবর্তে UILabel
আপনি ব্যবহার করতে পারেন UITextField
যা উল্লম্ব সারিবদ্ধ বিকল্প রয়েছে:
textField.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter;
textField.userInteractionEnabled = NO; // Don't allow interaction
আমি এটির সাথে দীর্ঘ সময় ধরে লড়াই করেছি এবং আমি আমার সমাধানটি ভাগ করে নিতে চাই।
এটি আপনাকে এমন একটি দেবে UILabel
যা পাঠ্যটিকে 0.5 স্কেলের নীচে অটোশ্রিং করবে এবং পাঠ্যটিকে উল্লম্বভাবে কেন্দ্র করবে। এই বিকল্পগুলি স্টোরিবোর্ড / আইবিতেও উপলব্ধ।
[labelObject setMinimumScaleFactor:0.5];
[labelObject setBaselineAdjustment:UIBaselineAdjustmentAlignCenters];
একটি নতুন ক্লাস তৈরি করুন
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
sizeToFit
সমাধান আসলে এই তোলে UILabel
করা কোনো উপরের টেক্সট, এমনকি যদি আপনি পরিবর্তনশীল একটি লম্বা এক বা তদ্বিপরীত সঙ্গে একটি সংক্ষিপ্ত পাঠ প্রতিস্থাপন করুন।
ইন্টারফেস বিল্ডারে
UILabel
বৃহত্তম সম্ভাব্য পাঠ্যের আকারেLines
বৈশিষ্ট্য পরিদর্শকের '0' তেআপনার কোডে
sizeToFit
আপনার লেবেল কলটুকিটাকি সংকেতলিপি:
self.myLabel.text = @"Short Title";
[self.myLabel sizeToFit];
অ্যাডাপটিভ ইউআই (আইওএস 8 বা তার পরে) এর জন্য স্টোরিবোর্ড থেকে ইউআইএলবেলের উল্লম্ব প্রান্তিককরণটি noOfLines
= 0` এবং বৈশিষ্ট্য পরিবর্তন করে সেট করতে হবে
সীমাবদ্ধতাসমূহ
ইউআইএলবেল লেফমার্জিন, রাইটমার্জিন এবং শীর্ষ মার্জিন সীমাবদ্ধতাগুলি সমন্বয় করা হচ্ছে।
পরিবর্তন
Content Compression Resistance Priority For Vertical
= 1000` যাতে উল্লম্ব> অনুভূমিক।
সম্পাদিত:
noOfLines=0
এবং নিম্নলিখিত সীমাবদ্ধতাগুলি পছন্দসই ফলাফল অর্জনের জন্য যথেষ্ট।
ইউআইএলবেলের একটি সাবক্লাস তৈরি করুন। একটি যাদুমন্ত্র মত কাজ করে:
// 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
এই উদ্দেশ্য অর্জনের জন্য আমি একটি ব্যবহার ফাংশন লিখেছি। আপনি একবার দেখে নিতে পারেন:
// শীর্ষের সাথে উল্লম্ব সারিবদ্ধ করতে একটি বহু-লাইন লেবেলের উচ্চতা সামঞ্জস্য করুন + (শূন্য) সারিবদ্ধ লেবেলওথ টপ: (ইউআইএলবেল *) লেবেল { সিজি সাইজ ম্যাক্স সাইজ = সিজি সাইজমেক (লেবেল.ফ্রেম.সাইজ.উইথথ, 999); label.adjustsFontSizeToFitWidth = NO; // প্রকৃত উচ্চতা পান সিজি সাইজ রিয়েলসাইজ = [লেবেল.টেক্সট সাইজ উইথফোন: লেবেল.ফন্ট কনস্ট্রেইনডটসাইজ: ম্যাক্স সাইজ লাইনব্র্যাকমোড: লেবেল.লাইনব্রেইকমোড]; সিজিআরেক্ট রেক্ট = লেবেল.ফ্রেম; rect.size.height = আসলসাইজ.হাইট; label.frame = rect; }
.ব্যবহারবিধি? (যদি lblHello ইন্টারফেস বিল্ডার দ্বারা তৈরি করা হয়, তাই আমি কিছু ইউআইএবেল বৈশিষ্ট্য বিশদ বিবরণ এড়িয়ে যাই)
lblHello.text = @ "হ্যালো ওয়ার্ল্ড! হ্যালো ওয়ার্ল্ড! হ্যালো ওয়ার্ল্ড! হ্যালো ওয়ার্ল্ড! হ্যালো ওয়ার্ল্ড! হ্যালো ওয়ার্ল্ড! হ্যালো ওয়ার্ল্ড! হ্যালো ওয়ার্ল্ড!"; lblHello.numberOfLines = 5; [ইউলিটস এলাইনল্যাবললিথথপ: এলবিএলহেলো];
আমি আমার ব্লগে এটি একটি নিবন্ধ হিসাবেও লিখেছি: http://fstoke.me/blog/?p=2819
আমি কোডটি এবং সেই সাথে প্রবর্তিত পৃষ্ঠায় কোডটি পড়তে কিছুটা সময় নিয়েছি এবং দেখেছি যে তারা সকলেই লেবেলের ফ্রেমের আকার পরিবর্তন করার চেষ্টা করছে, যাতে ডিফল্ট কেন্দ্রের উল্লম্ব সারিবদ্ধতা প্রদর্শিত না হয়।
যাইহোক, কিছু ক্ষেত্রে আমরা লেবেলটি সমস্ত জায়গাগুলি দখল করতে চাই, এমনকি যদি লেবেলে এত বেশি পাঠ্য থাকে (যেমন সমান উচ্চতা সহ একাধিক সারি)।
এখানে, আমি এটির সমাধানের বিকল্প উপায়টি ব্যবহার করেছি, কেবলমাত্র লেবেলের শেষের দিকে নিউলাইনগুলি প্যাড করে (প্লিজ নোট করুন যে আমি আসলে উত্তরাধিকার সূত্রে পেয়েছি 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 "];
}
আমি এখানে পরামর্শগুলি নিয়েছি এবং এমন একটি ভিউ তৈরি করেছি যা কোনও ইউআইএলবেলকে মুড়িয়ে রাখতে পারে এবং এটি আকার করবে এবং লাইনের সংখ্যা নির্ধারণ করবে যাতে এটি শীর্ষে সারিবদ্ধ থাকে। কেবলমাত্র একটি 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
আপনি টিটিটিটি্যাট্রিবিউটেড লেবেল ব্যবহার করতে পারেন এটি উল্লম্ব প্রান্তিককরণ সমর্থন করে।
@property (nonatomic) TTTAttributedLabel* label;
<...>
//view's or viewController's init method
_label.verticalAlignment = TTTAttributedLabelVerticalAlignmentTop;
আমি এই প্রশ্নের উত্তরগুলি এখন কিছুটা পুরানো হয়ে গেছি, সুতরাং এটি অটো লেআউট অনুরাগীদের জন্য এটি যুক্ত করে।
অটো লেআউটটি এই সমস্যাটিকে বেশ তুচ্ছ করে তোলে। ধরে নিই আমরা লেবেলে যুক্ত করছি 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
।
আমি উপরের অনেকগুলি পদ্ধতি ব্যবহার করেছি এবং কেবলমাত্র আমি ব্যবহৃত এবং দ্রুত এবং নোংরা পদ্ধতির যোগ করতে চাই:
myLabel.text = [NSString stringWithFormat:@"%@\n\n\n\n\n\n\n\n\n",@"My label text string"];
নিশ্চিত হয়ে নিন যে স্ট্রিংয়ে থাকা নিউলাইনগুলির সংখ্যা যে কোনও পাঠ্যকে উপলভ্য উল্লম্ব স্থানটি পূরণ করবে এবং UILabel কে কোনও প্রবহমান পাঠকে ছাঁটাই করতে সেট করবে।
কারণ কখনও কখনও যথেষ্ট ভাল যথেষ্ট ভাল ।
UITextView
সেটি হ'ল dlopen
পাঠ্য ইনপুটটিকে সমর্থন করার জন্য এটি কল করতে পারে। এটি ইউআই থ্রেডে বড় ব্যবধান সৃষ্টি করতে পারে, সুতরাং এই পদ্ধতির আরও পারফরম্যান্স!
আমি এমন একটি লেবেল রাখতে চেয়েছিলাম যা মাল্টি-লাইন, ন্যূনতম ফন্টের আকার রাখতে সক্ষম ছিল এবং এর প্যারেন্ট ভিউতে অনুভূমিক এবং উল্লম্ব উভয়ই কেন্দ্রিক। আমি আমার লেবেলটিকে আমার দর্শনে প্রোগ্রামযুক্তভাবে যুক্ত করেছি:
- (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];
}
আশা করি যে কাউকে সাহায্য করবে!
FXLabel (GitHub দিকে) সেট করে বাক্সের এই আউট করে label.contentMode
করতে UIViewContentModeTop
। এই উপাদানটি আমার দ্বারা তৈরি করা হয়নি, তবে এটি এমন একটি উপাদান যা আমি ঘন ঘন ব্যবহার করি এবং এতে প্রচুর বৈশিষ্ট্য রয়েছে এবং এটি বেশ কার্যকর বলে মনে হচ্ছে।
যে কেউ এটি পড়ার জন্য কারণ আপনার লেবেলের অভ্যন্তর পাঠ্যটি উল্লম্বভাবে কেন্দ্রিক নয়, মনে রাখবেন কিছু ফন্টের প্রকারগুলি সমানভাবে ডিজাইন করা হয়নি। উদাহরণস্বরূপ, আপনি যদি জ্যাপফিনো আকার 16 দিয়ে একটি লেবেল তৈরি করেন তবে আপনি দেখতে পাবেন যে পাঠ্যটি পুরোপুরি উল্লম্বভাবে কেন্দ্রিক নয়।
তবে, হেলভেটিকার সাথে কাজ করা আপনার পাঠ্যটিকে উল্লম্বভাবে কেন্দ্র করবে।
ব্যবহার textRect(forBounds:limitedToNumberOfLines:)
।
class TopAlignedLabel: UILabel {
override func drawText(in rect: CGRect) {
let textRect = super.textRect(forBounds: bounds, limitedToNumberOfLines: numberOfLines)
super.drawText(in: textRect)
}
}
সাবক্লাস ইউিলাবেল এবং অঙ্কনের আয়তক্ষেত্রটিকে সীমাবদ্ধ করুন:
- (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];
}
যতক্ষণ না আপনি কোনও জটিল কাজ করছেন না, আপনি তার UITextView
পরিবর্তে ব্যবহার করতে পারেন UILabels
।
স্ক্রোলটি অক্ষম করুন।
আপনি যদি চান যে পাঠ্যটি পুরোপুরি প্রদর্শিত হবে কেবল ব্যবহারকারী sizeToFit
এবং sizeThatFits:
পদ্ধতিগুলি
দ্রুতগতিতে,
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]
। ধন্যবাদ!
এটি একটি পুরানো সমাধান, আইওএস> = 6 এ অটোলেআউট ব্যবহার করুন
আমার সমাধান:
@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