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
Odpowiedz
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;
To nie wydaje się działać w ogóle z IBOutlet UILabel – Tim
To nie zadziała "jak jest" z auto-układem. Sprawdź moje rozwiązanie tutaj: http://stackoverflow.com/a/18933978/557054 –
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
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ć. –
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. –
@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. –
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
co jest nie tak z boundingReadWithSize: options: attributes: context? – peko
Musiałem nadużywać tego, dam mu jeszcze raz! – Tim