Думал, что смогу рассказать об этом.Предварительный расчет высоты строки для UITableView
вполне возможен и очень хорошо работает для оптимизации.
В качестве альтернативы закадровому рисованию, совершенно нормально использовать методы sizeThatFits
таких классов, как UILabel
для определения высоты.
Предостережение заключается в том, что почти все UIView
связанные методы должны выполняться в главном потоке .
Я объясню мой подход, который заключается в создании вида размеров , который я использую для расчета высоты.
Вид размеров можно создать из основного потока:
UILabel *mySizingLabel = [[UILabel alloc] init];
Однако при определении размера это должно быть сделано в основном потоке.Будьте осторожны, чтобы не использовать dispatch_async
или [[NSOperationQueue] mainQueue]
.Это, например, не будет работать :
__block CGSize size;
dispatch_async(dispatch_get_main_queue(), ^{
size = [mySizingLabel sizeThatFits:CGSizeMake(CGFLOAT_MAX, CGFLOAT_MAX)];
}];
CGFloat myCellHeight = size.height;
Это потому, что строка, которая назначает myCellHeight
, будет выполняться перед sizeThatFits
, тем самым давая бессмысленное значение.
Вместо этого необходимо дождаться в главном потоке, пока не вернется sizeThatFits
.Это можно сделать с помощью performSelectorOnMainThread
с wait
, установленным на YES
.Параметры могут передаваться в и из этого метода с использованием NSMutableArray
.
. Этот подход имеет большое преимущество в том, что вы можете воспользоваться преимуществами методов определения размеров, предлагаемых классами UIView
, без необходимостирисовать за кадром, используя пользовательский графический контекст.
Еще одна вещь, не поддавайтесь искушению использовать дополнение UIKit sizeWithFont
.Помимо проблем, отмеченных Майком Уэллером в «Вы делаете это неправильно # 2: определение размера меток с помощью - [NSString sizeWithFont: ...]» , применяется то же самое предостережение, что этот метод также должен быть выполненна основном:
NSString Справочник по дополнениям UIKit
Методы, описанные в этом расширении класса, должны использоваться из основного потока вашего приложения.