通过点击状态栏滚动到UITableView的顶部

时间:2011-08-23 18:38:15

标签: ios objective-c scroll tableview statusbar

我知道有很多代码可以将tableview滚动到顶部,但我想在点击顶级状态栏时执行此操作,就像Apple的原生应用程序一样。这可能吗?

9 个答案:

答案 0 :(得分:148)

您可以免费获得此内容,但是应该检查scrollsToTop的{​​{1}}属性是否为。

如果这不起作用,那么当你有一个UITableView(或者像UITextView这样的后代类)对象嵌入到另一个UIScrollView类(如UIScrollView)中时。在这种情况下,请将嵌入式UITableView类中的scrollsToTop设置为NO。然后tap-the-status-bar行为将起作用。

答案 1 :(得分:31)

如果您来自Google并需要完整的核对清单:

  1. 检查您是否在UITableView上设置了scrollsToTop = YES(根据Mark的建议)
  2. 确保在窗口中的所有其他UITableViews / UIScrollViews / UITextViews上设置了scrollsToTop = NO,这样它们就不会拦截点击。我发现自己多次在窗口中打印出所有视图来调试这个......
  3. 确保您的表格视图位于窗口内的0/0(x / y坐标) - 这是系统知道它应该传递消息的方式

答案 2 :(得分:6)

使用其他答案中提供的信息,我将以下代码添加到我的UITableViewController中,让它工作:

- (void)viewDidLoad
{
    [super viewDidLoad];

    for (UITextView *view in self.view.subviews) {
        if ([view isKindOfClass:[UITextView class]]) {
            view.scrollsToTop = NO;
        }
    }

    self.tableView.scrollsToTop = YES;
}

这将查看UITableViewController层次结构中的所有视图,并在拦截触摸事件的所有UITextView上关闭scrollsToTop。然后,确保tableView仍然可以接收触摸。

你可以修改它来遍历可能正在拦截的其他UITableViews / UIScrollViews / UITextViews。

希望这有帮助!

答案 3 :(得分:6)

我遇到了同样的问题,但通过以下步骤修复:

  1. 为tableview设置scrollsToTop = YES,您想要滚动到顶部。
  2. 为所有其他tableview或集合视图或scrollview设置scrollsToTop = NO。
  3. 如果您的任何tableview单元格都有集合视图。确保将集合视图的scrollsToTop设置为NO。
  4. 如果您的视图控制器/导航控制器作为子视图添加到另一个视图控制器上,请确保将其设置为子控制器。

答案 4 :(得分:2)

像Mark说的那样,你只能有一个UIScrollView的子类(通常是表视图),它将scrollsToTop属性设置为TRUE。可能你有其他人,通常是你视图中的UITextView。只需将他们的scrollsToTop属性设置为FALSE,你就可以了。

答案 5 :(得分:2)

我知道这是一个古老的,但希望这可以帮助。根据@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。

答案 6 :(得分:1)

在UIScrollView头文件中:

  

//当用户点击状态栏时,最接近状态栏的触摸下方的滚动视图将滚动到顶部,但仅当其scrollsToTop属性为YES时,其委托才会返回来自shouldScrollViewScrollToTop的NO,并且它尚未排在最前面。   //在iPhone上,只有在scrollsToTop == YES的屏幕滚动视图中,我们才会执行此手势。如果找到多个,则不会滚动任何一个。

答案 7 :(得分:0)

例如,如果你有一个表视图和滚动视图,像这样的标签

enter image description here

你应该在viewDidLoad

中做出类似的结论
self.tableView.scrollsToTop = true
self.tagsView.scrollsToTop = false

答案 8 :(得分:0)

可以加载多个 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。