UILabel yüksekliğini metne bağlı olarak ayarlama


315

Aşağıdaki metni UILabel(uzun bir dinamik metin satırı) içinde bulunduğumu düşünün :

Yabancı ordu takımı büyük ölçüde geride bıraktığından, oyuncular kıyamet sonrası dünyayı kendi yararlarına kullanmalı, örneğin çöplüklerin, sütunların, arabaların, molozların ve diğer nesnelerin arkasını örtme gibi.

UILabel'sMetnin sığabilmesi için yüksekliği yeniden boyutlandırmak istiyorum . UILabelİçindeki metni kaydırmak için aşağıdaki özelliklerini kullanıyorum .

myUILabel.lineBreakMode = UILineBreakModeWordWrap;
myUILabel.numberOfLines = 0;

Doğru yönde ilerlemiyorsam lütfen bana bildirin. Teşekkürler.



Aşağıda hızlı sürüm: stackoverflow.com/a/33945342/1634890
Juan Boero

Yanıtlar:


409

sizeWithFont constrainedToSize:lineBreakMode:kullanılacak yöntemdir. Nasıl kullanılacağına dair bir örnek aşağıdadır:

//Calculate the expected size based on the font and linebreak mode of your label
// FLT_MAX here simply means no constraint in height
CGSize maximumLabelSize = CGSizeMake(296, FLT_MAX);

CGSize expectedLabelSize = [yourString sizeWithFont:yourLabel.font constrainedToSize:maximumLabelSize lineBreakMode:yourLabel.lineBreakMode];   

//adjust the label the the new height.
CGRect newFrame = yourLabel.frame;
newFrame.size.height = expectedLabelSize.height;
yourLabel.frame = newFrame;

Bu 9999 kullanır, metne nasıl esnek yaparsınız?
quantumpotato

1
@quantumpotato 9999, metnin kaplamasına izin verilen maksimum alan için yalnızca bir yer tutucudur. Burada kullanıcı arayüzünüz için uygun olan herhangi bir sayıyı kullanabilirsiniz.
PyjamaSam

9
Etiketlerinizi bu şekilde boyutlandırıyorsanız, yanlış yapıyorsunuz demektir . Kullanmalısınız [label sizeToFit].
Marián Černý

5
Bunun sizeWithFontiOS 7'de kullanımdan kaldırıldığını unutmayın . Stackoverflow.com/questions/18897896/…
attomos

7
Kullanımdan kaldırıldı;
msmq

242

Sen doğru yöne gidiyordun. Tek yapmanız gereken:

myUILabel.numberOfLines = 0;
myUILabel.text = @"Enter large amount of text here";
[myUILabel sizeToFit];

5
Sığacak boyutu tam olarak metni sarmak için gereken şeydi, uzun myUILabel.lineBreakMode = UILineBreakModeWordWrap; myUILabel.numberOfLines = 0;
Jack BeNimble

2
Doğru olarak işaretlenen cevaba göre çok daha kolay bir çözüm ve aynı şekilde çalışıyor.
21'de memmons

4
@Inder Kumar Rathore - Bunu her zaman birden çok satır için kullanıyorum, dolayısıyla numberOfLines = 0; Öncelikle tercih edilen genişliği ayarlamada eksik olduğunu tahmin ediyorum, ancak bunun zaten UILabel init ile yapılmış olduğunu varsaydım.
DonnaLea

@Donna .. Ben senin tercih ettiğiniz alamadım .. onun çerçevesinden bahsediyor musun?
Inder Kumar Rathore

@DonnaLea, Çok teşekkür ederim. çözüme olan basit yaklaşımınız da sorunumu çözmeme yardımcı oldu.
Naved

44

İOS 6'da Apple, UILabel'e etiketlerin dinamik dikey yeniden boyutlandırmasını büyük ölçüde kolaylaştıran bir özellik ekledi : preferMaxLayoutWidth .

Bu özelliği lineBreakMode = NSLineBreakByWordWrapping ve sizeToFit yöntemiyle birlikte kullanmak, bir UILabel örneğini metnin tamamını barındıran yüksekliğe kolayca yeniden boyutlandırmaya olanak tanır.

İOS belgelerinden bir teklif:

preferMaxLayoutWidth Çok satırlı bir etiket için tercih edilen maksimum genişlik (nokta cinsinden).

Tartışma Bu özellik, mizanpaj kısıtlamaları uygulandığında etiketin boyutunu etkiler. Düzen sırasında, metin bu özellik tarafından belirtilen genişliğin ötesine uzanırsa, ek metin bir veya daha fazla yeni satıra akar, böylece etiketin yüksekliği artar.

Bir örnek:

...
UILabel *status = [[UILabel alloc] init];
status.lineBreakMode = NSLineBreakByWordWrapping;
status.numberOfLines = 5; // limits to 5 lines; use 0 for unlimited.

[self addSubview:status]; // self here is the parent view

status.preferredMaxLayoutWidth = self.frame.size.width; // assumes the parent view has its frame already set.

status.text = @"Some quite lengthy message may go here…";
[status sizeToFit];
[status setNeedsDisplay];
...

39

Tek satırlık kod eklemeden bu işi mükemmel bir şekilde kontrol edin. (Otomatik Yerleşimi Kullanarak)

İhtiyacınıza göre sizin için bir demo yaptım . Aşağıdaki linkten indirin,

UIView ve UILabel'i otomatikleştirme

Adım adım rehber :-

Adım 1: - Kısıtlamayı UIView olarak ayarlayın

1) Öncü 2) İlk 3) Sondaki (Ana görünümden)

resim açıklamasını buraya girin

2. Adım: - Kısıtlamayı Etiket 1 olarak ayarlayın

1) Lider 2) İlk 3) Firar (Denetiminden)

resim açıklamasını buraya girin

3. Adım: - Kısıtlamayı Etiket 2 olarak ayarlayın

1) Lider 2) Firar (Gözetiminden)

resim açıklamasını buraya girin

Adım 4: - En zor UIView UILabel için botton vermek.

resim açıklamasını buraya girin

Adım 5: - (İsteğe bağlı) Kısıtlamayı UIButton olarak ayarlayın

1) Öncü 2) Alt 3) Sondaki 4) Sabit Yükseklik (Ana görünümden)

resim açıklamasını buraya girin

Çıktı :-

resim açıklamasını buraya girin

Not: - Label özelliğinde satır sayısı = 0 ayarladığınızdan emin olun.

resim açıklamasını buraya girin

Umarım bu bilgi, UILabel'in yüksekliğine göre UIView'i otomatik olarak boyutlandırmayı ve metne göre UILabel'i otomatik olarak boyutlandırmayı anlamaya yetecektir.


Ve beyaz arka plan görünümü altında da bazı görünümler almak ister misiniz? Yükseklik vermemek SB'de "Y konumu veya yüksekliği için kısıtlama gerekli" için bazı kırmızı çizgiler gösterecektir.
Bogdan Razvan

bunun doğru cevap olarak işaretlenmesi gerekir. İb ile doğru yol budur.
Rana Tallal

@ SPQR3 sorun nedir? birçok insana ve onun iyi çalışmasına yardımcı oldu.
Badal Shah

36

Bunu programlı olarak yapmak yerine, bunu tasarım sırasında Storyboard / XIB'de yapabilirsiniz.

  • Özellik denetçisinde UIlabel'in satır sayısı özelliğini 0 olarak ayarlayın .
  • Ardından, genişlik kısıtlamasını / (veya) ön ve arka kısıtlamasını gereksinime göre ayarlayın.
  • Ardından yükseklik sınırlaması ayarlayabilirsiniz ile minimum değer . Son olarak eklenen yükseklik sınırlaması seçmek ve boyut denetiminde nitelik denetçisi yanındaki bir, değiştirmek yükseklik kısıtlaması en ilişkisini gelen eşit - Büyüktür .

Bu bir UITableView özel bir xib hücresine gömülü UILabel için çalışır.
Gang Fang

Cevabınıza göre etiketime sabit bir yükseklik ayarladım ve bu önceliği Düşük (250) olarak ayarladım ve hatalar ortadan kalktı. (Eşit olarak ayarlamanıza gerek yok - daha büyük)
Hamid Reza Ansari

15

Yardımlarınız için teşekkürler çocuklar, burada denediğim kod benim için çalışıyor

   UILabel *instructions = [[UILabel alloc]initWithFrame:CGRectMake(10, 225, 300, 180)];
   NSString *text = @"First take clear picture and then try to zoom in to fit the ";
   instructions.text = text;
   instructions.textAlignment = UITextAlignmentCenter;
   instructions.lineBreakMode = NSLineBreakByWordWrapping;
   [instructions setTextColor:[UIColor grayColor]];

   CGSize expectedLabelSize = [text sizeWithFont:instructions.font 
                                constrainedToSize:instructions.frame.size
                                    lineBreakMode:UILineBreakModeWordWrap];

    CGRect newFrame = instructions.frame;
    newFrame.size.height = expectedLabelSize.height;
    instructions.frame = newFrame;
    instructions.numberOfLines = 0;
    [instructions sizeToFit];
    [self addSubview:instructions];

2
sizeWithFont kullanımdan kaldırıldı.
msmq

12

İOS7 öncesi ve iOS7 üstü için çözüm

//
//  UILabel+DynamicHeight.m
//  For StackOverFlow
//
//  Created by Vijay on 24/02/14.
//  Copyright (c) 2014 http://Vijay-Apple-Dev.blogspot.com. All rights reserved.
//

#import <UIKit/UIKit.h>

#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v)  ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending)

#define SYSTEM_VERSION_LESS_THAN(v)                 ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedAscending)

#define iOS7_0 @"7.0"

@interface UILabel (DynamicHeight)

/*====================================================================*/

/* Calculate the size,bounds,frame of the Multi line Label */

/*====================================================================*/
/**
 *  Returns the size of the Label
 *
 *  @param aLabel To be used to calculte the height
 *
 *  @return size of the Label
 */

-(CGSize)sizeOfMultiLineLabel;

@end


//
//  UILabel+DynamicHeight.m
//  For StackOverFlow
//
//  Created by Vijay on 24/02/14.
//  Copyright (c) 2014 http://Vijay-Apple-Dev.blogspot.com. All rights reserved.
//

#import "UILabel+DynamicHeight.h"

@implementation UILabel (DynamicHeight)
/*====================================================================*/

/* Calculate the size,bounds,frame of the Multi line Label */

/*====================================================================*/
/**
 *  Returns the size of the Label
 *
 *  @param aLabel To be used to calculte the height
 *
 *  @return size of the Label
 */
-(CGSize)sizeOfMultiLineLabel{

    NSAssert(self, @"UILabel was nil");

    //Label text
    NSString *aLabelTextString = [self text];

    //Label font
    UIFont *aLabelFont = [self font];

    //Width of the Label
    CGFloat aLabelSizeWidth = self.frame.size.width;


    if (SYSTEM_VERSION_LESS_THAN(iOS7_0)) {
        //version < 7.0

        return [aLabelTextString sizeWithFont:aLabelFont
                            constrainedToSize:CGSizeMake(aLabelSizeWidth, MAXFLOAT)
                                lineBreakMode:NSLineBreakByWordWrapping];
    }
    else if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(iOS7_0)) {
        //version >= 7.0

        //Return the calculated size of the Label
        return [aLabelTextString boundingRectWithSize:CGSizeMake(aLabelSizeWidth, MAXFLOAT)
                                              options:NSStringDrawingUsesLineFragmentOrigin
                                           attributes:@{
                                                        NSFontAttributeName : aLabelFont
                                                        }
                                              context:nil].size;

    }

    return [self bounds].size;

}

@end

UITableViewController alt sınıfında, bu yöntemi nereden çağırmalıyım?
Homam

Etiket yüksekliğini hesaplamak istediğiniz yerde bu yöntemi çağırın. ardından tablo görünümünün yüksekliğini ayarlayın. burada dizin yönteminde satır için tablo görüntüleme yüksekliğiniz vardır. tüm dikey etiket metni gerektiği gibi hesaplayın
Vijay-Apple-Dev.blogspot.com

Vijay sizeWithFont karmaşık.
user3182143

10

SizeWithFont kullanımdan kaldırıldığı için bunun yerine bunu kullanıyorum.

bu etikete özgü nitelikleri alır.

-(CGFloat)heightForLabel:(UILabel *)label withText:(NSString *)text{

    NSAttributedString *attributedText = [[NSAttributedString alloc] initWithString:text attributes:@{NSFontAttributeName:label.font}];
    CGRect rect = [attributedText boundingRectWithSize:(CGSize){label.frame.size.width, CGFLOAT_MAX}
                                           options:NSStringDrawingUsesLineFragmentOrigin
                                           context:nil];

    return ceil(rect.size.height);
}

6

İşte bir kategori sürümü:

UILabel + AutoSize.h #import

@interface UILabel (AutoSize)

- (void) autosizeForWidth: (int) width;

@end

UILabel + AutoSize.m

#import "UILabel+AutoSize.h"

@implementation UILabel (AutoSize)

- (void) autosizeForWidth: (int) width {
    self.lineBreakMode = UILineBreakModeWordWrap;
    self.numberOfLines = 0;
    CGSize maximumLabelSize = CGSizeMake(width, FLT_MAX);
    CGSize expectedLabelSize = [self.text sizeWithFont:self.font constrainedToSize:maximumLabelSize lineBreakMode:self.lineBreakMode];
    CGRect newFrame = self.frame;
    newFrame.size.height = expectedLabelSize.height;
    self.frame = newFrame;
}

@end

6

TableViewController's (UITableViewCell *)tableView:cellForRowAtIndexPath Yöntemi aşağıdaki şekilde uygulayabilirsiniz (örneğin):

#define CELL_LABEL_TAG 1

- (UITableViewCell *)tableView:(UITableView *)tableView  cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    NSString *text = @"my long text";

    static NSString *MyIdentifier = @"MyIdentifier";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:MyIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero  reuseIdentifier:identifier] autorelease];
    }

    CGFloat width = [UIScreen mainScreen].bounds.size.width - 50;
    CGFloat height = [self textHeight:text] + 10;
    CGRect frame = CGRectMake(10.0f, 10.0f, width, height);

    UILabel *cellLabel = [[UILabel alloc] initWithFrame:frame];
    cellLabel.tag = CELL_LABEL_TAG;
    cellLabel.textColor = [UIColor blackColor];
    cellLabel.backgroundColor = [UIColor clearColor];
    cellLabel.textAlignment = UITextAlignmentLeft;
    cellLabel.font = [UIFont systemFontOfSize:12.0f];
    [cell.contentView addSubview:cellLabel];
    [cellLabel release];

    return cell;
}

UILabel *label = (UILabel *)[cell viewWithTag:CELL_LABEL_TAG];
label.text = text;
label.numberOfLines = 0;
[label sizeToFit];
return cell;

Metnin yüksekliğini hesaplamak için NSString' sizeWithFont:constrainedToSize:lineBreakMode:yöntemini de kullanın .


6

Swift 4 ve üstü için bu cevaba dayanan UILabel uzantısı

extension UILabel {

    func retrieveTextHeight () -> CGFloat {
        let attributedText = NSAttributedString(string: self.text!, attributes: [NSFontAttributeName:self.font])

        let rect = attributedText.boundingRect(with: CGSize(width: self.frame.size.width, height: CGFloat.greatestFiniteMagnitude), options: .usesLineFragmentOrigin, context: nil)

        return ceil(rect.size.height)
    }

}

Gibi kullanılabilir:

self.labelHeightConstraint.constant = self.label.retrieveTextHeight()

4

İOS 8'e geçiş yapanlar için, Swift için bir sınıf uzantısı var:

extension UILabel {

    func autoresize() {
        if let textNSString: NSString = self.text {
            let rect = textNSString.boundingRectWithSize(CGSizeMake(self.frame.size.width, CGFloat.max),
                options: NSStringDrawingOptions.UsesLineFragmentOrigin,
                attributes: [NSFontAttributeName: self.font],
                context: nil)
            self.frame = CGRectMake(self.frame.origin.x, self.frame.origin.y, self.frame.size.width, rect.height)
        }
    }

}

4

Benim için çalışmanın en kolay ve daha iyi yolu, etikete yükseklik kısıtlaması uygulamak ve önceliği düşük , yani (250) film şeridinde ayarlamaktı.

Dolayısıyla, storyboard sayesinde yükseklik ve genişliği programlı olarak hesaplama konusunda endişelenmenize gerek yok.


4

UILabel'ın dinamik yüksekliğini hesaplama yaklaşımım.

    let width = ... //< width of this label 
    let text = ... //< display content

    label.numberOfLines = 0
    label.lineBreakMode = .byWordWrapping
    label.preferredMaxLayoutWidth = width

    // Font of this label.
    //label.font = UIFont.systemFont(ofSize: 17.0)
    // Compute intrinsicContentSize based on font, and preferredMaxLayoutWidth
    label.invalidateIntrinsicContentSize() 
    // Destination height
    let height = label.intrinsicContentSize.height

Fonksiyon için sarın:

func computeHeight(text: String, width: CGFloat) -> CGFloat {
    // A dummy label in order to compute dynamic height.
    let label = UILabel()

    label.numberOfLines = 0
    label.lineBreakMode = .byWordWrapping
    label.font = UIFont.systemFont(ofSize: 17.0)

    label.preferredMaxLayoutWidth = width
    label.text = text
    label.invalidateIntrinsicContentSize()

    let height = label.intrinsicContentSize.height
    return height
}

3

Güncellenmiş Yöntem

+ (CGFloat)heightForText:(NSString*)text font:(UIFont*)font withinWidth:(CGFloat)width {

    CGSize constraint = CGSizeMake(width, 20000.0f);
    CGSize size;

    CGSize boundingBox = [text boundingRectWithSize:constraint
                                                  options:NSStringDrawingUsesLineFragmentOrigin
                                               attributes:@{NSFontAttributeName:font}
                                                  context:nil].size;

    size = CGSizeMake(ceil(boundingBox.width), ceil(boundingBox.height));

    return size.height;
}

3

Objective-c kullanarak UILabel Yüksekliğini almak için bir kod satırıdır:

labelObj.numberOfLines = 0;
CGSize neededSize = [labelObj sizeThatFits:CGSizeMake(screenWidth, CGFLOAT_MAX)];

ve .height kullanarak etiketin yüksekliğini aşağıdaki gibi elde edersiniz:

neededSize.height

En iyi güncel cevap.
Mike

3

Aşağıdaki kodu kullanarak yükseklik elde edebilirsiniz

Geçmek zorundasın

  1. metin 2. yazı tipi 3. etiket genişliği

    func heightForLabel(text: String, font: UIFont, width: CGFloat) -> CGFloat {
    
       let label:UILabel = UILabel(frame: CGRect(x: 0, y: 0, width: width, height: CGFloat.greatestFiniteMagnitude))
       label.numberOfLines = 0
       label.lineBreakMode = NSLineBreakMode.byWordWrapping
       label.font = font
       label.text = text
       label.sizeToFit()
    
       return label.frame.height
    }

2

Bu gönderi için teşekkürler. Bana çok yardımcı oldu. Benim durumumda da metni ayrı bir görünüm denetleyicisinde düzenliyorum. Ben kullandığımda fark ettim:

[cell.contentView addSubview:cellLabel];

tableView: cellForRowAtIndexPath: yöntemi, hücreyi her düzenlediğimde etiket görünümünün önceki görünümün üstünde sürekli olarak işlendiği yöntem. Metin pikselleştirildi ve bir şey silindiğinde veya değiştirildiğinde, önceki sürüm yeni sürümün altında görünüyordu. Sorunu şu şekilde çözdüm:

if ([[cell.contentView subviews] count] > 0) {
    UIView *test = [[cell.contentView subviews] objectAtIndex:0];
    [test removeFromSuperview];
}
[cell.contentView insertSubview:cellLabel atIndex:0];

Artık garip katmanlar yok. Bunu halletmenin daha iyi bir yolu varsa, lütfen bana bildirin.


2
UILabel *itemTitle = [[UILabel alloc] initWithFrame:CGRectMake(10.0f, 10,100, 200.0f)];
itemTitle.text = @"aseruy56uiytitfesh";
itemTitle.adjustsFontSizeToFitWidth = NO;
itemTitle.autoresizingMask = UIViewAutoresizingFlexibleWidth;
itemTitle.font = [UIFont boldSystemFontOfSize:18.0];
itemTitle.textColor = [UIColor blackColor];
itemTitle.shadowColor = [UIColor whiteColor];
itemTitle.shadowOffset = CGSizeMake(0, 1);
itemTitle.backgroundColor = [UIColor blueColor];
itemTitle.lineBreakMode = UILineBreakModeWordWrap;
itemTitle.numberOfLines = 0;
[itemTitle sizeToFit];
[self.view addSubview:itemTitle];

Bunu burada kullanın tüm özellikler etikette kullanılır ve itemTitle.text içindeki metni artırarak test eder.

itemTitle.text = @"diofgorigjveghnhkvjteinughntivugenvitugnvkejrfgnvkhv";

İhtiyacınız olan perfetc cevabını gösterecektir


2

Bir yöntem olarak da kullanabilirsiniz. @Pyjamasam çok doğru bu yüzden sadece yöntemini yapıyorum. Başka biri için yararlı olabilir

-(CGRect)setDynamicHeightForLabel:(UILabel*)_lbl andMaxWidth:(float)_width{
    CGSize maximumLabelSize = CGSizeMake(_width, FLT_MAX);

    CGSize expectedLabelSize = [_lbl.text sizeWithFont:_lbl.font constrainedToSize:maximumLabelSize lineBreakMode:_lbl.lineBreakMode];

    //adjust the label the the new height.
    CGRect newFrame = _lbl.frame;
    newFrame.size.height = expectedLabelSize.height;
    return newFrame;
}

ve sadece böyle ayarlayın

label.frame = [self setDynamicHeightForLabel:label andMaxWidth:300.0];

2

Swift3'te bunu yapmak için kod:

 let labelSizeWithFixedWith = CGSize(width: 300, height: CGFloat.greatestFiniteMagnitude)
            let exactLabelsize = self.label.sizeThatFits(labelSizeWithFixedWith)
            self.label.frame = CGRect(origin: CGPoint(x: 20, y: 20), size: exactLabelsize)

2

Yukarıdaki cevaplara ekleme:

Bu, film şeridi üzerinden kolayca elde edilebilir.

  1. UILabel için kısıtlama ayarlayın. (Benim durumumda üst, sol ve sabit genişlik yaptım)
  2. Özellik Denetçisi'nde satır sayısını 0 olarak ayarlayın
  3. Özellik Denetçisi'nde Satır Kesmesini WordWrap olarak ayarlayın .

UILabel Yükseklik Ayarı


1

Bir satır Chris'in yanıtı yanlış.

newFrame.size.height = maximumLabelSize.height;

olmalı

newFrame.size.height = expectedLabelSize.height;

Bunun dışında doğru çözüm.


1

Sonunda işe yaradı. Sağolun beyler.

Ben heightForRowAtIndexPathyöntemde etiketi yeniden boyutlandırmaya çalışıyordu çünkü işe almak değildi :

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath

ve (evet aptal bana), cellForRowAtIndexPathyöntemi varsayılan olarak etiket yeniden boyutlandırma - ben daha önce yazmıştı kod overlooking:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

1
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    cellIdentifier = @"myCell";
    cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
    cell.myUILabel.lineBreakMode = UILineBreakModeWordWrap;        
    cell.myUILabel.numberOfLines = 0;
    cell.myUILabel.text = @"Some very very very very long text....."
    [cell.myUILabel.criterionDescriptionLabel sizeToFit];    
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [self tableView:tableView cellForRowAtIndexPath:indexPath];
    CGFloat rowHeight = cell.myUILabel.frame.size.height + 10;

    return rowHeight;    
}

2
Çözümünüzün OP sorununu nasıl çözdüğüne bir açıklama ekleyebilir misiniz?

1
UITableViewCell * cell = [self tableView: tableView cellForRowAtIndexPath: indexPath]; forForWowAtIndexPath, ge t ve sonsuz döngü olacak
Peter Lapisu

1
NSString *str = @"Please enter your text......";
CGSize lblSize = [str sizeWithFont:[UIFont systemFontOfSize:15] constrainedToSize: CGSizeMake(200.0f, 600.0f) lineBreakMode: NSLineBreakByWordWrapping];

UILabel *label = [[UILabel alloc]init];
label.frame = CGRectMake(60, 20, 200, lblSize.height);
label.numberOfLines = 0;
label.lineBreakMode = NSLineBreakByWordWrapping;
label.font = [UIFont systemFontOfSize:15];
label.text = str;
label.backgroundColor = [UIColor clearColor];
[label sizeToFit];
[self.view addSubview:label];

1

Kodum:

UILabel *label      = [[UILabel alloc] init];
label.numberOfLines = 0;
label.lineBreakMode = NSLineBreakByWordWrapping;
label.text          = text;
label.textAlignment = NSTextAlignmentCenter;
label.font          = [UIFont fontWithName:_bodyTextFontFamily size:_bodyFontSize];

CGSize size = [label sizeThatFits:CGSizeMake(width, MAXFLOAT)];


float height        = size.height;
label.frame         = CGRectMake(x, y, width, height);

1

Bu yöntem mükemmel yükseklik verecektir

-(float) getHeightForText:(NSString*) text withFont:(UIFont*) font andWidth:(float) width{
CGSize constraint = CGSizeMake(width , 20000.0f);
CGSize title_size;
float totalHeight;


title_size = [text boundingRectWithSize:constraint
                                options:NSStringDrawingUsesLineFragmentOrigin
                             attributes:@{ NSFontAttributeName : font }
                                context:nil].size;

totalHeight = ceil(title_size.height);

CGFloat height = MAX(totalHeight, 40.0f);
return height;
}

Açık bir şekilde atıfta bulunmadan içeriği başka bir yerden kopyalamayın. İntihal olarak görülür. Bkz. Stackoverflow.com/help/referencing ( stackoverflow.com/a/25158206/444991 ).
Matt

1

Hızlı 2:

    yourLabel.text = "your very long text"
    yourLabel.numberOfLines = 0
    yourLabel.lineBreakMode = NSLineBreakMode.ByWordWrapping
    yourLabel.frame.size.width = 200
    yourLabel.frame.size.height = CGFloat(MAXFLOAT)
    yourLabel.sizeToFit()

İlginç çizgilerdir sizeToFit()bir ayar ile birlikte frame.size.heightmaksimum şamandıraya, bu uzun metnin yer verir, ama sizeToFit()sadece gerekli kullanmaya zorlamak, ancak her zaman ayarladıktan sonra diyoruz.frame.size.height .

.backgroundColorHata ayıklama amacıyla bir ayar yapmanızı öneririm , bu şekilde her durum için oluşturulan çerçeveyi görebilirsiniz.


1
yourLabel.frame.heightbir get özelliği
Phil Hudson

2
yourLabel.frame.size.width ve yourLabel.frame.size.height da sadece okunur
CalZone

1
myLabel.text = "your very long text"
myLabel.numberOfLines = 0
myLabel.lineBreakMode = NSLineBreakMode.ByWordWrapping

Lütfen sol üst sağ alt dahil film şeridinde UILable için kısıtlamalar ayarlayın

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.