如何修复或解决此tableView textField autolayout故障?

tra*_*per 10 objective-c uitableview ios autolayout

我认为根本原因在于它estimatedRowHeight用于对底层证券做出假设UIScrollView.contentOffset,但这定义总是错误的,因为它是一个估计值.实际行高度完全不同,具体取决于单元格内容和设备方向.

即使我实施estimatedHeightForRowAtIndexPath提供更接近的估计,故障仍然存在.

因此,当您从顶部开始并向下滚动时,一切都很顺利,因为TableView会了解实际的单元格高度,因为它会使contentOffset与单元格位置保持同步.但是一旦你旋转所有真实的单元格高度变化所以UITableView现在不同步,它不知道滚动到哪里.

但是甚至有些奇怪的事情也会发生,有时候UITextField细胞最终会停留在另一个细胞的顶部,并且仍然卡在那里......

无论如何,我把它煮成一个简单的例子.

https://github.com/trapper-/autolayout-glitch

  • 使用iPhone进行测试,如果使用模拟器,则启用软件键盘.
  • 您将看到许多视觉故障只是围绕滚动,选择字段和旋转.
  • 对于一个简单的可重复的例子.
  • 向下滚动到底部.
  • 选择最后一个中的一个UITextField's,以便UITableView需要滚动以确保该字段可见.
  • 旋转设备.

Bri*_*pek 1

我玩弄了你的代码几分钟,因为我在类似的问题上遇到了困难。我希望我能提供帮助,但我没有完全解决它。

我能提供的是我确实做了一些进步。

当设备旋转时,您应该实现 UIViewcontroller 方法来告诉您它将发生并且确实发生了。当发生这种情况时,缓存可见行。然后,完成后,重新加载表格并滚动到那些可见的行。

它看起来像这样:

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
{
    // Save the visible row position
    self.visibleRows = [self.tableView indexPathsForVisibleRows];
}

-(void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation
{
    [self.tableView reloadData];
    // Scroll to the saved position prior to screen rotate
    [self.tableView scrollToRowAtIndexPath:[self.visibleRows objectAtIndex:0] atScrollPosition:UITableViewScrollPositionBottom animated:NO];
}
Run Code Online (Sandbox Code Playgroud)

visibleRows 是 ViewController 上的一个数组 @property。

这使它到达正确的位置(我怀疑,如果您实际上存储了用户正在操作的单个单元格,那么每次都会 100% 到达正确的单元格。

但这样做并没有解决问题,在多次设备旋转的情况下,(有时)仍然会出现舞动的 UITextField 布局不正确的情况。

再说一次,这不是一个解决方案 - 但我想分享我所看到的,所以希望这可以帮助您找到解决方案。

祝你好运!