【发布时间】:2016-09-10 02:51:27
【问题描述】:
我有一个 UITableViewController ,其中包含一些自定义单元格和每个单元格内的 UIView。我已经实现了控制器的 cellForRowAtIndexPath 来配置每个单元格中的 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
编辑添加:
问题似乎是在第一次出现 tableview 时调用 cellForRowAtIndexPath 时,单元格没有发生自动布局。在创建单元格后立即使用 [cell setNeedsLayout] 和 [cell layoutIfNeeded] 强制它也不起作用。
看来我的问题根本原因是How to know the width of an UITableViewCell when using auto layout? 的潜在重复所以问题与这样一个事实有关,即当我的 CustomCell 从笔尖加载时,它将具有默认框架。应该做一些特殊的技巧来强制自动布局。但是,接受的答案不适用于最初不在可见区域的单元格。有没有人接受这个?
【问题讨论】:
-
什么时候调用?确保它在 viewDidAppear 或更高版本中。如果在 viewWillAppear 或 viewDidLoad 中调用它,它还不会被调整大小。
-
它是从 cellForRowAtIndexPath 调用的,因为它是配置单元格内容所需要的。调用在 sn-p 上可见。
-
为什么不对单元格中的自定义内容使用大小类相关的自动布局?
-
我是。但是我的 UIView 内容需要运行时计算,这就是为什么我需要知道自动布局后的宽度。我的代码不可靠,这是我提出问题的原因。
标签: ios objective-c uiview autolayout size-classes