Stel UILabel hoogte afhankelijk van de tekst

stemmen
289

Denk Ik heb de volgende tekst in een UILabel(een lange lijn van dynamische tekst):

Aangezien de vreemdeling leger enorm outnumbers het team, moeten spelers de post-apocalyptische wereld gebruiken om hun voordeel, zoals het zoeken dekking achter afvalcontainers, pilaren, auto's, puin en andere objecten.

Ik wil het verkleinen UILabel'shoogte, zodat de tekst past in. Ik gebruik volgende eigenschappen van UILabelde tekst op te maken in te pakken.

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

Laat het me weten als ik niet in de goede richting. Bedankt.

De vraag is gesteld op 15/01/2009 om 12:19
bron van user
In andere talen...                            


34 antwoorden

stemmen
394

sizeWithFont constrainedToSize:lineBreakMode:is de methode te gebruiken. Een voorbeeld van hoe het te gebruiken staat hieronder:

//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;
antwoordde op 15/01/2009 om 16:01
bron van user

stemmen
231

Je ging in de goede richting. Het enige wat u hoeft te doen is:

myUILabel.numberOfLines = 0;
myUILabel.text = @"Enter large amount of text here";
[myUILabel sizeToFit];
antwoordde op 20/08/2009 om 05:45
bron van user

stemmen
41

In iOS 6 heeft Apple een woning aan toegevoegd UILabel : dat sterk vereenvoudigt dynamische verticale aanpassen van labels preferredMaxLayoutWidth .

Die deze eigenschappen in combinatie met lineBreakMode = NSLineBreakByWordWrapping en sizeToFit werkwijze maakt eenvoudig formaat een UILabel bijvoorbeeld om de hoogte die de gehele tekst herbergt.

Een citaat uit iOS-documentatie:

preferredMaxLayoutWidth De geprefereerde maximale breedte (punten) voor multiline label.

Discussie Deze eigenschap invloed op de grootte van het label wanneer de lay-out beperkingen worden toegepast. Tijdens layout wanneer de tekst zich voorbij de breedte door deze eigenschap de toevoeging is gestroomd om een of meer nieuwe lijnen, waardoor de hoogte van het label verhogen.

Een voorbeeld:

...
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];
...
antwoordde op 04/11/2013 om 22:14
bron van user

stemmen
34

In plaats daarvan dit programmatisch doen, kunt u dit doen in Storyboard / XIB tijdens het ontwerpen.

  • Stel UILabel het aantal regels onroerend 0 in kenmerk inspecteur.
  • Stel breedte constraint / (of) voor- en achterranden beperking zoals de eis.
  • Dan bepaal hoogte beperking met een minimale waarde . Ten slotte selecteert u de hoogte beperking hebt toegevoegd en in de grootte inspecteur degene naast inspecteur toeschrijven, veranderen van de hoogte beperking van de relatie van gelijk aan - groter dan .
antwoordde op 18/06/2015 om 19:08
bron van user

stemmen
28

Controleer dit werk perfect zonder toevoeging van één regel code. (Met AutoLayout)

Ik maakte een demo voor u volgens uw behoefte. Downloaden van onderstaande link,

Automatisch wijzigen UIView en UILabel

Stap voor stap handleiding: -

Stap 1: - Set beperken tot UIView

1) Toonaangevende 2) Top 3) achterstand (From MAINVIEW)

voer image beschrijving hier

Stap 2: - Stel beperken tot label 1

1) Toonaangevende 2) Top 3) achterstand (Uit het is superview)

voer image beschrijving hier

Stap 3: - Stel beperken tot Label 2

1) Toonaangevende 2) aan de achterkant (Uit het is superview)

voer image beschrijving hier

Stap 4: - De meeste lastig give Botton om UILabel van UIView.

voer image beschrijving hier

Stap 5: - (Optioneel) Stel beperken tot UIButton

1) Leading 2) Bodem 3) achterstand 4) vaste hoogte (vanaf MAINVIEW)

voer image beschrijving hier

Output: -

voer image beschrijving hier

Let op: - Zorg ervoor dat u Aantal lijnen = 0 hebt ingesteld in Label eigendom.

voer image beschrijving hier

Ik hoop dat deze informatie voldoende om automatisch wijzigen UIView begrijpen afhankelijk van de hoogte UILabel en automatisch wijzigen UILabel Volgens de tekst.

antwoordde op 26/04/2016 om 10:52
bron van user

stemmen
15

Bedankt jongens voor hulp, hier is de code die ik probeerde die werkt voor mij

   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];
antwoordde op 23/11/2010 om 18:20
bron van user

stemmen
12

Oplossing voor iOS7 voorafgaande en iOS7 boven

//
//  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
antwoordde op 24/02/2014 om 11:16
bron van user

stemmen
10

Aangezien sizeWithFont is verouderd gebruik ik deze plaats.

dit een te krijgen label specifieke attributen.

-(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);
}
antwoordde op 13/11/2014 om 23:40
bron van user

stemmen
6

Hier is een categorie versie:

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
antwoordde op 10/04/2013 om 18:58
bron van user

stemmen
6

U kunt implementeren TableViewController's (UITableViewCell *)tableView:cellForRowAtIndexPath methode op de volgende manier (bijvoorbeeld):

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

Ook gebruik maken van NSString's sizeWithFont:constrainedToSize:lineBreakMode:methode om de hoogte van de tekst te berekenen.

antwoordde op 15/01/2009 om 15:10
bron van user

stemmen
4

De eenvoudigste en betere manier die werkte voor mij was om hoogte beperking labelen van toepassing en stel de prioriteit laag , dat wil zeggen, (250) in het storyboard.

Dus je moet geen zorgen te maken over het berekenen van de hoogte en breedte programmatisch, dankzij storyboard.

antwoordde op 16/05/2016 om 16:43
bron van user

stemmen
4

En voor degenen die migreren naar iOS 8, hier is een klasse extensie voor 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)
        }
    }

}
antwoordde op 27/08/2014 om 10:18
bron van user

stemmen
3

bijgewerkt 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;
}
antwoordde op 06/07/2015 om 12:21
bron van user

stemmen
2

Dit is een regel code aan de UILabel hoogte te krijgen met behulp van Objective-C:

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

en het gebruik van .height vindt u de hoogte van het label als volgt te krijgen:

neededSize.height
antwoordde op 07/03/2017 om 13:22
bron van user

stemmen
2

Om dit te doen in Swift3 volgende is de code:

 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)
antwoordde op 01/03/2017 om 13:27
bron van user

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

Het interessante lijnen zijn sizeToFit()in combinatie met het instellen van een frame.size.heightaan de max float, zal deze kamer voor lange tekst te geven, maar sizeToFit()het zal dwingen om alleen de noodzakelijke te gebruiken, maar ALTIJD noem het na het instellen van de .frame.size.height.

Ik raad het instellen van een .backgroundColorvoor debug doeleinden, op deze manier kun je het frame zien wordt gemaakt voor elk geval.

antwoordde op 26/11/2015 om 18:51
bron van user

stemmen
2

U kunt het gebruiken als een methode, als goed. @Pyjamasam is heel erg waar is, dus ik ben gewoon het maken van zijn methode. Het kan behulpzaam voor iemand anders

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

en stel het gewoon als dit

label.frame = [self setDynamicHeightForLabel:label andMaxWidth:300.0];
antwoordde op 20/01/2014 om 13:19
bron van user

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

Gebruik deze hier alle eigenschappen worden gebruikt op het etiket en test het door de tekst in de itemTitle.text toe naarmate

itemTitle.text = @"diofgorigjveghnhkvjteinughntivugenvitugnvkejrfgnvkhv";

het zal de Perfetc antwoord te zien zijn als je nodig hebt

antwoordde op 27/06/2013 om 13:02
bron van user

stemmen
2

Bedankt voor dit bericht. Het hielp me een geweldige deal. In mijn geval ben ik ook de tekst in een afzonderlijke view controller te bewerken. Ik heb gemerkt dat wanneer ik:

[cell.contentView addSubview:cellLabel];

in de tableView: cellForRowAtIndexPath: methode die het label uitzicht was voortdurend gemaakt over de bovenkant van de vorige weergave elke keer dat ik bewerkt de cel. De tekst werd korrelig, en wanneer er iets werd verwijderd of gewijzigd, de vorige versie was zichtbaar onder de nieuwe versie. Hier is hoe ik het probleem opgelost:

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

Geen rare gelaagdheid. Als er een betere manier om dit te verwerken, Laat het me weten.

antwoordde op 20/02/2009 om 23:54
bron van user

stemmen
1

UILabel uitbreiding op basis van dit antwoord voor Swift 4 en hoger

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

}

Kan gebruikt worden als:

self.labelHeightConstraint.constant = self.label.retrieveTextHeight()
antwoordde op 31/10/2017 om 13:00
bron van user

stemmen
1

Het toevoegen van de bovenstaande antwoorden:

Dit kan gemakkelijk worden bereikt via storyboard.

  1. Beperkingswaarde voor UILabel. (In mijn geval ik boven, links en vaste breedte)
  2. Set Aantal lijn naar 0 in Attribute Inspector
  3. Stel Kabelbreuk naar WordWrap in Attribute Inspector.

UILabel hoogte aan te passen

antwoordde op 18/10/2017 om 22:10
bron van user

stemmen
1

Mijn benadering van de dynamische hoogte van UILabel berekenen.

    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

Wikkel om te functioneren:

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
}
antwoordde op 19/07/2017 om 06:02
bron van user

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

Stel beperkingen voor UILable in storyboard met inbegrip van linksboven rechtsonder

antwoordde op 21/01/2017 om 09:07
bron van user

stemmen
1

Deze methode zal perfecte hoogte geven

-(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;
}
antwoordde op 07/04/2016 om 14:00
bron van user

stemmen
1

Mijn code:

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);
antwoordde op 08/06/2015 om 06:51
bron van user

stemmen
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];
antwoordde op 29/04/2015 om 07:13
bron van user

stemmen
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;    
}
antwoordde op 29/08/2012 om 08:29
bron van user

stemmen
1

Een lijn is Chris's antwoord fout is.

newFrame.size.height = maximumLabelSize.height;

zou moeten zijn

newFrame.size.height = expectedLabelSize.height;

Anders dan dat, het is de juiste oplossing.

antwoordde op 21/05/2009 om 07:31
bron van user

stemmen
1

Tot slot, het werkte. Bedankt jongens.

Ik kreeg niet het te laten werken, omdat ik probeerde om het label formaat in heightForRowAtIndexPathmethode:

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

en (ja silly me), ik was de grootte van het label op standaard in cellForRowAtIndexPathmethode - ik was met uitzicht op de code die ik eerder had geschreven:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
antwoordde op 16/01/2009 om 08:25
bron van user

stemmen
0

U kunt de hoogte te krijgen met behulp van onderstaande code

Je moet passeren

  1. 2. text font 3. etiketbreedte

    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
    }
    
antwoordde op 12/04/2018 om 10:43
bron van user

stemmen
0

Het probleem is dat geen van de genoemde functies is realiable en voor een stukje tekst en lettertype onjuiste hoogte waarde terug te keren. Vooral zal falen voor toegeschreven teksten.

De enige realiable oplossing is hier: https://stackoverflow.com/a/4214978/699944 en het punt is om CoreText gebruiken om handmatig hoogte van elke regel te berekenen juiste maat te krijgen. Er is geen andere bekende manier om dit te doen.

antwoordde op 28/01/2014 om 09:55
bron van user

stemmen
0

Deze methode werkt voor zowel iOS 6 en 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;
}

}
antwoordde op 17/01/2014 om 15:55
bron van user

stemmen
-1

Wanneer autoLayout is ingeschakeld Heraanpassen niet werkt :)

antwoordde op 09/10/2013 om 03:07
bron van user

stemmen
-2

Updates volgens 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;
antwoordde op 13/11/2013 om 08:51
bron van user

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