我认为根本原因是 estimatedRowHeight
用于对底层 UIScrollView.contentOffset
进行假设,但这根据定义总是错误的,因为它是估计。实际行高完全不同,具体取决于单元格内容和设备方向。
即使我实现 estimatedHeightForRowAtIndexPath
以提供更接近的估计,但问题仍然存在。
因此,当您从顶部开始并向下滚动时,一切都很好,因为 TableView 会在保持 contentOffset 与单元格位置同步的同时学习实际的单元格高度。但是,一旦您旋转了所有实际单元格高度,UITableView
现在就不再同步了,它不知道要滚动到哪里。
但也有更奇怪的事情发生,有时 UITextField
单元格最终会位于另一个单元格之上,并一直卡在那里...
无论如何,我已经将其归结为一个简单的示例。
https://github.com/trapper-/autolayout-glitch
- 使用 iPhone 进行测试,如果使用模拟器,则启用软件键盘。
- 您会看到许多视觉故障只是在滚动、选择字段和旋转时出现。
- 对于一个简单的可重复的例子。
- 向下滚动到底部。
- 选择最后一对
UITextField
之一,这样UITableView
将需要滚动以确保该字段可见。 - 旋转设备。
最佳答案
我研究了您的代码几分钟,因为我曾遇到过类似的问题。我希望我能提供帮助,但我没有完全解决它。
我能提供的是我确实取得了一些的进步。
当设备旋转时,您应该实现 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];
}
visibleRows 是 ViewController 上的一个数组@property。
这使它到达了正确的位置(我怀疑如果您实际上存储了用户正在操作的单个单元格,那么每次都会让您 100% 到达正确的单元格。
这没有做的是,随着设备的多次旋转,舞动的 UITextFields 的布局仍然不正确(有时)。
同样,这不是解决方案 - 但我想分享我所看到的,希望这能帮助您找到解决方案。
祝你好运!
关于ios - 我该如何修复或解决此 tableView textField 自动布局故障?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41030340/