У меня есть UITableViewController с некоторыми пользовательскими ячейками и UIView в каждой ячейке. Я внедрил контроллер cellForRowAtIndexPath для настройки UIView в каждой ячейке. Для этого мне нужно знать ширину UIView на экране. Поскольку я использую классы автоопределения и размера для автоматического изменения размера UIView на основе ориентации устройства, я внедрил дополнительный метод получения времени выполнения ширины.Размер автоопределения UIView, указанный в неправильном классе размеров, впервые
Проблема в том, что, когда представление таблицы представлено в первый раз, мой код сообщает ширину для UIVIew из класса компактной ширины, даже когда я использую устройство в альбомной ориентации. Система отображает все представления как следует, но мой код для получения ширины не работает. Прокрутка новых ячеек, видимых или изменение ориентации, немедленно устранит ситуацию.
Мой код:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
// ...
CustomCell* cell = [tableView dequeueReusableCellWithIdentifier:@"CustomCell"];
if (cell == nil) {
NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"CustomCell" owner:self options:nil];
cell = [nib firstObject];
} else {
// Clear custom content
NSArray *viewsToRemove = [cell.histogramView subviews];
for (UIView *v in viewsToRemove) {
[v removeFromSuperview];
}
}
[cell setNeedsLayout];
[cell layoutIfNeeded];
int width = ((CustomView*)cell.customView).getWidth;
NSLog(@"width = %d", width);
// ...
}
И потом:
@implementation CustomView
- (int)getWidth {
[self setNeedsLayout];
[self layoutIfNeeded];
int width = self.frame.size.width;
return width;
}
@end
Edited добавить:
Проблема, кажется, что в том, когда cellForRowAtIndexPath называется первый раз появляется TableView, autolayout для ячейки не произошло. Принудительно с помощью [cell setNeedsLayout] и [cell layoutIfNeeded] сразу после создания ячейки тоже не делается.
Похоже, что моя основная причина проблемы - это потенциальный дубликат How to know the width of an UITableViewCell when using auto layout?. Так что проблема связана с тем, что, когда мой CustomCell загружается из nib, у него будет рамка по умолчанию. Специальные трюки должны быть сделаны, чтобы принудительно отключить автозапуск. Однако принятый ответ не работает для ячеек, которые изначально выходят из видимой области. Все берут на себя это?
Когда это называется? Убедитесь, что он находится в viewDidAppear или позже.Если он вызван в viewWillAppear или viewDidLoad, он пока не будет определен. –
Он вызывается из cellForRowAtIndexPath, поскольку он необходим для настройки содержимого ячейки. Вызов отображается в фрагменте. – AntonBoer
Почему вы не используете автозапуск, зависящий от размера, для вашего пользовательского контента в ячейке? – fabe