如果标题不明显,我想要的应该很简单,让 tableView
在用户第一次看到它时(在他看到之前)开始一直滚动到底部看到它,并且没有动画)。
所以,我知道这个问题已经回答了几次,但这些解决方案目前似乎都不起作用。 为了提供一些背景信息,我使用的是 Swift、自动布局和最新版本的 iOS。
约束
有些事情我需要支持:
- 在用户看到它之前加载它(显然没有动画)。
- 动态单元格高度,即它们的高度由 UILabel 确定(类似于消息传递应用程序 - 在 Storyboard 中使用自动布局)。
- 我的
UITableView
位于UIScrollView
中(UIScrollView
水平滚动,UITableView
垂直滚动)。 UITableView
在childViewController
中,也就是说,我将它添加到主UIViewController
(由于某种原因,它使viewWillAppear
未被调用 -viewDidAppear
仍被调用)。
我将总结一下我的尝试:
至于实现:
tableView.contentOffset = CGPoint(x: 0, y: CGFloat.max
tableView.scrollToRowAtIndexPath(indexPathForLastItem, atScrollPosition: .Bottom, animated: false)
var contentOffset = tableView.contentOffset
contentOffset.y = tableView.contentSize.height - tableView.bounds.size.height
tableView.setContentOffset(contentOffset, animated: false)
dispatch_async(dispatch_get_main_queue(), {
// tried option 1., 2. and 3. here
})
至于我尝试调用这些实现的地方:
viewDidLoad
viewWillAppear
viewDidLayoutSubviews
(仅在第一次调用时,我使用一个属性来跟踪它)viewDidAppear
(即使这不会给我我想要的)- 在我模型的
didSet
在那些之前我总是调用 tableView.reloadData
我不想做的事:
tableView.transform = CGAffineTransformMakeScale(1, -1)
+
cell.transform = CGAffineTransformMakeScale(1, -1)
(我假设如果你想推荐这个解决方案,那是因为你知道我正在谈论的技巧。如果你不知道,那么你就不会推荐这个,所以你不需要了解它是如何工作的)
我不想要这个的原因之一是因为现在我无法滚动到顶部...
我注意到的问题:
tableView
的contentSize
(作为UIScrollView
的子类)在它出现后第一次滚动时发生变化。是的,我指的是contentSize
,而不是contentOffset
,它会在您滚动时改变不止一次。在您滚动整个tableView
一次后,它就不再改变了。- 有些人说它适用于更少的单元格(老实说,它在某些时候对我有用),所以至少尝试使用 20 个项目。
viewWillAppear
不会被调用,但viewDidAppear
会被调用。
任何解决方案(除了我提到的我不想要的解决方案)将不胜感激。即使是 hacky 的,只要它们不破坏其他东西。
正如旁注,scrollToRowAtIndexPath...
不缩放,也就是说,如果您有 2000 个项目,它就太慢了。所以理想情况下,我更喜欢可扩展的解决方案。
回答后的编辑:
在 @bsmith11 的回答后我尝试了:
private var called = false override func viewDidLayoutSubviews() { super.viewDidLayoutSubviews() if !called { dispatch_async(dispatch_get_main_queue(), { self.tableView.setContentOffset(CGPoint(x: 0, y: self.tableView.bounds.height), animated: false) }) called = true } }
但没有成功。
最佳答案
在 viewDidLayoutSubviews()
中,将 .contentOffset
设置为 tableView.bounds.height
。您需要在异步 block 中启动它,以便 tableView
有时间加载它的内容。
dispatch_async(dispatch_get_main_queue()) {
self.tableView.setContentOffset(tableView.bounds.height, animated: false)
}
viewDidLayoutSubviews()
可以被调用多次,因此您可能希望确保上面的代码只被调用一次。
关于ios - UITableView - 在 viewDidAppear 之前滚动到底部,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36847628/