Nastavte výšku UILabel závislosti na textu

hlasů
289

Vezměme si mám následující text UILabel(dlouhé řadě dynamický text):

Vzhledem k tomu, cizí armáda značně převyšuje tým, hráči musí používat post-apokalyptický svět ve svůj prospěch, jako je hledání kryt za popelnic, sloupků, automobily, stavební suti a dalších objektů.

Chci změnit velikost UILabel'svýšky tak, aby se text vejde dovnitř. Já používám následující vlastnosti UILabel, aby se text v zabalit.

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

Prosím, dejte mi vědět, jestli nejsem míří správným směrem. Dík.

Položena 15/01/2009 v 12:19
zdroj uživatelem
V jiných jazycích...                            


34 odpovědí

hlasů
394

sizeWithFont constrainedToSize:lineBreakMode:je způsob použití. Jako příklad toho, jak ji používat, je níže:

//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;
Odpovězeno 15/01/2009 v 16:01
zdroj uživatelem

hlasů
231

Byl jste ubírá správným směrem. Vše, co musíte udělat, je:

myUILabel.numberOfLines = 0;
myUILabel.text = @"Enter large amount of text here";
[myUILabel sizeToFit];
Odpovězeno 20/08/2009 v 05:45
zdroj uživatelem

hlasů
41

V iOS 6 Apple přidal vlastnost UILabel , které značně zjednodušuje dynamické svislé změny velikosti štítků: preferredMaxLayoutWidth .

Používání této vlastnosti v kombinaci s lineBreakMode = NSLineBreakByWordWrapping a sizeToFit metoda umožňuje snadno měnit velikost instance UILabel do výšky, která pojme celý text.

Citace z iOS dokumentace:

preferredMaxLayoutWidth Výhodný maximální šířku (v bodech) pro víceřádkové štítku.

Diskuse Tato vlastnost ovlivňuje velikost štítku, pokud se rozvržení omezení aplikován na to. Při rozložení, pokud je text přesahuje šířku určeného na základě tohoto majetku, další text se proudily do jednoho nebo více nových linek, čímž se zvyšuje výšku štítku.

Vzorek:

...
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];
...
Odpovězeno 04/11/2013 v 22:14
zdroj uživatelem

hlasů
34

Místo toho dělá programově, můžete tak učinit v Scénář / XIb při navrhování.

  • Nastavit UIlabel je počet řádků majetku 0 v atributu inspektora.
  • Poté se uvede do šířky vazby / (nebo) na přední a zadní omezení dle požadavku.
  • Pak se nastaví výška omezení s minimální hodnotou . Nakonec vyberte výšky omezení jste přidali a velikosti inspektora jeden vedle atributu inspektor, změnu výšky s omezujícími podmínkami je vztah od rovný - větší .
Odpovězeno 18/06/2015 v 19:08
zdroj uživatelem

hlasů
28

Zkontrolujte, zda tuto práci dokonale bez přidání jediný řádek kódu. (Za použití automatické rozložení)

Udělal jsem si demo pro vás podle vašich požadavků. Stáhněte si jej z níže odkaz,

AUTORESIZE UIView a UILabel

Krok za krokem: -

Krok 1: - Set omezovat na UIView

1) Přední 2) Top 3) Koncové (Od mainview)

zadejte popis obrázku zde

Krok 2: - Nastavte omezovat na štítku 1

1) Přední 2) Top 3) Koncové (Z ní je SuperView)

zadejte popis obrázku zde

Krok 3: - Nastavte omezovat na Label 2

1) Přední 2) Trailing (Z ní je SuperView)

zadejte popis obrázku zde

Krok 4: - Most složité dát dolní okraj na UILabel z UIView.

zadejte popis obrázku zde

Krok 5: - (Volitelné) Set omezit na UIButton

1), což vede 2) Spodní 3) Sekundární 4) pevnou výšku (z mainview)

zadejte popis obrázku zde

Výstup :-

zadejte popis obrázku zde

Poznámka: - Ujistěte se, že jste nastavili počet řádků = 0 v objektu Label.

zadejte popis obrázku zde

Doufám, že tyto informace natolik, aby pochopili AUTORESIZE UIView podle UILabel výškou a AUTORESIZE UILabel Podle textu.

Odpovězeno 26/04/2016 v 10:52
zdroj uživatelem

hlasů
15

Díky hoši o pomoc, tady je kód, který jsem se snažil, který pracuje pro mě

   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];
Odpovězeno 23/11/2010 v 18:20
zdroj uživatelem

hlasů
12

Řešení iOS7 před a iOS7 výše

//
//  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
Odpovězeno 24/02/2014 v 11:16
zdroj uživatelem

hlasů
10

Vzhledem k tomu, sizeWithFont je zastaralá I použijte tento jeden.

tahle získat specifické atributy štítků.

-(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);
}
Odpovězeno 13/11/2014 v 23:40
zdroj uživatelem

hlasů
6

Zde je verze kategorie:

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
Odpovězeno 10/04/2013 v 18:58
zdroj uživatelem

hlasů
6

Můžete implementovat TableViewController's (UITableViewCell *)tableView:cellForRowAtIndexPath metodu následujícím způsobem (například):

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

Také použít NSString‚s sizeWithFont:constrainedToSize:lineBreakMode:metodu pro výpočet textového jeho výšku.

Odpovězeno 15/01/2009 v 15:10
zdroj uživatelem

hlasů
4

Nejjednodušší a lepší způsob, který pracoval pro mě bylo aplikovat výšky omezení na etiketě a nastavit prioritu low , tedy (250) ve scénáři.

Takže se nemusíte starat o výpočtu výšky a šířky programově, díky scénáři.

Odpovězeno 16/05/2016 v 16:43
zdroj uživatelem

hlasů
4

A pro ty, kteří se stěhují do systému iOS 8, zde je rozšíření třída pro Swift:

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)
        }
    }

}
Odpovězeno 27/08/2014 v 10:18
zdroj uživatelem

hlasů
3

aktualizováno Method

+ (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;
}
Odpovězeno 06/07/2015 v 12:21
zdroj uživatelem

hlasů
2

To je jeden řádek kódu získat UILabel výšky pomocí Objective-C:

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

a za použití .height získáte výšku označení následovně:

neededSize.height
Odpovězeno 07/03/2017 v 13:22
zdroj uživatelem

hlasů
2

Chcete-li to provést v následujícím Swift3 je kód:

 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)
Odpovězeno 01/03/2017 v 13:27
zdroj uživatelem

hlasů
2

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

Zajímavé linky jsou sizeToFit()ve spojení s nastavením frame.size.heightna max plováku, bude to dá prostor pro dlouhého textu, ale sizeToFit()to bude nutit používat pouze nezbytné, ale vždy nazývají po nastavení .frame.size.height.

I doporučujeme nastavit .backgroundColorpro účely ladění, tímto způsobem můžete vidět rámeček je vykreslen pro každý případ.

Odpovězeno 26/11/2015 v 18:51
zdroj uživatelem

hlasů
2

Můžete ji použít jako metodu, jak dobře. @Pyjamasam je do značné míry pravda, takže jsem jen dělat svou metodu. To může být užitečné pro někoho jiného

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

a jen nastavit to takhle

label.frame = [self setDynamicHeightForLabel:label andMaxWidth:300.0];
Odpovězeno 20/01/2014 v 13:19
zdroj uživatelem

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

použít zde všechny vlastnosti jsou použity na etiketě a vyzkoušet zvýšením textu v itemTitle.text as

itemTitle.text = @"diofgorigjveghnhkvjteinughntivugenvitugnvkejrfgnvkhv";

to ukáže perfetc odpověď, jak budete potřebovat

Odpovězeno 27/06/2013 v 13:02
zdroj uživatelem

hlasů
2

Díky za tento post. To mi pomohlo hodně. V mém případě jsem také úpravách textu v samostatném pohledu regulátoru. Všiml jsem si, že když jsem použít:

[cell.contentView addSubview:cellLabel];

v Tableview: cellForRowAtIndexPath: způsobem, že zobrazení štítku se neustále poskytnutých v horní části předchozího zobrazení pokaždé, když upravený buňku. Text se stal pixelated, a když se něco odstraněna nebo změněna, předchozí verze byla viditelná pod novou verzí. Zde je návod, jak jsem vyřešil problém:

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

Žádné další podivné vrstvení. Pokud existuje lepší způsob, jak řešit tento problém, prosím dejte mi vědět.

Odpovězeno 20/02/2009 v 23:54
zdroj uživatelem

hlasů
1

UILabel prodloužení na základě této odpovědi na Swift 4 a výše

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)
    }

}

Lze použít jako:

self.labelHeightConstraint.constant = self.label.retrieveTextHeight()
Odpovězeno 31/10/2017 v 13:00
zdroj uživatelem

hlasů
1

Přidání výše uvedených odpovědí:

Toho lze snadno dosáhnout pomocí scénáře.

  1. Nastavit omezení pro UILabel. (V mém případě jsem nahoře, vlevo a pevná šířka)
  2. Nastavte počet řádek na 0 v atributu Inspector
  3. Nastavit zalomení řádku na wordwrap v atributu inspektor.

UILabel výškové nastavení

Odpovězeno 18/10/2017 v 22:10
zdroj uživatelem

hlasů
1

Můj přístup k výpočtu dynamického výšku UILabel.

    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

Zabalit do funkce:

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
}
Odpovězeno 19/07/2017 v 06:02
zdroj uživatelem

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

Prosím nastavit omezení pro UILable ve scénáři včetně horním levém rohu dole

Odpovězeno 21/01/2017 v 09:07
zdroj uživatelem

hlasů
1

Tato metoda umožní dokonalou výšku

-(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;
}
Odpovězeno 07/04/2016 v 14:00
zdroj uživatelem

hlasů
1

Můj kód:

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);
Odpovězeno 08/06/2015 v 06:51
zdroj uživatelem

hlasů
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];
Odpovězeno 29/04/2015 v 07:13
zdroj uživatelem

hlasů
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;    
}
Odpovězeno 29/08/2012 v 08:29
zdroj uživatelem

hlasů
1

Jedna linka je Chrisův odpověď je špatně.

newFrame.size.height = maximumLabelSize.height;

mělo by

newFrame.size.height = expectedLabelSize.height;

Jiné, než to, že je to správné řešení.

Odpovězeno 21/05/2009 v 07:31
zdroj uživatelem

hlasů
1

Nakonec to fungovalo. Díky lidi.

Nebyl jsem dostat se do práce, protože jsem se snažil změnit velikost popisku v heightForRowAtIndexPathmetodě:

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

a (jo hloupé já), i se změnou velikosti štítek na výchozí v cellForRowAtIndexPathmetodě - byl jsem s výhledem na kód jsem napsal dříve:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
Odpovězeno 16/01/2009 v 08:25
zdroj uživatelem

hlasů
0

Můžete získat výšku pomocí níže kód

Musíte projít

  1. Text 2. font šířka 3. štítek

    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
    }
    
Odpovězeno 12/04/2018 v 10:43
zdroj uživatelem

hlasů
0

Problém je v tom, že žádná z uvedených funkcí je realiable az nějakého řetězce a písmo vrátí nesprávnou hodnotu výšky. Zvlášť se nezdaří pro připsat textů.

Jediným řešením je realiable zde: https://stackoverflow.com/a/4214978/699944 a bod je použít CoreText ručně vypočítat výšku každého řádku, aby si správnou velikost. Neexistuje žádný jiný známý způsob, jak toho dosáhnout.

Odpovězeno 28/01/2014 v 09:55
zdroj uživatelem

hlasů
0

Tato metoda bude fungovat pro iOS 6 a 7

- (float)heightForLabelSize:(CGSize)maximumLabelSize  Font:(UIFont *)font String:(NSString*)string {

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) {
    NSDictionary *stringAttributes = [NSDictionary dictionaryWithObject:font forKey: NSFontAttributeName];

    CGSize adjustedLabelSize = [string maximumLabelSize
                                                                  options:NSStringDrawingTruncatesLastVisibleLine|NSStringDrawingUsesLineFragmentOrigin
                                                               attributes:stringAttributes context:nil].size;
    return adjustedLabelSize.height;
}
else {
    CGSize adjustedLabelSize = [string sizeWithFont:font constrainedToSize:maximumLabelSize lineBreakMode:NSLineBreakByWordWrapping];

    return adjustedLabelSize.height;
}

}
Odpovězeno 17/01/2014 v 15:55
zdroj uživatelem

hlasů
-1

Je-li aktivována autoLayout změnu velikosti nefunguje :)

Odpovězeno 09/10/2013 v 03:07
zdroj uživatelem

hlasů
-2

Aktualizace podle iOS7

// If description are available for protocol
protocolDescriptionLabel.text = [dataDictionary objectForKey:@"description"];
[protocolDescriptionLabel sizeToFit];
[protocolDescriptionLabel setLineBreakMode:NSLineBreakByWordWrapping];

CGSize expectedLabelSize = [protocolDescriptionLabel
               textRectForBounds:protocolDescriptionLabel.frame
               limitedToNumberOfLines:protocolDescriptionLabel.numberOfLines].size;
NSLog(@"expectedLabelSize %f", expectedLabelSize.height);

//adjust the label the the new height.
CGRect newFrame = protocolDescriptionLabel.frame;
newFrame.size.height = expectedLabelSize.height;
protocolDescriptionLabel.frame = newFrame;
Odpovězeno 13/11/2013 v 08:51
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more