Ios 点击状态栏滚动至UITableView顶部

Ios 点击状态栏滚动至UITableView顶部,ios,objective-c,scroll,tableview,statusbar,Ios,Objective C,Scroll,Tableview,Statusbar,我知道有很多代码可以将tableview滚动到顶部,但我想在点击顶部状态栏时这样做,就像在苹果的原生应用程序中一样。这可能吗?您可以免费获得此功能,但您应该检查UITableView的scrollsToTop属性是否为YES 如果在另一个UIScrollView类(如UITableView)中嵌入了UIScrollView对象,则此操作不起作用。在这种情况下,将嵌入式UIScrollView类上的ScrollStop设置为NO。然后点击状态栏行为将起作用。如果您来自谷歌,需要完整的检查表: 检查

我知道有很多代码可以将tableview滚动到顶部,但我想在点击顶部状态栏时这样做,就像在苹果的原生应用程序中一样。这可能吗?

您可以免费获得此功能,但您应该检查
UITableView
scrollsToTop
属性是否为YES


如果在另一个
UIScrollView
类(如
UITableView
)中嵌入了
UIScrollView
对象,则此操作不起作用。在这种情况下,将嵌入式
UIScrollView
类上的
ScrollStop
设置为NO。然后点击状态栏行为将起作用。

如果您来自谷歌,需要完整的检查表:

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

  • 正如Mark所说,您只能有一个子类UIScrollView(通常是表视图),它的ScrollStop属性设置为TRUE。您可能有其他视图,通常是视图中的UITextView。只需将他们的ScrollStop属性设置为FALSE,就可以了。

    使用其他答案中给出的信息,我向UITableViewController添加了以下代码,以使其正常工作:

    - (void)viewDidLoad { [super viewDidLoad]; for (UITextView *view in self.view.subviews) { if ([view isKindOfClass:[UITextView class]]) { view.scrollsToTop = NO; } } self.tableView.scrollsToTop = YES; } -(无效)viewDidLoad { [超级视图下载]; for(UITextView*self.view.subview中的视图){ if([view IsKindof类:[UITextView类]]){ view.scrollsToTop=否; } } self.tableView.scrollsToTop=是; } 这将查看UITableViewController层次结构中的所有视图,并在截取触摸事件的所有UITextView上关闭ScrollStop。然后,确保tableView仍将接受触摸

    您可以对此进行修改,以迭代其他可能也正在拦截的UITableView/UIScrollView/UITextView


    希望这有帮助

    我知道这是一个很老的问题,但希望这能有所帮助。按照@MarkGranoff的说法,如果多个UIScrollView或其子类将ScrollStop设置为YES(默认值),则ScrollStop不起作用,可能需要进行一次理智检查,以检查到底是谁在搞砸这种行为。下面的简单方法循环查看视图的子视图,并记录视图中所有UIScrollView的ScrollStop值。最好在ViewDidDisplay方法中调用

    - (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子类的ScrollStop值后,只需确保只有一个设置为YES。

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

  • 对于要滚动到顶部的tableview,Set scrollsToTop=YES
  • 对于所有其他tableview或collection view或scrollview,将scrollsToTop设置为否
  • 如果任何tableview单元格具有集合视图。确保将集合视图的scrollsToTop也设置为NO

  • 如果将视图控制器/导航控制器添加为另一个视图控制器上的子视图,请确保将其设置为子控制器。

    在UIScrollView头文件上:

    //当用户轻触状态栏时,触摸下方最靠近状态栏的滚动视图将滚动至顶部,但仅当其
    ScrollStopTop
    属性为“是”时,其代理不会从
    shouldScrollViewScrollTopTop
    返回“否”,并且它尚未位于顶部。 //在iPhone上,只有当屏幕上有一个滚动视图显示为
    scrollsToTop
    ==YES时,我们才会执行此手势。如果找到多个,则不会滚动任何一个


    例如,如果您有一个表视图和滚动视图,就像这样的标记

    您应该在
    viewDidLoad

    self.tableView.scrollsToTop = true
    self.tagsView.scrollsToTop = false
    

    可以加载多个UIScrollView子体,例如:在每个包含UITableView的页面上都有一个UIPageViewcontroller

    默认情况下,scrollsToTop属性为true

    因此,除了处理嵌套的UIScrollView的ScrollStop属性外,还应执行以下操作:

    //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的ScrollStop将被设置为true。

    我已经尝试了您的建议—将嵌入式scrollview的ScrollStop设置为NO—但状态栏点击仍然不会导致顶部scrollview滚动到顶部。这非常有效@CharlieMezak也许屏幕上有不止一个嵌入式滚动视图。除了视图层次结构顶部的滚动视图外,它们都必须设置为“否”。在我的例子中,我的垂直滚动表视图中有一些水平滚动的集合视图,将所有集合视图的
    scrollsToTop
    设置为
    NO
    。看起来不直观,但它起作用了@CharlieMezak注意到
    scrollsToTop=NO
    规则必须应用于窗口中的所有视图。例如,如果您有侧菜单,这是在我的UICollectionView中发生的。我在每个UICollectionViewCell中都有一个侧面滚动的UIScrollView。将单元格的scrollView设置为scrollsToTop=NO修复了该问题。感谢如果它位于子视图控制器中,并在窗口中将其置于0,0以下,会发生什么情况?当您使用多个UIWebView时,这非常有用,因为您需要将非活动WebView的ScrollStop属性设置为NOThank以获取此完整清单。在我的代码中搜索UITextView并找到了导致问题的代码。正如@shim所问的-@Zane/@Kyle-如果它在窗口中的子视图控制器中,使其低于0,0,该怎么办?我测试了(iOS 8)并发现不需要来自的项“3”。实际上,您可以