UILabel තුළ පෙළ ඉහළට සිරස් අතට පෙළගස්වන්න


2182

UILabelපෙළ පේළි දෙකක් සඳහා මට ඉඩක් ඇත. සමහර විට, පෙළ ඉතා කෙටි වූ විට, මෙම පා the ය ලේබලයේ සිරස් කේන්ද්‍රයේ දර්ශනය වේ.

සෑම විටම ඉහළින්ම සිටීමට පෙළ සිරස් අතට පෙළගස්වන්නේ UILabelකෙසේද?

සිරස් කේන්ද්‍රගත පෙළක් සහිත UILabel නිරූපණය කරන රූපය

Answers:


2705

A හි සිරස්-පෙළගැස්ම සැකසීමට ක්‍රමයක් නැත UILabel, නමුත් ලේබලයේ රාමුව වෙනස් කිරීමෙන් ඔබට එකම බලපෑමක් ලබා ගත හැකිය. මම මගේ ලේබල් තැඹිලි පාට කර ඇති නිසා ඔබට සිදුවන්නේ කුමක්ද යන්න පැහැදිලිව දැකගත හැකිය.

මෙය කිරීමට ඉක්මන් හා පහසුම ක්‍රමය මෙන්න:

    [myLabel sizeToFit];

sizeToFit ලේබලයක් මිරිකීමට


ඔබ එකකට වඩා වැඩි රේඛාව බවට පත් කරන බව තවදුරටත් පෙළ සමග ලේබලය තිබේ නම්, කට්ටලයක් numberOfLinesසඳහා 0(ශුන්ය මෙතන රේඛා මෙඩි අදහස්).

    myLabel.numberOfLines = 0;
    [myLabel sizeToFit];

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;

10
ඔබට ස්වයංක්‍රීයව ඉවත් කිරීම අවශ්‍යයි
hangbm06

4
ගැටළුව විසඳීම සඳහා සරල ක්‍රමයක් මෙන්න: stackoverflow.com/a/26632490/636559
AboulEinein

ඔබ ස්වයංක්‍රීය පිරිසැලසුම සහ කතන්දර පුවරුව භාවිතා කරන්නේ නම්, පරීක්ෂා කරන ලද “ගොඩනඟන වේලාවේදී ඉවත් කරන්න” යන විකල්පය සමඟ බාධකයක් එකතු කිරීම උපකාරී වනු ඇත
JK ABC

ඔබට මෙය වැඩ කිරීමට අවශ්‍ය adjustsFontSizeToFitWidthනම් sizeToFit භාවිතා කර ලේබලයේ රාමුව 0, 0 ලෙස සකසන්න, TheWidthYouWant, label.frame.size.height (මෙය sizeToFit මගින් තීරණය කරන නව උස වේ) එවිට අදාළ වේadjustsFontSizeToFitWidth
ඇල්බට් රෙන්ෂෝ

3
මෙම පිළිතුර අනවශ්‍ය ලෙස සංකීර්ණ වන අතර එය "අවට වචනයක්" භාවිතා කරයි. සිරස් අන්තර්ගත වැළඳ ගැනීමේ ප්‍රමුඛතාවය සරලව වෙනස් කිරීම සඳහා කරුණාකර පහත යෝජනාව බලන්න. කිසිදු කේතයක් අවශ්‍ය නොවේ ...
බීට්රි

335
  1. නව පෙළ සකසන්න:

    myLabel.text = @"Some Text"
  2. maximum numberපේළි ගණන 0 (ස්වයංක්‍රීය) ලෙස සකසන්න :

    myLabel.numberOfLines = 0
  3. ලේබලයේ රාමුව උපරිම ප්‍රමාණයට සකසන්න:

    myLabel.frame = CGRectMake(20,20,200,800)
  4. sizeToFitරාමු ප්‍රමාණය අඩු කිරීමට අමතන්න එවිට අන්තර්ගතය ගැලපේ:

    [myLabel sizeToFit]

ලේබල රාමුව දැන් ඔබේ පෙළට සරිලන තරම් ඉහළ සහ පළලයි. ඉහළ වම්පස නොවෙනස් විය යුතුය. මම මෙය අත්හදා බැලුවේ ඉහළ වම්පස පෙළගැස්වූ පෙළ සමඟ පමණි. වෙනත් පෙළගැස්වීම් සඳහා, ඔබට පසුව රාමුව වෙනස් කිරීමට සිදුවනු ඇත.

එසේම, මගේ ලේබලයේ වචන එතීම සක්‍රීය කර ඇත.


හේයි බෙන්, මම නැවතත් මගේ පැරණි කේතය දෙස බැලුවෙමි, අවශ්‍ය නිවැරදි පියවර සමඟ මගේ පිළිතුර යාවත්කාලීන කළෙමි.
ජාකොබ් එගර්

මෙය මට හොඳින් ක්‍රියාත්මක විය. මම මගේ UILabel හි මානයන් සකසා අංක OfLines IB හි 0 ලෙස වෙනස් කර පසුව [myLabel sizeToFit] යනුවෙන් පෙළ සැකසූ පසු.
ඩෑන් එලිස්

Attr හි පේළි ගණන සැකසීමෙන් පසුව මට හොඳින් ක්‍රියා කරයි. පරීක්ෂක
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පසුපස ලුහුබඳින ප්‍රවාහනය නොසලකා හරින බව පෙනේ :(

ඒ හා සමානව, 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 පෙළ පැවරුම පසු.


@DS VerticalAlignපසු වරහන් අතර ඔබ එකතු කරන බව මම දුටුවෙමි @implementation UILabel. පරමාර්ථ-සී වෙත අළුත් වීම මම මීට පෙර මෙම වාක්‍ය ඛණ්ඩය හරහා දිව ගොස් නැත. මෙය හඳුන්වන්නේ කුමක්ද?
ජූලියන්

විස්මය දනවන, ප්‍රවර්ග ගැන දැන නොසිටි අතර, මෙය මට පරමාර්ථ-සී භාෂාව පිළිබඳ තවත් ඇගයීමක් ලබා දෙයි. හොඳ ක්‍රමලේඛකයෙකු වීමට තවත් භාෂා ඉගෙනීම ඉතා වැදගත් වේ.
ජෙරොයින් අයිජ්කොෆ්

උඩු යටිකුරු කිරීමක් කළේය. නමුත් අවාසියක් වන රේඛා ගණන ඔබ නොදන්නේ නම් මෙය ක්‍රියා නොකරනු ඇත
Tjirp

මට පෙළ පේළි 3 ක් පෙන්විය යුතු අතර පෙළ ඉහළට පෙළගස්වන්න. ඉතින්, මම පේළි ගණන 3 ට සැකසිය යුතුද? මම එය 3 ට සැකසූ විට, පෙළ අඩු නම් (එය එක් පේළියකට ගැලපේ) "..." මට පෙනේ. මෙය වළක්වා ගන්නේ කෙසේද "..."
සත්‍යම්

1
මම මෙම කාණ්ඩයේ සංස්කරණයක් පළ කළෙමි, එය ඉක්මනින් අනුමත වනු ඇතැයි බලාපොරොත්තු වෙමි. ක්‍රම sizeWithFont:constrainedToSize:lineBreakMode:සහ ප්‍රමාණය විත් ෆොන්ට්: දෙකම iOS7 හි ක්ෂය වී ඇත. එසේම, මෙම කාණ්ඩය ක්‍රියාත්මක වන්නේ අංක ඕෆ්ලයින් 0 ට වඩා වැඩි වූ විට පමණි.
timgcarlson

146

යන්තම් නඩුවේ එය ඕනෑම කෙනෙකුට ඕනෑම උදව්, මම එම ප්රශ්නය තිබූ නමුත් සරලව භාවිතා මාරු වූ විට මෙම ප්රශ්නය විසඳා ගැනීමට ඔබට හැකි විය UILabelභාවිතා කිරීමට UITextView. ක්‍රියාකාරීත්වය ටිකක් වෙනස් නිසා මෙය සෑම කෙනෙකුටම නොවන බව මම අගය කරමි.

ඔබ භාවිතයට මාරුවන්නේ නම් UITextView, ඔබට සියලු අනුචලන දර්ශන ගුණාංග මෙන්ම පරිශීලක අන්තර්ක්‍රියා සක්‍රීය කර ඇත ... මෙය ලේබලයක් මෙන් ක්‍රියා කිරීමට බල කරයි.

රූප විස්තරය මෙහි ඇතුළත් කරන්න


1
බොහෝ UILabels පෙළ දසුන් බවට පරිවර්තනය කළහොත් මෙය ක්‍රියාකාරීත්වයට බලපාන්නේ කෙසේදැයි විශ්වාස නැත.
නින්ජනීර්

2
මෙම ත්‍රෙඩ් එකේ ඇති අනෙක් සියලුම විසඳුම් iOS 7 හි මට වැඩ කළේ නැත (කුමන හේතුවක් නිසාද). නමුත් හුදෙක් භාවිතා කිරීමෙන් UITextViewමට අපේක්ෂිත ප්‍රති result ලය එකවරම ලැබුණි.
ක්ලිෆ්ටන් ලැබ්රම්

1
එය ක්‍රියාකාරීත්වයකි, එය සත්‍ය ලෙස පෙනීම සඳහා තවමත් යම් යම් වෙනස්කම් අවශ්‍ය වේ, නමුත් ඇත්ත වශයෙන්ම මෙය මා දුටු පහසුම කේත විසඳුම නොවේ.
ඉටායි ස්පෙක්ටර්

1
මම මේ විසඳුමට කැමතියි. කාර්ය සාධන ගැටළු තිබිය හැකි අතර, සාපේක්ෂව සරල දෘෂ්ටියක සරල ලේබලයක් සඳහා, මෙය මට අවශ්‍ය දේ සඳහා පරිපූර්ණ විය (සහ මට කිසිදු කාර්ය සාධන බලපෑමක්
නොපෙනේ

1
මෙම ක්‍රමයේ ඇති කුඩා අඩුපාඩුවක් නම්, එය පෙළට අමතර සහජ පෑඩින් හඳුන්වා දීමයි. ඉක්මන් විසඳුමක් නම් negative ණාත්මක බාධකයක් හඳුන්වා දීමයි.
සිරා ලැම්

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.vasilev

3
මෙහි ඇති හොඳම පිළිතුර, සෑම අවස්ථාවකම ක්‍රියාත්මක වේ. UITableviewCell හි ලේබලය තිබේ නම් sizeToFit ක්‍රියා නොකරයි. හොඳ වැඩක්.
රාජත් චෞහාන්

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

sizeWithFont අතහැර දමන ලදි
tdios

69

කතන්දර පුවරුව භාවිතයෙන් පහසුම ප්‍රවේශය:

Embed ලේබල් දී StackView පහත සඳහන් ලක්ෂණය පරීක්ෂකගේ StackView ගුණාංග දෙකක් සහ කුලකය:

1- AxisසිටHorizontal ,

2- AlignmentසිටTop

රූප විස්තරය මෙහි ඇතුළත් කරන්න


1
වඩා හොඳ ප්‍රති results ල සඳහා ඔබට මෙම StackView> View> UILabel කළ හැකිය, මන්ද ඔබ StackView තුළ UILabel එකක් කාවැද්දූ විට, StackView UILabel අවම ප්‍රමාණයට ගැලපෙන පරිදි ප්‍රමාණය වෙනස් කරයි
ඩැනියෙල් බෙල්ට්‍රාමි

UILabelසමහර UIViewඋප පංතියකට ස්ථානගත කිරීම සඳහා හොඳ අදහසක් (තැනිතලා UIViewසාමාන්‍යයෙන් ප්‍රමාණවත්) සහ එම ලේබලය පහළ දිශාවට වර්ධනය වීමට ඉඩ දෙන්න. ස්තූතියි!
වික්ටර් කුසේරා

1
නියමයි! ඔබට ඇති බාධක ඉවත් කර UILabelStackView හට එහි කාර්යය කිරීමට ඉඩ දිය යුතු බව ද සඳහන් කිරීම වටී . ස්තූතියි!
ලුයිස් ඩයස්

ඔබේ ලේබලය තෝරාගෙන ඇති සංස්කාරක-> කාවැද්දූ මෙනු විධානය සමඟ, ලේබල් අවහිරතා ඔබ වෙනුවෙන් Xcode මඟින් ඉවත් කරනු ලැබේ, එවිට ඔබට StackView සඳහා සීමාවන් සැකසිය හැකිය. මෙම ප්‍රවේශය 'ස්විෆ්ට්යූඅයි' පිරිසැලසුම් ප්‍රවේශයකට සමීප වේ.
රොකට් වත්ත

68

මෙය ඉටු කර ගැනීම සඳහා ඊටත් වඩා ඉක්මන් (හා අපිරිසිදු) ක්‍රමයක් වන්නේ UILabel හි රේඛීය කඩන මාදිලිය "ක්ලිප්" ලෙස සැකසීම සහ නව රේඛා ප්‍රමාණයක් එකතු කිරීමයි.

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

මෙම විසඳුම සෑම කෙනෙකුටම ක්‍රියාත්මක නොවනු ඇත - විශේෂයෙන්, ඔබේ නූල අවසානයේ "..." පෙන්වීමට ඔබට අවශ්‍ය නම් එය ඔබ පෙන්වන රේඛා ගණන ඉක්මවා ගියහොත්, ඔබට එකක් භාවිතා කිරීමට අවශ්‍ය වේ කේතයේ දිගු බිටු - නමුත් බොහෝ අවස්ථාවන් සඳහා මෙය ඔබට අවශ්‍ය දේ ලබා ගනී.


3
රේඛා කඩන මාදිලිය 'ක්ලිප්' ලෙස සැකසීම ලේබලයේ ස්වයංක්‍රීය ප්‍රමාණය අවුල් කරන බවක් පෙනේ. UILineBreakModeWordWrapඒ වෙනුවට භාවිතා කරන්න .
නීල්ස් වැන් ඩර් රෙස්ට්

වඩා හොඳ අවකාශයන් එක් කරන්න "\ n \ n"
djdance

60

UILabelඔබ වෙනුවට UITextFieldසිරස් පෙළගැස්වීමේ විකල්පයක් ඇති භාවිතා කළ හැකිය:

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

7
Caveat: UITextField ඉඩ දෙන්නේ තනි පෙළ පේළියකට පමණි.
ඩේවිඩ් ජේම්ස්

2
Av ඩේවිඩ් ඩේවිස්ගේ අදහස් සම්පූර්ණ කිරීම සඳහා: UITextView වඩාත් සුදුසු වනු ඇත
සෙඩ්රික්සූබ්‍රි

49

මම මේ සමඟ දීර් long කාලයක් තිස්සේ අරගල කර ඇති අතර මගේ විසඳුම බෙදා ගැනීමට මට අවශ්‍ය විය.

මෙය ඔබට UILabelපෙළ 0.5 ක් දක්වා ස්වයංක්‍රීයව මුද්‍රණය කර සිරස් අතට පෙළ කේන්ද්‍රගත කරයි. මෙම විකල්පයන් ස්ටෝරිබෝඩ් / අයිබී හි ද ඇත.

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

සපයන ලද සියලුම පිළිතුරු අතර එය පරිපූර්ණ ලෙස ක්‍රියා කළේය. ස්තූතියි av ඩේවිඩ් ග්‍රීකෝ. මෙම ගුණාංග සමඟ, අපි ගැලපුම් ෆොන්ට්සයිස් ටොෆිට්විත් ඔව් ලෙස සකසන්නේ නම්, ලේබලයේ රාමුව වෙනස් නොකර පෙළ රාමුවට ගැලපේ.
අශෝක්

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කිසිදු ඔබ ගතිකව දීර්ඝ එකක් හෝ අනෙක් අතට උප සමඟ කෙටි පෙළ වෙනුවට පවා නම්, ඉහළ පෙළ.
ස්නැක්

38

රූප විස්තරය මෙහි ඇතුළත් කරන්න

අතුරුමුහුණත තුළ

  • UILabelහැකි විශාලතම පා of යේ ප්‍රමාණයට සකසන්න
  • Linesගුණාංග පරීක්ෂක හි '0' ලෙස සකසන්න

ඔබේ කේතය තුළ

  • ලේබලයේ පෙළ සකසන්න
  • sizeToFitඔබේ ලේබලය අමතන්න

කේත ස්නිපෙට්:

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

මගේ නඩුවේදී හැර 2 ට පේළි සැකසීමට අවශ්‍ය විය - UITableViewCell තුළ UILabel එකක් තබා 0 ට සැකසීම එය අතිච්ඡාදනය විය, නමුත් 2 වැඩකටයුතු සැකසීම (සෛලයට පේළි 2 ක් සඳහා ප්‍රමාණවත් ඉඩක් ඇත)
eselk

34

අනුවර්තී UI සඳහා (iOS8 හෝ ඊට පසු), UILabel හි සිරස් පෙළගැස්ම StoryBoard වෙතින් noOfLines= 0` සහ

අවහිරතා

  1. UILabel LefMargin, RightMargin සහ ඉහළ ආන්තික සීමාවන් සකස් කිරීම.

  2. වෙනස් කරන්න Content Compression Resistance Priority For Vertical= 1000` ඒ නිසා එම සිරස්> තිරස්.

UILabel හි අවහිරතා

සංස්කරණය කළේ:

noOfLines=0

අපේක්ෂිත ප්‍රති .ල ලබා ගැනීම සඳහා පහත සඳහන් සීමාවන් ප්‍රමාණවත් වේ.

රූප විස්තරය මෙහි ඇතුළත් කරන්න


මෙය නියමයි. සිරස්> තිරස් අතට එම කාර්යය කළේ මන්දැයි ඔබට පැහැදිලි කළ හැකිද? ස්තූතියි.
ගේබ්‍රියෙල්

33

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

මෙහි සාකච්ඡා කළ පරිදි .


27

මෙම අරමුණු සාක්ෂාත් කර ගැනීම සඳහා මම උපයෝගීතා ශ්‍රිතයක් ලිවීමි. ඔබට බලන්න පුළුවන්:

// බහු රේඛා ලේබලයක උස සිරස් අතට ඉහළින් පෙළගස්වන්න
+ (අවලංගු) 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


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

23

මගේ යෙදුමේ මා කළේ UILabel හි රේඛීය දේපල 0 ලෙස සැකසීම මෙන්ම UILabel හි පහළ අවහිරයක් නිර්මාණය කිරීම සහ පහත රූපයේ දැක්වෙන පරිදි එය> = 0 ලෙස සකසා ඇති බවට වග බලා ගැනීමයි. රූප විස්තරය මෙහි ඇතුළත් කරන්න


මෙය පිළිගත් පිළිතුර නොවන්නේ මන්දැයි මට අදහසක් නැත. වඩා සරල ය. හොඳ පිළිතුරක්!
AndroidDev

19

මම මෙහි යෝජනා ගෙන 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

19

ඔබට TTTAttributedLabel භාවිතා කළ හැකිය , එය සිරස් පෙලගැස්මට සහාය වේ.

@property (nonatomic) TTTAttributedLabel* label;
<...>

//view's or viewController's init method
_label.verticalAlignment = TTTAttributedLabelVerticalAlignmentTop;

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 සකසන්න.

මන්ද සමහර විට හොඳටම ඇති තරම් හොඳය .


කෙසේ වෙතත්, ඔහු iOS උපාංගවල තිරයේ විශාලත්වයේ විචලනය සැලකිල්ලට ගෙන, උයිලාබල් වෙනස් කිරීමේ උස ගණනය කිරීම සඳහා විචල්‍ය '\ n' සංඛ්‍යාවක් අවශ්‍ය වේ (එය හැකියාවක්). එබැවින් මෙම ක්රමය දිගු කාලීනව විශේෂයෙන් ප්රයෝජනවත් නොවේ.
රම්බටිනෝ

සටහන: "ඉක්මන් හා අපිරිසිදු" නොවේ "සෑම විටම පරිපූර්ණ විසඳුමක්." කියන්න.
කෝඩ් රෝඩි

2
Ode කෝඩ් රෝඩි ඉක්මන් හා අපිරිසිදු මා වෙනුවෙන් උපක්‍රමයක් කළා, මට සැබෑ පිළිතුර සමඟ පිරිසැලසුම් ගැටළු කිහිපයක් තිබුණි. මට එය "නිවැරදි මාර්ගය" කළ හැකි නමුත් මට යම් කාලයක් ඉතිරි කිරීම ගැන ස්තූතියි!
සෙරෆින් හොචාර්ට්

GdGambit කරුණාකර සටහන් කරන්න: "ඉක්මන් හා අපිරිසිදු "
කෝඩ් රෝඩි

1
දර්ශන ගතිකව පැටවීමේදී මම මෑතකදී ඉගෙන ගත් දෙයක් නම්, පෙළ ආදානය සඳහා සහය දැක්වීම සඳහා UITextViewඑය ඇමතිය හැකි dlopenබවයි. මෙය UI නූල් මත විශාල පසුබෑමකට හේතු විය හැක, එබැවින් මෙම ප්‍රවේශය වඩාත් ක්‍රියාකාරී වේ!
yano

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. මෙම සං component ටකය මා විසින් සාදන ලද්දක් නොවේ, නමුත් එය මම නිතර භාවිතා කරන අංගයක් වන අතර විශේෂාංග ටොන් ගණනක් ඇති අතර එය හොඳින් ක්‍රියාත්මක වන බව පෙනේ.


12

භාවිතා කරන්න 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
මේ පිළිතුර ලබා දිය යුතුය මාර්ගය වැඩි upvotes එය මෙතෙක් ලස්සනම හා පිරිසිදුම විසඳුමක් ලෙස!
මයිකල් ඕච්ස්

11

ඔබේ ලේබලය තුළ ඇති පෙළ සිරස් අතට කේන්ද්‍රගත වී නැති නිසා මෙය කියවන ඕනෑම කෙනෙකුට, සමහර අකුරු වර්ග සමානව නිර්මාණය කර නොමැති බව මතක තබා ගන්න. උදාහරණයක් ලෙස, ඔබ zapfino ප්‍රමාණය 16 සහිත ලේබලයක් සාදන්නේ නම්, පෙළ සිරස් අතට කේන්ද්‍රගත වී නොමැති බව ඔබට පෙනෙනු ඇත.

කෙසේ වෙතත්, හෙල්වෙටිකා සමඟ වැඩ කිරීමෙන් ඔබේ පෙළ සිරස් අතට කේන්ද්‍රගත වේ.


බොහෝ අභිරුචි අකුරු සිරස් කේන්ද්‍රගත නොවේ. UILabel හෝ UITextView සෑම විටම සිරස් කේන්ද්‍රය පෙළගස්වා ඇත. IOS ක්‍රමලේඛනයේ සිරස් පෙළගැස්ම ගැන සිතීමට අවශ්‍ය නැත.
අමිත් සිං

10

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

10

ඔබ ස්වයංක්‍රීයව භාවිතා කරන්නේ නම්, කේතයෙන් හෝ අයි.බී. වලින් සිරස් අන්තර්ගතය හග්ගිං ප්‍රමුඛතාවය 1000 ලෙස සකසන්න. IB හි දී ඔබට 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]. ඔබට ස්තුතියි!
velkoon

7

මෙය පැරණි විසඳුමකි, iOS> = 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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.