如何UITableViewCell在表格视图中使用s 内的自动布局,让每个单元格的内容和子视图确定行高(本身/自动),同时保持平滑的滚动性能?
我正在使用iOS 8新的自动调整单元格.在视觉上它运作良好 - 每个单元格大小合适.但是,如果我尝试滚动到最后一行,表视图似乎不知道它的正确大小.这是一个错误还是有解决方法?
使用这个项目 - TableViewCellWithAutoLayoutiOS8(从这个SO答案引用),我按预期得到了自动调整大小的单元格.
但是,如果我调用scrollToRowAtIndexPath函数,如下所示:
tableView.scrollToRowAtIndexPath(NSIndexPath(forRow: model.dataArray.count - 1, inSection: 0), atScrollPosition: .Bottom, animated: true)
Run Code Online (Sandbox Code Playgroud)
我没有到达最后一排 - 它只让我到了中途.
即使试图使用这样的低级函数:
tableView.setContentOffset(CGPointMake(0, tableView.contentSize.height - tableView.frame.size.height), animated: true)
Run Code Online (Sandbox Code Playgroud)
结果不如预期,它不会达到目的.如果我点击很多次或等待片刻,最终它会到达正确的位置.似乎tableView.contentSize.height设置不正确,因此iOS"不知道"最后一个单元格在哪里.
非常感谢任何帮助.
谢谢
tldr; 自动约束似乎在push segue上中断并返回查看自定义单元格
编辑:我提供了一个github示例项目,显示发生的错误 https://github.com/Matthew-Kempson/TableViewExample.git
我正在创建一个应用程序,它需要自定义UITableCell的标题标签,以允许根据帖子标题的长度变化的行.单元格正确加载到视图中但是如果我按下一个单元格以将推送信号加载到包含WKWebView的视图中,您可以看到,如屏幕截图所示,单元格会立即移动到不正确的位置.通过UINavigationController的后退按钮加载视图时也会看到这一点.
在这个特殊的例子中,我按下了最后一个单元格,标题是"我在巴黎拍了两张照片",所有内容都正确加载.然后如下一个屏幕截图所示,在加载第二个视图的背景中,单元格都会因未知原因向上移动.然后,当我加载视图时,您可以看到屏幕稍微向上移动,我实际上无法滚动任何低于显示的值.这看起来是随机的,就像其他测试一样,当视图加载回来时底部单元格下方的空白区域不会消失.
我还包括一张包含细胞所具有的约束的图片.
图片(我需要更多的声誉才能在这个问题中提供图像,因此他们就在这张影片中):http://imgur.com/a/gY87E
我的代码:
自定义单元格中的方法,允许单元格在旋转时正确调整视图大小:
override func layoutSubviews() {
super.layoutSubviews()
self.contentView.layoutIfNeeded()
// Update the label constaints
self.titleLabel.preferredMaxLayoutWidth = self.titleLabel.frame.width
self.detailsLabel.preferredMaxLayoutWidth = self.detailsLabel.frame.width
}
Run Code Online (Sandbox Code Playgroud)
tableview中的代码
override func viewDidLoad() {
super.viewDidLoad()
// Create and register the custom cell
self.tableView.estimatedRowHeight = 56
self.tableView.rowHeight = UITableViewAutomaticDimension
}
Run Code Online (Sandbox Code Playgroud)
用于创建单元格的代码
override func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell! {
if let cell = tableView.dequeueReusableCellWithIdentifier("LinkCell", forIndexPath: indexPath) as? LinkTableViewCell {
// Retrieve the post and set details …Run Code Online (Sandbox Code Playgroud) 这是我设置表格的方式:
self.tableView = [[UITableView alloc] initWithFrame:self.view.bounds];
self.tableView.delegate = self;
self.tableView.dataSource = self;
self.tableView.estimatedRowHeight = 150;
[self.view addSubview:self.tableView];
Run Code Online (Sandbox Code Playgroud)
在我的单元格中,我调用- (CGSize)sizeThatFits:(CGSize)size以编程方式返回高度(设置为- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath.我没有使用约束或自动布局.
没有什么复杂的,我的高度都是完美的视觉布局.
然而问题是当我按下一个新的视图控制器时,单元格可视(上或下)跳转/移动.它似乎是基于计算估计的行高值而跳跃 - 然而sizeThatFits也是在移位之前为每个可见单元调用所以我真的很困惑(不知道为什么要么完全需要被调用,因为我离开了视图).我已经检查了tableView的contentOffset - 它没有改变,所以这不是问题.