2013-09-06 13 views
12

Jeśli metoda sizeWithFont:constrainedToSize:lineBreakMode: jest nieaktualna w systemie iOS7, w jaki sposób mogę automatycznie zmienić rozmiar UILabel, aby dynamicznie dopasować jej wysokość i szerokość do tekstu?Zmień rozmiar UILabel z sizeWithFont: constrainedToSize: lineBreakMode: przestarzałe w iOS7

+1

Zdecydowanie zainteresowany, aby się tego dowiedzieć. Próbowałem zamiast tego używać metody boundingRect, ale nie można wprowadzić ograniczeń, jak to możliwe, z powyższym. – Tim

+0

co jest nie tak z boundingReadWithSize: options: attributes: context? – peko

+0

Musiałem nadużywać tego, dam mu jeszcze raz! – Tim

Odpowiedz

8

Skończyło się na tym. Pracuje dla mnie. Nie działa to z obiektem IBOutlets, ale jest użyteczne, gdy dynamicznie obliczamy wysokość tekstu na podstawie metody uitableview heightForRowAtIndexPath:.

NSDictionary *attributesDictionary = [NSDictionary dictionaryWithObjectsAndKeys: 
                  [UIFont fontWithName:@"FontName" size:15], NSFontAttributeName, 
                  nil]; 

CGRect frame = [label.text boundingRectWithSize:CGSizeMake(263, 2000.0) 
                options:NSStringDrawingUsesLineFragmentOrigin 
                attributes:attributesDictionary 
                context:nil]; 

CGSize size = frame.size; 
+1

To nie wydaje się działać w ogóle z IBOutlet UILabel – Tim

+0

To nie zadziała "jak jest" z auto-układem. Sprawdź moje rozwiązanie tutaj: http://stackoverflow.com/a/18933978/557054 –

6

To powinno działać w iOS6 i iOS7, ale złamie swoje ograniczenia label (trzeba ustawić je wszystkie z powrotem programowo w razie potrzeby):

-(void)resizeHeightForLabel: (UILabel*)label { 
    label.numberOfLines = 0; 
    UIView *superview = label.superview; 
    [label removeFromSuperview]; 
    [label removeConstraints:label.constraints]; 
    CGRect labelFrame = label.frame; 
    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) { 
     CGRect expectedFrame = [label.text boundingRectWithSize:CGSizeMake(label.frame.size.width, 9999) 
                 options:NSStringDrawingUsesLineFragmentOrigin 
                attributes:[NSDictionary dictionaryWithObjectsAndKeys: 
                   label.font, NSFontAttributeName, 
                   nil] 
                 context:nil]; 
     labelFrame.size = expectedFrame.size; 
     labelFrame.size.height = ceil(labelFrame.size.height); //iOS7 is not rounding up to the nearest whole number 
    } else { 
#pragma GCC diagnostic ignored "-Wdeprecated-declarations" 
     labelFrame.size = [label.text sizeWithFont:label.font 
           constrainedToSize:CGSizeMake(label.frame.size.width, 9999) 
            lineBreakMode:label.lineBreakMode]; 
#pragma GCC diagnostic warning "-Wdeprecated-declarations" 
    } 
    label.frame = labelFrame; 
    [superview addSubview:label]; 
} 

Dodaj tę metodę do viewController i używać go tak:

[self resizeHeightForLabel:myLabel]; 
//set new constraints here if needed 
+1

To jest ratownik! Ilość czasu, którą spędziłem na rozmyślaniu z tym, jest nierealna, na przykład dla prostego problemu, który próbuję rozwiązać. –

+0

Używam tego i dobrze zmieniam rozmiar etykiety, ale gdy etykieta zostanie ponownie dodana do podglądu, pozycja jest nieprawidłowa, mimo że mogę sprawdzić, czy punkt początkowy jest nadal poprawnie ustawiony na ramce. –

+0

@PeteMartin to Ty z pewnością jeden z superdokładów to nie UITableViewCell lub inny buforowany element UI? W takim przypadku potrzebne jest pewne obejście. –