UILabel'deki metni dikey olarak hizalay─▒n


Al─▒nan cevaba git


UILabel ─░ki sat─▒rl─▒k bir metin i├žin yerim var . Bazen, metin ├žok k─▒sa oldu─čunda, bu metin etiketin dikey merkezinde g├Âr├╝nt├╝lenir.

Metni her zaman en ├╝st├╝nde olacak ┼čekilde dikey olarak nas─▒l hizalayabilirim UILabel ?


dikey merkezli metin i├žeren bir UILabel'i temsil eden g├Âr├╝nt├╝


2126









Cevap say─▒s─▒n─▒ say: 30






Dikey hizalamay─▒ a ├╝zerine ayarlaman─▒n bir yolu yoktur UILabel , ancak etiketin ├žer├ževesini de─či┼čtirerek ayn─▒ efekti elde edebilirsiniz. Etiketlerimi turuncu yapt─▒m, b├Âylece neler oldu─čunu a├ž─▒k├ža g├Ârebileceksin.

─░┼čte bunu yapman─▒n h─▒zl─▒ ve kolay yolu:

     [myLabel sizeToFit];
 


Bir etiketi s─▒kmak i├žin sizeToFit


Birden fazla sat─▒r, set yapacak daha uzun metin ile bir etiketi varsa numberOfLines i├žin 0 (s─▒f─▒r burada ├žizgilerin s─▒n─▒rs─▒z say─▒da anlam─▒na gelir).

     myLabel.numberOfLines = 0;
    [myLabel sizeToFit];
 


SizeToFit ile daha uzun etiket metni


Daha uzun versiyon

Etiketimi kodda yapaca─č─▒m, b├Âylece neler oldu─čunu g├Ârebilirsiniz. Bunlar─▒n ├žo─čunu Aray├╝z Olu┼čturucu'da da ayarlayabilirsiniz. Ayarlar─▒m, kenar bo┼čluklar─▒n─▒ (20 puan) g├Âstermek i├žin Photoshop'ta yapt─▒─č─▒m arkaplan resmine sahip G├Âr├╝n├╝m Tabanl─▒ bir Uygulamad─▒r. Etiket ├žekici bir turuncu renktir, b├Âylece boyutlarda neler olup bitti─čini g├Ârebilirsiniz.

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

Kullanman─▒n baz─▒ s─▒n─▒rlamalar─▒, sizeToFit orta ya da sa─ča hizal─▒ bir metinle ortaya ├ž─▒kar. ─░┼čte olanlar:

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

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


g├Âr├╝nt├╝ tan─▒m─▒n─▒ buraya girin

Etiket hala sol ├╝st k├Â┼čede sabit olarak boyutland─▒r─▒lm─▒┼čt─▒r. Orijinal etiketin geni┼čli─čini bir de─či┼čkene kaydedebilir ve daha sonra ayarlayabilirsiniz sizeToFit veya bu sorunlar─▒ gidermek i├žin sabit bir geni┼člik verebilirsiniz:

     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;
 


etiket hizalamas─▒


sizeToFit ─░lk etiketinizin minimum geni┼čli─čine uygun olaca─č─▒n─▒ unutmay─▒n . 100 geni┼čli─činde bir etiketle ba┼člarsan─▒z ve sizeToFit onu ├ža─č─▒r─▒rsan─▒z , size 100 (veya biraz daha az) geni┼člikte bir (muhtemelen ├žok uzun) etiketi geri verir. Yeniden boyutland─▒rmadan ├Ânce etiketinizi istedi─činiz minimum geni┼čli─če ayarlamak isteyebilirsiniz.


├çer├ževe geni┼čli─čini yeniden boyutland─▒rarak etiket hizalamas─▒n─▒ d├╝zeltin

Dikkat edilecek di─čer ┼čeyler:

Buna lineBreakMode sayg─▒ g├Âsterilip g├Âsterilmedi─či, nas─▒l ayarland─▒─č─▒na ba─čl─▒d─▒r. NSLineBreakByTruncatingTail (varsay─▒lan) sizeToFit di─čer iki kesme modundan (ba┼č ve orta) sonra dikkate al─▒nmaz . NSLineBreakByClipping ayr─▒ca g├Âz ard─▒ edilir. NSLineBreakByCharWrapping her zamanki gibi ├žal─▒┼č─▒r. ├çer├ževe geni┼čli─či, en sa─čdaki harfe uyacak ┼čekilde daralmaktad─▒r.


Mark Amery , yorumlarda Otomatik D├╝zen'i kullanarak NIB'ler ve Storyboard'lar i├žin bir d├╝zeltme yapt─▒:

Etiket bir subview bir u├ž veya g├Ârsel dahil edilirse view kullan─▒r sonra koyarak autoLayout bir viewController ait sizeToFit i├žine ├ža─čr─▒y─▒ viewDidLoad autolayout boyutlar─▒ ve konumlar─▒ subviews sonra ├ž├╝nk├╝ olmaz i┼čin viewDidLoad denir ve etkilerini geri derhal olacak senin sizeToFit aramak. Ancak, sizeToFit i├žeriden viewDidLayoutSubviews aramak i┼če yarayacakt─▒r.


Orijinal Cevab─▒m (gelecek / referans i├žin):

Bu, bir dizgeye s─▒─čd─▒rmak i├žin gereken kare y├╝ksekli─čini hesaplamak i├žin NSString y├Ântemi kullan─▒r sizeWithFont:constrainedToSize:lineBreakMode: , sonra orijini ve geni┼čli─či ayarlar.

Eklemek istedi─činiz metni kullanarak etiketin ├žer├ževesini yeniden boyutland─▒r─▒n. Bu ┼čekilde istedi─činiz say─▒da sat─▒r─▒ bar─▒nd─▒rabilirsiniz.

 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;
 

2671







  1. Yeni metni ayarla:

     myLabel.text = @"Some Text"
     
  2. Set maximum number (otomatik) 0 hatlar─▒:

     myLabel.numberOfLines = 0
     
  3. Etiketin ├žer├ževesini maksimum boyuta ayarlay─▒n:

     myLabel.frame = CGRectMake(20,20,200,800)
     
  4. sizeToFit Kare boyutunu k├╝├ž├╝ltmek i├žin ├ža─čr─▒ yap─▒n, b├Âylece i├žerik uygun olsun:

     [myLabel sizeToFit]
     

Etiketler ├žer├ževesi ┼čimdi metninize uyacak kadar y├╝ksek ve geni┼č. Sol ├╝st k─▒s─▒m de─či┼čmemelidir. Bunu yaln─▒zca sola hizal─▒ bir metinle test ettim. Di─čer hizalamalar i├žin, ├žer├ževeyi daha sonra de─či┼čtirmeniz gerekebilir.

Ayr─▒ca, etiketimde kelime kayd─▒rma etkin.


331







Uzatma ├ž├Âz├╝m├╝ne at─▒fta bulunarak:

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

ile de─či┼čtirilmelidir

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

Eklenen her yeni sat─▒rda ek alana ihtiya├ž vard─▒r, ├ž├╝nk├╝ iPhone'un UILabels sondaki sat─▒r─▒n─▒n iadesi yok say─▒l─▒yor gibi g├Âr├╝nmektedir :(

Benzer ┼čekilde, alignBottom da (cycle = int ... = 0 ... "ile de─či┼čtirilmelidir) ├ževrim i├ži @" \[email protected]%" yerine de g├╝ncellenmelidir "\[email protected]%" .

A┼ča─č─▒daki uzant─▒ benim i├žin ├žal─▒┼č─▒yor:

 // -- 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
 

Ard─▒ndan [yourLabel alignTop]; ya da [yourLabel alignBottom]; her bir Liziniz metin atamas─▒ndan sonra aray─▒n .


157







Sadece kimseye herhangi bir yard─▒m var bu durumda, ben de ayn─▒ problem vard─▒ ama sadece kullanarak ge├ži┼č yaparak sorunu ├ž├Âzmeyi ba┼čard─▒ UILabel kullanmadan UITextView . Bunun herkes i├žin olmad─▒─č─▒n─▒ d├╝┼č├╝n├╝yorum, ├ž├╝nk├╝ i┼člevsellik biraz farkl─▒.

Kullanmaya UITextView ge├žerseniz, Scroll View ├Âzelliklerinin yan─▒ s─▒ra Kullan─▒c─▒ Etkile┼čimi Etkin ... ├Âzelli─čini devre d─▒┼č─▒ b─▒rakabilirsiniz ... Bu, etiket gibi g├Âr├╝nmesini zorlar.


g├Âr├╝nt├╝ tan─▒m─▒n─▒ buraya girin


142







Yaygara yok, yaygara yok

 @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
 

Yaygara yok, Ama├ž-c yok, Yaygara yok ama Swift 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)
    }

}
 

108







Yukar─▒daki cevab─▒ be─čen, ama tam olarak do─čru de─čildi, ya da tokatlamak kolay de─čildi, bu y├╝zden biraz temizledim. Bu uzant─▒y─▒ kendi .h ve .m dosyalar─▒na ekleyin veya kullanmak istedi─činiz uygulaman─▒n hemen ├╝st├╝ne yap─▒┼čt─▒r─▒n:

 #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
 

Ve sonra kullanmak i├žin, metninizi etikete yerle┼čtirin ve hizalamak i├žin uygun y├Ântemi ├ža─č─▒r─▒n:

 [myLabel alignTop];
 

veya

 [myLabel alignBottom];
 

77







Bunu ba┼čarman─▒n daha h─▒zl─▒ (ve daha kirli) bir yolu UILabel'in sat─▒r sonu modunu "Klip" olarak ayarlamak ve sabit miktarda yeni sat─▒r ekleyerek yapmakt─▒r.

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

Bu ├ž├Âz├╝m herkes i├žin i┼če yaramaz - ├Âzellikle, dizenin sonunda "..." ifadesini g├Âstermek istiyorsan─▒z, g├Âsterdi─činiz sat─▒r say─▒s─▒n─▒ a┼č─▒yorsan─▒z, bunlardan birini kullanman─▒z gerekir. daha uzun kod par├žalar─▒ - ancak ├žo─ču durumda bu size ihtiyac─▒n─▒z olan─▒ verir.


69







Bunun yerine , dikey hizalama se├žene─čine sahip olanlar─▒ UILabel kullanabilirsiniz UITextField :

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

61







Storyboard'u kullanarak en kolay yakla┼č─▒m:

G├Âm Etiket i├žinde StackView ├ľzellik Inspector'da StackView iki nitelikler a┼ča─č─▒daki ve seti:

1- Axis i├žin Horizontal ,

2- Alignment ila Top


g├Âr├╝nt├╝ tan─▒m─▒n─▒ buraya girin


51


2017-03-28





Uzun zamand─▒r bununla m├╝cadele ettim ve ├ž├Âz├╝m├╝m├╝ payla┼čmak istedim.

Bu, UILabel metni 0,5 teraziye kadar otomatik olarak k├╝├ž├╝ltecek ve metni dikey olarak ortalayacak bir de─čer verecektir . Bu se├ženekler ayr─▒ca Storyboard / IB'de de mevcuttur.

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

49







Yeni bir s─▒n─▒f olu┼čtur

LabelTopAlign

.h dosyas─▒

 #import <UIKit/UIKit.h>


@interface KwLabelTopAlign : UILabel {

}

@end
 

.m dosyas─▒

 #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
 

D├╝zenle

─░┼čte ayn─▒ ┼čeyi yapan daha basit bir uygulama:

 #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
 

43








g├Âr├╝nt├╝ tan─▒m─▒n─▒ buraya girin

Aray├╝z Olu┼čturucu'da

  • UILabel M├╝mk├╝n olan en b├╝y├╝k Metnin boyutuna ayarlay─▒n
  • Lines ├ľznitelik Denet├žisinde '0' olarak ayarlay─▒n

Kodunuzda

  • Etiketin metnini ayarlay─▒n
  • ├ça─čr─▒ sizeToFit senin etiketinde

Kod Par├žac─▒─č─▒:

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

38







Uyarlamal─▒ Kullan─▒c─▒ Arabirimi (iOS8 veya sonras─▒) i├žin, UILabel'in Dikey Hizalamas─▒, ├ľzellikler noOfLines = 0` de─či┼čtirilerek StoryBoard'dan ayarlanacak

K─▒s─▒tlamalar

  1. UILabel LefMargin, RightMargin ve Top Margin K─▒s─▒tlamalar─▒n─▒ Ayarlama.

  2. De─či┼čim Content Compression Resistance Priority For Vertical = 1000` B├Âylece Dikey> Yatay.


UILabel'in K─▒s─▒tlamalar─▒

D├╝zenlendi:

 noOfLines=0
 

ve a┼ča─č─▒daki k─▒s─▒tlamalar istenen sonu├žlar─▒ elde etmek i├žin yeterlidir.


g├Âr├╝nt├╝ tan─▒m─▒n─▒ buraya girin


34







UILabel'in bir alt s─▒n─▒f─▒n─▒ olu┼čturun. ├çALI┼×IYOR bir cazibe gibi:

 // 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
 

As tart─▒┼č─▒lan burada .


33







Bu amaca ula┼čmak i├žin bir util i┼člevi yazd─▒m. Bir g├Âz atabilirsiniz:

// dikey olarak ├╝ste gelecek ┼čekilde hizalamak i├žin ├žok sat─▒rl─▒ bir etiketin y├╝ksekli─čini ayarlay─▒n
+ (ge├žersiz) alignLabelWithTop: (UILabel *) etiketi {
  CGSize maxSize = CGSizeMake (label.frame.size.width, 999);
  label.adjustsFontSizeToFitWidth = NO;

  // ger├žek y├╝ksekli─či al
  CGSize actualSize = [label.text sizeWithFont: label.font constrainedToSize: maxSize lineBreakMode: label.lineBreakMode];
  CGRect rect = label.frame;
  rect.size.height = actualSize.height;
  label.frame = rect;
}

.Nas─▒l kullan─▒l─▒r? (LblHello, Arabirim olu┼čturucusu taraf─▒ndan olu┼čturulmu┼čsa, baz─▒ UILabel ├Âznitelik ayr─▒nt─▒lar─▒n─▒ atlar─▒m)

lblHello.text = @ "Merhaba D├╝nya! Merhaba D├╝nya! Merhaba D├╝nya! Merhaba D├╝nya! Merhaba D├╝nya! Merhaba D├╝nya! Merhaba D├╝nya! Merhaba D├╝nya!";
lblHello.numberOfLines = 5;
[AlignLabelWithTop: lblHello] i┼člevini kullan─▒r;

Ayr─▒ca blogumda bir makale olarak yazd─▒m: http://fstoke.me/blog/?p=2819


27







Girilen sayfadaki kodu ve kodu okumak i├žin biraz zaman ay─▒rd─▒m ve hepsinin etiketin kare boyutunu de─či┼čtirmeye ├žal─▒┼čt─▒klar─▒n─▒ belirledim, b├Âylece varsay─▒lan orta dikey hizalama g├Âr├╝nmez.

Bununla birlikte, baz─▒ durumlarda, etiketin ├žok fazla metni olsa bile (├Ârne─čin e┼čit y├╝kseklikte birden ├žok sat─▒r) etiketin t├╝m bu alanlar─▒ i┼čgal etmesini istiyoruz.

Burada, etiketi sonuna kadar basit├že yeni sat─▒rlar ekleyerek ├ž├Âzmek i├žin alternatif bir yol kulland─▒m (pls ger├žekten miras ald─▒─č─▒m─▒ UILabel ancak gerekli olmad─▒─č─▒na dikkat edin ):

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

26







Buradaki ├Ânerileri ald─▒m ve bir UILabel'i sarabilecek ve boyutland─▒racak ve sat─▒r say─▒s─▒n─▒ ├╝ste gelecek ┼čekilde ayarlayabilecek bir g├Âr├╝n├╝m olu┼čturdum. Basit├že bir UILabel'i alt g├Âr├╝n├╝m olarak koyun:

 @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


2010-12-14





TTTAttributedLabel'i kullanabilirsiniz , dikey hizalamay─▒ destekler.

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

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

18







Bu sorunun cevaplar─▒n─▒ art─▒k biraz eski buldum, o y├╝zden bunu otomatik d├╝zen hayranlar─▒ i├žin ekledim.

Otomatik d├╝zen bu sorunu olduk├ža ├Ânemsiz hale getirir. Etiketi ekledi─čimizi varsayarsak UIView *view , a┼ča─č─▒daki kod bunu ba┼čaracakt─▒r:

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

Etiketin y├╝ksekli─či otomatik olarak hesaplan─▒r (bu kullan─▒larak intrinsicContentSize ) ve etiket, ├╝st k─▒sm─▒nda yatay olarak kenardan kenara yerle┼čtirilir view .


15







Yukar─▒daki y├Ântemlerin ├žo─čunu kulland─▒m ve kulland─▒─č─▒m h─▒zl─▒ ve kirli bir yakla┼č─▒m eklemek istiyorum:

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

Dizedeki yeni sat─▒r say─▒s─▒n─▒n herhangi bir metnin kullan─▒labilir dikey alan─▒ doldurmas─▒na neden olaca─č─▒ndan emin olun ve UILabel'i ta┼čan herhangi bir metni kesecek ┼čekilde ayarlay─▒n.

Çünkü bazen yeterince iyi, yeterince iyidir .


15







Uygulamamda yapt─▒─č─▒m ┼čey, UILabel'in line ├Âzelli─čini 0 olarak ayarlamak ve UILabel'in alt s─▒n─▒r─▒n─▒ olu┼čturmak ve a┼ča─č─▒daki resimde g├Âsterildi─či gibi> = 0 olarak ayarland─▒─č─▒ndan emin olmakt─▒.
g├Âr├╝nt├╝ tan─▒m─▒n─▒ buraya girin


15







├çok sat─▒rl─▒, minimum yaz─▒ tipi boyutunda olan ve ana g├Âr├╝n├╝m├╝nde hem yatay hem de dikey olarak ortalanm─▒┼č bir etiketi olmas─▒n─▒ istedim. Etiketimi programl─▒ olarak g├Âr├╝┼č├╝me ekledim:

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

Sonra etiketimin metnini de─či┼čtirmek istedi─čimde ...

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

Birisi yard─▒mc─▒ olur umar─▒m!


14







FXLabel (on github) bunu kutudan ayarlayarak label.contentMode yapar UIViewContentModeTop . Bu bile┼čen benim taraf─▒mdan ├╝retilmemi┼čtir, ancak s─▒kl─▒kla kulland─▒─č─▒m ve tonlarca ├Âzelli─če sahip olan ve iyi ├žal─▒┼č─▒yor gibi g├Âr├╝nen bir bile┼čen.


14







Bunu okuyanlar i├žin, etiketinizin i├žindeki metin dikey olarak ortalanmad─▒─č─▒ndan, baz─▒ font t├╝rlerinin e┼čit ┼čekilde tasarlanmad─▒─č─▒n─▒ unutmay─▒n. ├Ârne─čin, zapfino 16 boyutunda bir etiket olu┼čturursan─▒z, metnin dikey olarak ortalanm─▒┼č olmad─▒─č─▒n─▒ g├Âr├╝rs├╝n├╝z.

ancak, helvetica ile ├žal─▒┼čmak metninizi dikey olarak ortalar.


11







UILabel'in alt s─▒n─▒f─▒n─▒ ├žizin ve ├žizim dikd├Ârtgenini ┼ču ┼čekilde s─▒n─▒rland─▒r─▒n:

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

    [super drawTextInRect:rect];
}
 

Newline doldurmay─▒ i├žeren ├ž├Âz├╝m├╝ denedim ve baz─▒ durumlarda yanl─▒┼č davran─▒┼čla kar┼č─▒la┼čt─▒m. Tecr├╝belerime g├Âre, ├žizim ├žizgisini yukar─▒daki gibi k─▒s─▒tlamak, u─čra┼čmaktan daha kolay numberOfLines .

PS UIViewContentMode ├╝r├╝n├╝n├╝ bu ┼čekilde kolayca destekledi─činizi hayal edebilirsiniz:

 - (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


2012-07-03





Otomatik yerle┼čimi kullan─▒yorsan─▒z, dikey contentHuggingPriority'yi kod veya IB olarak 1000 olarak ayarlay─▒n. IB'de daha sonra 1'e ayarlayarak ve sonra silerek y├╝kseklik s─▒n─▒r─▒n─▒ kald─▒rman─▒z gerekebilir.


10







Kullan─▒n textRect(forBounds:limitedToNumberOfLines:) .

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

9







Karma┼č─▒k bir i┼č yapmad─▒─č─▒n─▒z s├╝rece, UITextView yerine kullanabilirsiniz UILabels .

Kayd─▒rmay─▒ devre d─▒┼č─▒ b─▒rak.

Metnin tamamen g├Âr├╝nt├╝lenmesini istiyorsan─▒z sadece kullan─▒c─▒ sizeToFit ve sizeThatFits: y├Ântemler


8







H─▒zl─▒,

let myLabel : UILabel!

Etiketinizin metnini ekrana s─▒─čd─▒rmak ve ├╝st├╝nde

myLabel.sizeToFit()

Etiket fontunuzu ekran geni┼čli─čine veya belirli geni┼člik boyutuna s─▒─čd─▒rmak i├žin.

myLabel.adjustsFontSizeToFitWidth = YES

ve etiket i├žin baz─▒ textAlignment:

myLabel.textAlignment = .center

myLabel.textAlignment = .left

myLabel.textAlignment = .right

myLabel.textAlignment = .Natural

myLabel.textAlignment = .Justified


8







Bu eski bir ├ž├Âz├╝md├╝r, iOS ├╝zerinde otomatik d├╝zeni kullan─▒n> = 6

├ç├Âz├╝m├╝m:

  1. Sat─▒rlar─▒ kendim ay─▒r (etiket sarma ayarlar─▒n─▒ yok sayarak)
  2. ├çizgileri kendim ├žiz (etiket hizalamas─▒n─▒ yok sayarak)
 
@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
 

7