Я создал подкласс UILabel, который собираюсь использовать во многих разных UITableViewCell
.
В пределах setText:
я использовал sizeWithFont
, чтобы получить динамическую высоту для UILabel
.
Все это прекрасно работает, однако рамка подкласса UILabel
не меняется, пока ячейка не будет перерисована. Как мне преодолеть это?
Примечание. В приведенном ниже коде размер не изменится при перерисовке из-за оператора if
. Я взял это для тестирования и обнаружил, что это работает после перерисовки.
Я думал, что потребуется использование setNeedsDisplay
или подобных, но они тоже не работают.
Вот код, который я использую:
- (void)setText:(NSString *)text
{
if (text != _text) {
// Adjust size to fit contents
//
CGSize maximumSize = CGSizeMake(CGRectGetWidth(self.frame), CGFLOAT_MAX);
CGSize predictedSize = [text sizeWithFont:self.font constrainedToSize:maximumSize lineBreakMode:self.lineBreakMode];
NSLog(@"Predicted size for \"%@\" (width: %f) is %@", text, self.frame.size.width, NSStringFromCGSize(predictedSize));
CGRect headlineDescriptionLabelFrame = self.frame;
headlineDescriptionLabelFrame.size = predictedSize;
NSLog(@"Old frame: %@", NSStringFromCGRect(self.frame));
[self setFrame:headlineDescriptionLabelFrame];
NSLog(@"New frame: %@", NSStringFromCGRect(self.frame));
_text = text;
}
}
Мой вывод выглядит так (с отключенным выше «если»):
2012-12-19 19:51:23.576 myApp[1099:c07] Predicted size for "Facebook's photo-sharing service Instagram denies that it has changed its privacy policy to allow it to sell users' photos to advertisers." (width: 172.000000) is {170, 75}
2012-12-19 19:51:23.578 myApp[1099:c07] Old frame: {{138, 46}, {172, 49}}
2012-12-19 19:51:23.578 myApp[1099:c07] New frame: {{138, 46}, {170, 75}}
Ячейка перезагружается здесь
UILabel изменяется и отображается после этой первой перезагрузки ячейки
2012-12-19 19:51:30.018 myApp[1099:c07] Predicted size for "Facebook's photo-sharing service Instagram denies that it has changed its privacy policy to allow it to sell users' photos to advertisers." (width: 172.000000) is {170, 75}
2012-12-19 19:51:30.018 myApp[1099:c07] Old frame: {{138, 46}, {172, 49}}
2012-12-19 19:51:30.019 myApp[1099:c07] New frame: {{138, 46}, {170, 75}}
Обновить ячейку здесь
2012-12-19 19:51:32.014 myApp[1099:c07] Predicted size for "Facebook's photo-sharing service Instagram denies that it has changed its privacy policy to allow it to sell users' photos to advertisers." (width: 170.000000) is {170, 75}
2012-12-19 19:51:32.014 myApp[1099:c07] Old frame: {{138, 46}, {170, 75}}
2012-12-19 19:51:32.015 myApp[1099:c07] New frame: {{138, 46}, {170, 75}}
ИЗМЕНИТЬ
После 4 дней попыток выяснить это, у меня все еще есть проблемы с этим, кто-нибудь знает, является ли это ошибкой на стороне Apple? Как другие люди изменяют размер UILabel, загруженного из пера UITableViewCell, внутри cellForRowAtIndexPath:
?
setNeedsLayout
? - person Cyrille   schedule 20.12.2012tableView:heightForRowAtIndexPath:
? - person Cyrille   schedule 21.12.2012