Answers:
A හි සිරස්-පෙළගැස්ම සැකසීමට ක්රමයක් නැත UILabel
, නමුත් ලේබලයේ රාමුව වෙනස් කිරීමෙන් ඔබට එකම බලපෑමක් ලබා ගත හැකිය. මම මගේ ලේබල් තැඹිලි පාට කර ඇති නිසා ඔබට සිදුවන්නේ කුමක්ද යන්න පැහැදිලිව දැකගත හැකිය.
මෙය කිරීමට ඉක්මන් හා පහසුම ක්රමය මෙන්න:
[myLabel sizeToFit];
ඔබ එකකට වඩා වැඩි රේඛාව බවට පත් කරන බව තවදුරටත් පෙළ සමග ලේබලය තිබේ නම්, කට්ටලයක් numberOfLines
සඳහා 0
(ශුන්ය මෙතන රේඛා මෙඩි අදහස්).
myLabel.numberOfLines = 0;
[myLabel sizeToFit];
දිගු අනුවාදය
මම මගේ ලේබලය කේතයෙන් සාදන්නෙමි එවිට ඔබට සිදුවන්නේ කුමක්දැයි දැක ගත හැකිය. ඔබට අතුරු මුහුණත් සාදන්නා තුළද මේවායින් බොහොමයක් සැකසිය හැකිය. මගේ සැකසුම මායිම් (ලකුණු 20) පෙන්වීම සඳහා Photoshop හි සාදන ලද පසුබිම් රූපයක් සහිත දර්ශන පාදක යෙදුමකි. ලේබලය ආකර්ශනීය තැඹිලි පැහැයක් වන අතර එමඟින් මානයන් සමඟ සිදුවන්නේ කුමක්ද යන්න ඔබට දැකගත හැකිය.
- (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
ස්වයංක්රීය සැකැස්ම භාවිතා කරන ViewController හි උප දර්ශනයක් ලෙස ඔබේ ලේබලය නිබ් හෝ ස්ටෝරිබෝඩ් එකක ඇතුළත් කර ඇත්නම්, එවිට ඔබේsizeToFit
ඇමතුමviewDidLoad
ක්රියාත්මක නොකරනු ඇත, මන්ද ස්වයංක්රීය පිටවීම් ප්රමාණයන් සහ උප දර්ශන පසුව ස්ථානගත කිරීමෙන් පසුවviewDidLoad
ඔබේ ප්රති effects ල වහාම අහෝසි වේ.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
නම් sizeToFit භාවිතා කර ලේබලයේ රාමුව 0, 0 ලෙස සකසන්න, TheWidthYouWant, label.frame.size.height (මෙය sizeToFit මගින් තීරණය කරන නව උස වේ) එවිට අදාළ වේ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
පසුපස ලුහුබඳින ප්රවාහනය නොසලකා හරින බව පෙනේ :(
ඒ හා සමානව, alignBottom ද @" \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];
එක් එක් yourLabel පෙළ පැවරුම පසු.
VerticalAlign
පසු වරහන් අතර ඔබ එකතු කරන බව මම දුටුවෙමි @implementation UILabel
. පරමාර්ථ-සී වෙත අළුත් වීම මම මීට පෙර මෙම වාක්ය ඛණ්ඩය හරහා දිව ගොස් නැත. මෙය හඳුන්වන්නේ කුමක්ද?
sizeWithFont:constrainedToSize:lineBreakMode:
සහ ප්රමාණය විත් ෆොන්ට්: දෙකම iOS7 හි ක්ෂය වී ඇත. එසේම, මෙම කාණ්ඩය ක්රියාත්මක වන්නේ අංක ඕෆ්ලයින් 0 ට වඩා වැඩි වූ විට පමණි.
යන්තම් නඩුවේ එය ඕනෑම කෙනෙකුට ඕනෑම උදව්, මම එම ප්රශ්නය තිබූ නමුත් සරලව භාවිතා මාරු වූ විට මෙම ප්රශ්නය විසඳා ගැනීමට ඔබට හැකි විය UILabel
භාවිතා කිරීමට UITextView
. ක්රියාකාරීත්වය ටිකක් වෙනස් නිසා මෙය සෑම කෙනෙකුටම නොවන බව මම අගය කරමි.
ඔබ භාවිතයට මාරුවන්නේ නම් UITextView
, ඔබට සියලු අනුචලන දර්ශන ගුණාංග මෙන්ම පරිශීලක අන්තර්ක්රියා සක්රීය කර ඇත ... මෙය ලේබලයක් මෙන් ක්රියා කිරීමට බල කරයි.
UITextView
මට අපේක්ෂිත ප්රති result ලය එකවරම ලැබුණි.
අවුලක් නැත, කලබලයක් නැත
@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];
කතන්දර පුවරුව භාවිතයෙන් පහසුම ප්රවේශය:
Embed ලේබල් දී StackView පහත සඳහන් ලක්ෂණය පරීක්ෂකගේ StackView ගුණාංග දෙකක් සහ කුලකය:
1- Axis
සිටHorizontal
,
2- Alignment
සිටTop
UILabel
සමහර UIView
උප පංතියකට ස්ථානගත කිරීම සඳහා හොඳ අදහසක් (තැනිතලා UIView
සාමාන්යයෙන් ප්රමාණවත්) සහ එම ලේබලය පහළ දිශාවට වර්ධනය වීමට ඉඩ දෙන්න. ස්තූතියි!
UILabel
StackView හට එහි කාර්යය කිරීමට ඉඩ දිය යුතු බව ද සඳහන් කිරීම වටී . ස්තූතියි!
මෙය ඉටු කර ගැනීම සඳහා ඊටත් වඩා ඉක්මන් (හා අපිරිසිදු) ක්රමයක් වන්නේ UILabel හි රේඛීය කඩන මාදිලිය "ක්ලිප්" ලෙස සැකසීම සහ නව රේඛා ප්රමාණයක් එකතු කිරීමයි.
myLabel.lineBreakMode = UILineBreakModeClip;
myLabel.text = [displayString stringByAppendingString:"\n\n\n\n"];
මෙම විසඳුම සෑම කෙනෙකුටම ක්රියාත්මක නොවනු ඇත - විශේෂයෙන්, ඔබේ නූල අවසානයේ "..." පෙන්වීමට ඔබට අවශ්ය නම් එය ඔබ පෙන්වන රේඛා ගණන ඉක්මවා ගියහොත්, ඔබට එකක් භාවිතා කිරීමට අවශ්ය වේ කේතයේ දිගු බිටු - නමුත් බොහෝ අවස්ථාවන් සඳහා මෙය ඔබට අවශ්ය දේ ලබා ගනී.
UILineBreakModeWordWrap
ඒ වෙනුවට භාවිතා කරන්න .
UILabel
ඔබ වෙනුවට UITextField
සිරස් පෙළගැස්වීමේ විකල්පයක් ඇති භාවිතා කළ හැකිය:
textField.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter;
textField.userInteractionEnabled = NO; // Don't allow interaction
මම මේ සමඟ දීර් long කාලයක් තිස්සේ අරගල කර ඇති අතර මගේ විසඳුම බෙදා ගැනීමට මට අවශ්ය විය.
මෙය ඔබට 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
හැකි විශාලතම පා of යේ ප්රමාණයට සකසන්නLines
ගුණාංග පරීක්ෂක හි '0' ලෙස සකසන්නඔබේ කේතය තුළ
sizeToFit
ඔබේ ලේබලය අමතන්නකේත ස්නිපෙට්:
self.myLabel.text = @"Short Title";
[self.myLabel sizeToFit];
අනුවර්තී UI සඳහා (iOS8 හෝ ඊට පසු), UILabel හි සිරස් පෙළගැස්ම StoryBoard වෙතින්
noOfLines
= 0` සහ
අවහිරතා
UILabel LefMargin, RightMargin සහ ඉහළ ආන්තික සීමාවන් සකස් කිරීම.
වෙනස් කරන්න
Content Compression Resistance Priority For Vertical
= 1000` ඒ නිසා එම සිරස්> තිරස්.
සංස්කරණය කළේ:
noOfLines=0
අපේක්ෂිත ප්රති .ල ලබා ගැනීම සඳහා පහත සඳහන් සීමාවන් ප්රමාණවත් වේ.
UILabel හි උප පංතියක් සාදන්න. චමත්කාරයක් මෙන් ක්රියා කරයි:
// 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
මෙහි සාකච්ඡා කළ පරිදි .
මෙම අරමුණු සාක්ෂාත් කර ගැනීම සඳහා මම උපයෝගීතා ශ්රිතයක් ලිවීමි. ඔබට බලන්න පුළුවන්:
// බහු රේඛා ලේබලයක උස සිරස් අතට ඉහළින් පෙළගස්වන්න + (අවලංගු) alignLabelWithTop: (UILabel *) ලේබලය { CGSize maxSize = CGSizeMake (label.frame.size.width, 999); label.adjustsFontSizeToFitWidth = නැත; // නියම උස ලබා ගන්න CGSize realSize = [label.text sizeWithFont: label.font constinedToSize: maxSize lineBreakMode: label.lineBreakMode]; CGRect rect = label.frame; rect.size.height = realSize.height; label.frame = සෘජුකෝණාස්රය; }
Use භාවිතා කරන්නේ කෙසේද? (LblHello නිර්මාණය කර ඇත්තේ අතුරුමුහුණත් සාදන්නා නම්, එබැවින් මම UILabel ගුණාංග විස්තර මඟ හරින්නෙමි)
lblHello.text = @ "හෙලෝ වර්ල්ඩ්! හෙලෝ වර්ල්ඩ්! හෙලෝ වර්ල්ඩ්! හෙලෝ වර්ල්ඩ්! හෙලෝ වර්ල්ඩ්! හෙලෝ වර්ල්ඩ්! හෙලෝ වර්ල්ඩ්! හෙලෝ වර්ල්ඩ්!"; lblHello.numberOfLines = 5; [Utils alignLabelWithTop: lblHello];
මම එය මගේ බ්ලොග් අඩවියේ ලිපියක් ලෙසද ලියා ඇත: 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 හි රේඛීය දේපල 0 ලෙස සැකසීම මෙන්ම UILabel හි පහළ අවහිරයක් නිර්මාණය කිරීම සහ පහත රූපයේ දැක්වෙන පරිදි එය> = 0 ලෙස සකසා ඇති බවට වග බලා ගැනීමයි.
මම මෙහි යෝජනා ගෙන UILabel එකක් ඔතා තැබිය හැකි දර්ශනයක් නිර්මාණය කළ අතර එය විශාල කර පේළි ගණන සකසා එය ඉහළින් පෙළ ගැසී ඇත. උප දර්ශනයක් ලෙස 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
ඔබට TTTAttributedLabel භාවිතා කළ හැකිය , එය සිරස් පෙලගැස්මට සහාය වේ.
@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
බවයි. මෙය UI නූල් මත විශාල පසුබෑමකට හේතු විය හැක, එබැවින් මෙම ප්රවේශය වඩාත් ක්රියාකාරී වේ!
මට අවශ්ය වූයේ ලේබලයක් බහු රේඛා, අවම අකුරු ප්රමාණයක් සහ තිරස් අතට හා සිරස් අතට එහි මව් දැක්ම තුළ තිබිය හැකි ය. මම මගේ ලේබලය ක්රමලේඛිකව මගේ දෘෂ්ටියට එක් කළෙමි:
- (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
. මෙම සං component ටකය මා විසින් සාදන ලද්දක් නොවේ, නමුත් එය මම නිතර භාවිතා කරන අංගයක් වන අතර විශේෂාංග ටොන් ගණනක් ඇති අතර එය හොඳින් ක්රියාත්මක වන බව පෙනේ.
භාවිතා කරන්න textRect(forBounds:limitedToNumberOfLines:)
.
class TopAlignedLabel: UILabel {
override func drawText(in rect: CGRect) {
let textRect = super.textRect(forBounds: bounds, limitedToNumberOfLines: numberOfLines)
super.drawText(in: textRect)
}
}
ඔබේ ලේබලය තුළ ඇති පෙළ සිරස් අතට කේන්ද්රගත වී නැති නිසා මෙය කියවන ඕනෑම කෙනෙකුට, සමහර අකුරු වර්ග සමානව නිර්මාණය කර නොමැති බව මතක තබා ගන්න. උදාහරණයක් ලෙස, ඔබ zapfino ප්රමාණය 16 සහිත ලේබලයක් සාදන්නේ නම්, පෙළ සිරස් අතට කේන්ද්රගත වී නොමැති බව ඔබට පෙනෙනු ඇත.
කෙසේ වෙතත්, හෙල්වෙටිකා සමඟ වැඩ කිරීමෙන් ඔබේ පෙළ සිරස් අතට කේන්ද්රගත වේ.
UILabel උප පංතිය සහ ඇඳීම් සෘජුකෝණාස්රය මේ ආකාරයට සීමා කරන්න:
- (void)drawTextInRect:(CGRect)rect
{
CGSize sizeThatFits = [self sizeThatFits:rect.size];
rect.size.height = MIN(rect.size.height, sizeThatFits.height);
[super drawTextInRect:rect];
}
මම නව රේඛීය පෑඩින් සම්බන්ධ විසඳුම අත්හදා බැලූ අතර සමහර අවස්ථාවල වැරදි හැසිරීම් වලට යොමු විය. මගේ අත්දැකීම් අනුව, අවුල් කිරීමට වඩා ඉහත පරිදි චිත්ර ඇඳීම සීමා කිරීම පහසුය numberOfLines
.
PS ඔබට පහසුවෙන් UIViewContentMode සඳහා මේ ආකාරයෙන් සහය දැක්විය හැකිය:
- (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]
. ඔබට ස්තුතියි!
මෙය පැරණි විසඳුමකි, iOS> = 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