Начиная с обновления до XCode8 GM и ios10, все мои представления, созданные с помощью Interface Builder, не инициализируются правильно до тех пор, пока они не будут намного позже ожидаемых. Это означает, что в viewDidLoad, cellForRowAtIndexPath, viewWillAppear и т.д. Размер кадра равен {1000,1000} для каждого представления. В какой-то момент они, похоже, исправляют, но слишком поздно.
Первая возникшая проблема связана с общим округлением углов, которые не проходят по всем направлениям:
view.layer.cornerRadius = view.frame.size.width/2
Дальнейшие проблемы отображаются для всего, что зависит от размера кадра для выполнения вычислений в коде.
cellForRowAtIndexPath
Для cellForRowAtIndexPath размер кадра не работает на начальном отображении таблицы, но затем отлично работает после его прокрутки. willDisplayCell: forRowAtIndexPath также не имеет правильного размера рамки.
Я жестко закодировал несколько значений, но, очевидно, это очень плохая практика кода, а также довольно много в моих проектах.
Есть ли способ или место для получения правильных размеров кадров?
ИЗМЕНИТЬ
Я обнаружил, что использование ограничения высоты/ширины вместо высоты ширины кадра является более надежным. Это может добавить накладные расходы на необходимость много новых IBOutlets для связывания ограничений высоты и ширины элементов.
На данный момент я создал категорию UIView, которая позволяет мне напрямую обращаться к ограничениям высоты и ширины вида без IBOutlets. Для минимального использования малая петля не должна иметь большого значения. Результаты, не гарантированные для элементов IB без ограничений ширины и высоты, созданы, очевидно. Вероятно, возвращает 0 в лучшем случае для константы, или, что еще хуже. Кроме того, если у вас нет ограничения по высоте и ширине, и размер вашего представления динамически зависит от ведущих/конечных ограничений, это не сработает.
-viewDidLoad имеет правильный размер кадра, но часто приводит к визуальному изменению пользовательского интерфейса, если вы здесь делаете изменения.
UIView + WidthHeightConstraints.h
@interface UIView (WidthHeightConstraints)
-(NSLayoutConstraint*)widthConstraint;
-(NSLayoutConstraint*)heightConstraint;
-(NSLayoutConstraint*)constraintForAttribute:(NSLayoutAttribute)attribute;
@end
UIView + WidthHeightConstraints.m
#import "UIView+WidthHeightConstraints.h"
@implementation UIView (WidthHeightConstraints)
-(NSLayoutConstraint*)widthConstraint{
return [self constraintForAttribute:NSLayoutAttributeWidth];
}
-(NSLayoutConstraint*)heightConstraint {
return [self constraintForAttribute:NSLayoutAttributeHeight];
}
-(NSLayoutConstraint*)constraintForAttribute:(NSLayoutAttribute)attribute {
NSLayoutConstraint *targetConstraint = nil;
for (NSLayoutConstraint *constraint in self.constraints) {
if (constraint.firstAttribute == attribute) {
targetConstraint = constraint;
break;
}
}
return targetConstraint;
}
@end
РЕДАКТИРОВАТЬ 2
Категория выше доказала свою эффективность лишь частично. В основном потому, что ios автоматически добавляет несколько дополнительных дубликатов ограничений высоты и ширины, которые имеют тип NSContentSizeLayoutConstraint, которые на самом деле не имеют тот же размер, что и нормальное ограничение. NSContentSizeLayoutConstraint также является частным классом, поэтому я не могу сделать isKindOfClass, чтобы отфильтровать их. Я еще не нашел другого способа эффективно протестировать их. Это раздражает.