Ρυθμίστε το ύψος UILabel ανάλογα με το κείμενο

ψήφοι
289

Εξετάστε το ενδεχόμενο να έχω το ακόλουθο κείμενο σε ένα UILabel(μία μακρά σειρά των δυναμικό κείμενο):

Δεδομένου ότι ο αλλοδαπός στρατό ξεπερνά κατά πολύ την ομάδα, οι παίκτες πρέπει να χρησιμοποιήσουν το μετα-αποκαλυπτικό κόσμο προς όφελός τους, όπως επιδιώκει την κάλυψη πίσω από κάδοι, πυλώνες, αυτοκίνητα, μπάζα και άλλα αντικείμενα.

Θέλω να αλλάξετε το μέγεθος του UILabel'sύψους, έτσι ώστε το κείμενο μπορεί να χωρέσει σε. Είμαι χρησιμοποιώντας ακόλουθες ιδιότητες της UILabelνα κάνει το κείμενο μέσα για να τυλίξει.

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

Παρακαλώ επιτρέψτε μου να ξέρω αν εγώ δεν είμαι κινείται προς τη σωστή κατεύθυνση. Ευχαριστώ.

Δημοσιεύθηκε 15/01/2009 στις 12:19
πηγή χρήστη
Σε άλλες γλώσσες...                            


34 απαντήσεις

ψήφοι
394

sizeWithFont constrainedToSize:lineBreakMode:είναι η μέθοδος που θα χρησιμοποιηθεί. Ένα παράδειγμα για το πώς να το χρησιμοποιήσετε είναι το εξής:

//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;
Απαντήθηκε 15/01/2009 στις 16:01
πηγή χρήστη

ψήφοι
231

Θα πήγαιναν προς τη σωστή κατεύθυνση. Το μόνο που χρειάζεται να κάνετε είναι:

myUILabel.numberOfLines = 0;
myUILabel.text = @"Enter large amount of text here";
[myUILabel sizeToFit];
Απαντήθηκε 20/08/2009 στις 05:45
πηγή χρήστη

ψήφοι
41

Στο iOS 6 η Apple έχει προσθέσει ένα ακίνητο για να UILabel που απλοποιεί σε μεγάλο βαθμό τη δυναμική κατακόρυφη αλλαγή μεγέθους των ετικετών: preferredMaxLayoutWidth .

Χρησιμοποιώντας αυτή την ιδιότητα σε συνδυασμό με lineBreakMode = NSLineBreakByWordWrapping και sizeToFit μέθοδος επιτρέπει εύκολα αλλάξετε το μέγεθος μιας παράδειγμα UILabel με το ύψος που φιλοξενεί ολόκληρο το κείμενο.

Ένα απόσπασμα από την τεκμηρίωση iOS:

preferredMaxLayoutWidth Το προτιμώμενο μέγιστο πλάτος (σε μονάδες) για μια ετικέτα πολλών γραμμών.

Συζήτηση Αυτή η ιδιότητα επηρεάζει το μέγεθος της ετικέτας, όταν οι περιορισμοί διάταξη εφαρμόζεται σε αυτό. Κατά τη διάρκεια της διάταξης, εάν το κείμενο εκτείνεται πέρα από το πλάτος που καθορίζεται από αυτό το ακίνητο, το πρόσθετο κείμενο ρέει σε μία ή περισσότερες νέες γραμμές, αυξάνοντας έτσι το ύψος της ετικέτας.

Ενα δείγμα:

...
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];
...
Απαντήθηκε 04/11/2013 στις 22:14
πηγή χρήστη

ψήφοι
34

Αντί να γίνει αυτό μέσω προγραμματισμού, μπορείτε να το κάνετε αυτό στο Storyboard / ΧΙΒ, ενώ το σχεδιασμό.

  • Ορίστε UIlabel του αριθμού των γραμμών ιδιοκτησίας στο 0 στο χαρακτηριστικό επιθεωρητή.
  • Στη συνέχεια, ρυθμίστε το πλάτος περιορισμός / (ή), εμπρός και πίσω περιορισμό σύμφωνα με την απαίτηση.
  • Τότε που το ύψος περιορισμού με ελάχιστη τιμή . Τέλος, επιλέξτε τον περιορισμό του ύψους που προσθέσατε και τον επιθεωρητή μέγεθος το ένα δίπλα στο χαρακτηριστικό επιθεωρητή, να αλλάξει ο περιορισμός του ύψους του σχέση από ισούται με - μεγαλύτερο από ό, τι .
Απαντήθηκε 18/06/2015 στις 19:08
πηγή χρήστη

ψήφοι
28

Ελέγξτε το έργο αυτό τέλεια, χωρίς την προσθήκη ενιαία γραμμή κώδικα. (Χρησιμοποιώντας αυτόματη διάταξη)

Έκανα ένα demo για εσάς ανάλογα με τις ανάγκες σας. Κατεβάστε το από κάτω σύνδεσμο,

Autoresize UIView και UILabel

Βήμα προς βήμα οδηγό: -

Βήμα 1: - Ορισμός περιορίζουν σε UIView

1) Οδηγώντας 2) Κορυφή 3) Να σύρει (Από mainview)

εισάγετε περιγραφή της εικόνας εδώ

Βήμα 2: - Ρυθμίστε περιορίσουν για την Ετικέτα 1

1) Leading 2) Top 3) Να σύρει (Από είναι superview)

εισάγετε περιγραφή της εικόνας εδώ

Βήμα 3: - Ρυθμίστε περιορίσουν για την Ετικέτα 2

1) Leading 2) Ακολουθίας (Από είναι superview)

εισάγετε περιγραφή της εικόνας εδώ

Βήμα 4: - Πιο δύσκολο δώσει ενδύματος να UILabel από UIView.

εισάγετε περιγραφή της εικόνας εδώ

Βήμα 5: - (Προαιρετικό) Ορίστε περιορίζουν σε UIButton

1) Οδηγώντας 2) Κάτω 3) Να σύρει 4) Σταθερή Ύψος (Από mainview)

εισάγετε περιγραφή της εικόνας εδώ

Έξοδος: -

εισάγετε περιγραφή της εικόνας εδώ

Σημείωση: - Βεβαιωθείτε ότι έχετε ορίσει αριθμός των γραμμών = 0 στην ιδιοκτησία Label.

εισάγετε περιγραφή της εικόνας εδώ

Ελπίζω αυτές τις πληροφορίες αρκετή για να καταλάβει Autoresize UIView ανάλογα με το ύψος UILabel και Autoresize UILabel Σύμφωνα με το κείμενο.

Απαντήθηκε 26/04/2016 στις 10:52
πηγή χρήστη

ψήφοι
15

Ευχαριστώ παιδιά για βοήθεια, εδώ είναι ο κώδικας δοκίμασα το οποίο λειτουργεί για μένα

   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];
Απαντήθηκε 23/11/2010 στις 18:20
πηγή χρήστη

ψήφοι
12

Λύση στο iOS7 πριν και iOS7 ανωτέρω

//
//  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
Απαντήθηκε 24/02/2014 στις 11:16
πηγή χρήστη

ψήφοι
10

Από sizeWithFont έχει καταργηθεί μπορώ να χρησιμοποιήσω αυτό το ένα αντ 'αυτού.

Αυτό κανείς να πάρει ετικέτα συγκεκριμένα χαρακτηριστικά.

-(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);
}
Απαντήθηκε 13/11/2014 στις 23:40
πηγή χρήστη

ψήφοι
6

Εδώ είναι μια έκδοση κατηγορία:

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
Απαντήθηκε 10/04/2013 στις 18:58
πηγή χρήστη

ψήφοι
6

Μπορείτε να εφαρμόσετε TableViewController's (UITableViewCell *)tableView:cellForRowAtIndexPath τη μέθοδο με τον ακόλουθο τρόπο (για παράδειγμα):

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

Επίσης, η χρήση NSString«s sizeWithFont:constrainedToSize:lineBreakMode:μέθοδο για να υπολογίσει το ύψος του κειμένου.

Απαντήθηκε 15/01/2009 στις 15:10
πηγή χρήστη

ψήφοι
4

Ο ευκολότερος και καλύτερος τρόπος που λειτούργησε για μένα ήταν να εφαρμόσει το ύψος περιορισμό να επισημαίνουν και να ρυθμίσετε την προτεραιότητα στη χαμηλή , δηλαδή, (250) στο storyboard.

Έτσι, δεν χρειάζεται να ανησυχείτε για τον υπολογισμό του ύψους και του πλάτους προγραμματισμού, χάρη στο storyboard.

Απαντήθηκε 16/05/2016 στις 16:43
πηγή χρήστη

ψήφοι
4

Και για εκείνους που μεταναστεύουν σε iOS 8, εδώ είναι μια επέκταση κλάσης για 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)
        }
    }

}
Απαντήθηκε 27/08/2014 στις 10:18
πηγή χρήστη

ψήφοι
3

Ενημερώθηκε Μέθοδος

+ (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;
}
Απαντήθηκε 06/07/2015 στις 12:21
πηγή χρήστη

ψήφοι
2

Αυτή είναι μια γραμμή κώδικα για να πάρετε το ύψος UILabel χρησιμοποιώντας Objective-C:

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

και χρησιμοποιώντας .height θα πάρετε το ύψος της ετικέτας ως εξής:

neededSize.height
Απαντήθηκε 07/03/2017 στις 13:22
πηγή χρήστη

ψήφοι
2

Για να το κάνετε αυτό σε Swift3 παρακάτω είναι ο κώδικας:

 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)
Απαντήθηκε 01/03/2017 στις 13:27
πηγή χρήστη

ψήφοι
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()

Οι ενδιαφέρουσες γραμμές είναι sizeToFit()σε συνδυασμό με μια ρύθμιση frame.size.heightστο μέγιστο πλωτήρα, αυτό θα δώσει χώρο για μεγάλο κείμενο, αλλά sizeToFit()θα την αναγκάσει να χρησιμοποιούν μόνο την αναγκαία, αλλά πάντα αποκαλούν μετά τη ρύθμιση του .frame.size.height.

Θα ήθελα να συστήσω μια ρύθμιση .backgroundColorγια σκοπούς εντοπισμού σφαλμάτων, με αυτόν τον τρόπο μπορείτε να δείτε το πλαίσιο που παρέχονται για κάθε περίπτωση.

Απαντήθηκε 26/11/2015 στις 18:51
πηγή χρήστη

ψήφοι
2

Μπορείτε να το χρησιμοποιήσετε ως μια μέθοδο, όπως καλά. @Pyjamasam είναι πολύ αληθινό, έτσι είμαι απλά κάνει τη μέθοδο της. Μπορεί να είναι χρήσιμο για κάποιον άλλο

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

και μόλις το ρυθμίσετε όπως αυτό

label.frame = [self setDynamicHeightForLabel:label andMaxWidth:300.0];
Απαντήθηκε 20/01/2014 στις 13:19
πηγή χρήστη

ψήφοι
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];

χρησιμοποιήσετε αυτό εδώ είναι όλες οι ιδιότητες που χρησιμοποιούνται στην επισήμανση και δοκιμάστε το με την αύξηση του κειμένου στο itemTitle.text ως

itemTitle.text = @"diofgorigjveghnhkvjteinughntivugenvitugnvkejrfgnvkhv";

θα δείξει το perfetc απάντηση που χρειάζεστε

Απαντήθηκε 27/06/2013 στις 13:02
πηγή χρήστη

ψήφοι
2

Ευχαριστώ για τη θέση αυτή. Με βοήθησε πολύ. Στην περίπτωσή μου έχω επίσης την επεξεργασία του κειμένου σε ένα ξεχωριστό ελεγκτή άποψη. Παρατήρησα ότι όταν χρησιμοποιώ:

[cell.contentView addSubview:cellLabel];

στο TableView: cellForRowAtIndexPath: μέθοδος που η θέα ετικέτα συνεχώς καθίσταται πάνω από την κορυφή του προηγούμενου προβολή κάθε φορά που επιμελήθηκε το κύτταρο. Το κείμενο έγινε pixelated, και όταν κάτι έχει διαγραφεί ή μεταβληθεί, η προηγούμενη έκδοση ήταν ορατό κάτω από τη νέα έκδοση. Εδώ είναι το πώς θα λυθεί το πρόβλημα:

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

Δεν υπάρχουν άλλα περίεργα layering. Αν υπάρχει ένας καλύτερος τρόπος για να χειριστεί αυτό, παρακαλώ επιτρέψτε μου να ξέρω.

Απαντήθηκε 20/02/2009 στις 23:54
πηγή χρήστη

ψήφοι
1

Επέκταση UILabel με βάση την απάντηση αυτή για Swift 4 και άνω

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

}

Μπορεί να χρησιμοποιηθεί σαν:

self.labelHeightConstraint.constant = self.label.retrieveTextHeight()
Απαντήθηκε 31/10/2017 στις 13:00
πηγή χρήστη

ψήφοι
1

Προσθέτοντας στα παραπάνω απαντήσεις:

Αυτό μπορεί να επιτευχθεί εύκολα μέσω storyboard.

  1. Ορίστε εμπόδιο για UILabel. (Στην περίπτωσή μου ήταν επάνω, αριστερά και σταθερό πλάτος)
  2. Σετ Αριθμός γραμμής με 0 στην Χαρακτηριστικό Επιθεωρητής
  3. Ρύθμιση Γραμμή Διάλειμμα για wordwrap στην Χαρακτηριστικό Επιθεωρητή.

UILabel προσαρμογή ύψους

Απαντήθηκε 18/10/2017 στις 22:10
πηγή χρήστη

ψήφοι
1

Η προσέγγισή μου να υπολογίσουμε τη δυναμική ύψος των 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

Τυλίξτε σε λειτουργία:

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
}
Απαντήθηκε 19/07/2017 στις 06:02
πηγή χρήστη

ψήφοι
1
myLabel.text = "your very long text"
myLabel.numberOfLines = 0
myLabel.lineBreakMode = NSLineBreakMode.ByWordWrapping

Παρακαλούμε να ορίσετε περιορισμούς για UILable στο storyboard, συμπεριλαμβανομένων πάνω αριστερά κάτω δεξιά

Απαντήθηκε 21/01/2017 στις 09:07
πηγή χρήστη

ψήφοι
1

Αυτή η μέθοδος θα δώσει τέλειο ύψος

-(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;
}
Απαντήθηκε 07/04/2016 στις 14:00
πηγή χρήστη

ψήφοι
1

κωδικός μου:

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);
Απαντήθηκε 08/06/2015 στις 06:51
πηγή χρήστη

ψήφοι
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];
Απαντήθηκε 29/04/2015 στις 07:13
πηγή χρήστη

ψήφοι
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;    
}
Απαντήθηκε 29/08/2012 στις 08:29
πηγή χρήστη

ψήφοι
1

Μια γραμμή είναι η απάντηση του Chris είναι λάθος.

newFrame.size.height = maximumLabelSize.height;

θα πρέπει να είναι

newFrame.size.height = expectedLabelSize.height;

Εκτός από αυτό, είναι η σωστή λύση.

Απαντήθηκε 21/05/2009 στις 07:31
πηγή χρήστη

ψήφοι
1

Τέλος, λειτούργησε. Σας ευχαριστώ παιδιά.

Δεν είχα πάρει να εργαστεί, γιατί εγώ προσπαθούσα να αλλάξετε το μέγεθος της ετικέτας στη heightForRowAtIndexPathμέθοδο:

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

και (ναι ανόητη μου), ήμουν αλλαγή μεγέθους της ετικέτας στην προεπιλογή στη cellForRowAtIndexPathμέθοδο - ήμουν με θέα τον κωδικό που είχα γράψει νωρίτερα:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
Απαντήθηκε 16/01/2009 στις 08:25
πηγή χρήστη

ψήφοι
0

Μπορείτε να πάρετε ύψος χρησιμοποιώντας την παρακάτω κώδικα

Θα πρέπει να περάσετε

  1. κειμένου 2. γραμματοσειράς πλάτος 3. ετικέτα

    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
    }
    
Απαντήθηκε 12/04/2018 στις 10:43
πηγή χρήστη

ψήφοι
0

Το πρόβλημα είναι ότι κανένας από αναφέρθηκε λειτουργίες είναι realiable και για κάποιο κορδόνι και γραμματοσειρά θα επιστρέψει εσφαλμένη τιμή του ύψους. Ιδιαίτερα θα αποτύχει για αποδίδονται κείμενα.

Το μόνο realiable λύση είναι εδώ: https://stackoverflow.com/a/4214978/699944 και το θέμα είναι να χρησιμοποιήσετε CoreText για τον υπολογισμό με το χέρι το ύψος του κάθε γραμμή για να πάρει σωστό μέγεθος. Δεν υπάρχει άλλος γνωστός τρόπος για να γίνει αυτό.

Απαντήθηκε 28/01/2014 στις 09:55
πηγή χρήστη

ψήφοι
0

Αυτή η μέθοδος θα λειτουργήσει τόσο για iOS 6 και 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;
}

}
Απαντήθηκε 17/01/2014 στις 15:55
πηγή χρήστη

ψήφοι
-1

Όταν είναι ενεργοποιημένη η αυτόματη διάταξη η αλλαγή μεγέθους δεν λειτουργεί :)

Απαντήθηκε 09/10/2013 στις 03:07
πηγή χρήστη

ψήφοι
-2

Ενημερώσεις σύμφωνα 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;
Απαντήθηκε 13/11/2013 στις 08:51
πηγή χρήστη

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