【发布时间】:2011-11-02 05:09:24
【问题描述】:
我知道有大量代码可以将 tableview 滚动到顶部,但我想在点击顶部状态栏时执行此操作,就像在 Apple 的本机应用程序中一样。这可能吗?
【问题讨论】:
-
我测试过(iOS 8),发现Zane Claes checklist中的“3”项是不需要的。
标签: ios objective-c scroll tableview statusbar
我知道有大量代码可以将 tableview 滚动到顶部,但我想在点击顶部状态栏时执行此操作,就像在 Apple 的本机应用程序中一样。这可能吗?
【问题讨论】:
标签: ios objective-c scroll tableview statusbar
您可以免费获得这个,但您应该检查您的UITableView 的scrollsToTop 属性是否为YES。
当你有一个 UIScrollView(或像 UITextView 这样的后代类)对象嵌入另一个 UIScrollView 类(如 UITableView)时,这不起作用。在这种情况下,将嵌入式UIScrollView 类上的scrollsToTop 设置为NO。然后点击状态栏行为将起作用。
【讨论】:
scrollsToTop 设置为 NO 以使所有集合视图都有效。看起来不直观,但确实有效!
scrollsToTop = NO 规则必须应用于窗口中的所有视图。例如,如果您有侧边菜单。
如果您来自 Google 并需要一份完整的清单:
【讨论】:
使用其他答案中给出的信息,我将以下代码添加到我的 UITableViewController 中让它工作:
- (void)viewDidLoad { [超级视图DidLoad]; for (UITextView *view in self.view.subviews) { if ([查看 isKindOfClass:[UITextView 类]]) { view.scrollsToTop = 否; } } self.tableView.scrollsToTop = 是; }这会查看 UITableViewController 层次结构中的所有视图,并关闭所有拦截触摸事件的 UITextView 上的 scrollsToTop。然后,确保 tableView 仍然会接收到触摸。
您可以修改它以遍历其他可能被拦截的 UITableViews / UIScrollViews / UITextViews。
希望这会有所帮助!
【讨论】:
我遇到了同样的问题,但通过以下步骤解决了:
如果您的视图控制器/导航控制器作为子视图添加到另一个视图控制器上,请确保将其设置为子控制器。
【讨论】:
addChildViewController() 是缺失的部分。谢谢!
我知道这是一个很老的问题,但希望这能有所帮助。按照@MarkGranoff 所说,如果多个 UIScrollView 或其子类将其设置为 YES(默认值),则 scrollsToTop 不起作用,可能值得进行健全性检查,以检查谁实际上在搞乱这种行为。下面的简单方法遍历视图的子视图并记录视图中所有 UIScrollView 的 scrollsToTop 值。最好在您的 viewDidAppear 方法中调用。
- (void)checkForScrollViewInView:(UIView *)view {
for (UIView *subview in [view subviews]) {
if ([subview isKindOfClass:[UIScrollView class]]) {
NSLog(@"scrollsToTop enabled: %i in scroll view %@", ((UIScrollView *)subview).scrollsToTop, subview);
}
if (subview.subviews.count > 0) {
[self checkForScrollViewInView:subview];
}
}
}
这确实只是一个调试代码。一旦找到每个 UIScrollView 子类的 scrollsToTop 值,只需确保只有一个设置为 YES。
【讨论】:
就像 Mark 说的,你只能有一个 UIScrollView 的子类(通常是表格视图),它的 scrollsToTop 属性设置为 TRUE。您可能还有其他人,通常是 UITextView 在您的视图中。只需将他们的 scrollsToTop 属性设置为 FALSE 即可。
【讨论】:
关于 UIScrollView 头文件:
// 当用户点击状态栏时,最靠近状态栏的触摸下方的滚动视图将滚动到顶部,但只有当它的
scrollsToTop属性为YES时,它的delegate才不会返回NOshouldScrollViewScrollToTop,它还没有在顶部。 // 在 iPhone 上,只有当屏幕上有一个带有scrollsToTop== YES 的滚动视图时,我们才会执行此手势。如果找到多个,则不会滚动任何一个。
【讨论】:
可以加载多个 UIScrollView 后代,例如:在包含 UITableViews 的每个页面上都有一个 UIPageViewcontroller。
scrollsToTop 属性默认为 true。
所以除了处理嵌套的 UIScrollViews 的 scrollsToTop 属性之外,你还应该做以下事情:
//When the view is loaded disable scrollsToTop, this view may not be the visible one
override func viewDidLoad() {
super.viewDidLoad()
...
tableView.scrollsToTop = false
}
//Now it's time to enable scrolling, the view is guaranteed to be visible
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
tableView.scrollsToTop = true
}
//Do not forget to disable scrollsToTop, making other visible UIScrollView descendant be able to be scrolled to top
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
self.tableView.scrollsToTop = false
}
这样只有一个顶级 UITableView 的 scrollsToTop 会被设置为 true。
【讨论】: