开启点击状态栏回顶功能

  • 监听状态栏点击事件

    • 系统已经给我们提供了一个回顶的功能属性, 只要点击了状态栏 scrollView (包含子类)就能滚动回顶部
    // When the user taps the status bar, the scroll view beneath the touch which is closest to the status bar will be scrolled to top, but only if its `scrollsToTop` property is YES, its delegate does not return NO from `shouldScrollViewScrollToTop`, and it is not already at the top.
    // On iPhone, we execute this gesture only if there's one on-screen scroll view with `scrollsToTop` == YES. If more than one is found, none will be scrolled.
    @property(nonatomic) BOOL  scrollsToTop __TVOS_PROHIBITED;          // default is YES.
    
    • 注意: 属性上面的说明, 在屏幕中只有一个 scrollView 的 scrollsToTop == YES, 如果有多个的时候, 点击状态栏时, 也是不会回顶
    • 因此, 只能保留当前显示的 TableView 是的scrollsToTop == YES ; 其他的 scrollView.scrollsToTop == NO
    • 设置父控件 _scrollView.scrollsToTop = NO;
    // 取消回顶操作
    _scrollView.scrollsToTop = NO;
    
    • 不管在是点击了标题按钮, 还是拖拽切换显示界面, 都会调用到点击按钮监听调用的方法
    • 因此, 在这个方法中做控制子控制器 View -->>tableView -->> scrollView 的 scrollsToTop 属性
    // 方法一: 前提: 父控件 scrollsToTop == NO;
    // 控制scrollView的scrollsToTop属性
    for (NSInteger i = 0; i < self.childViewControllers.count; i++) {
        UIViewController *childVc = self.childViewControllers[i];
    
        // 如果控制器的view没有被创建,跳过
        if (!childVc.isViewLoaded) continue;
    
        // 如果控制器的view不是scrollView,就跳过
        if (![childVc.view isKindOfClass:[UIScrollView class]]) continue;
    
        // 如果控制器的view是scrollView
        UIScrollView *scrollView = (UIScrollView *)childVc.view;
        scrollView.scrollsToTop = (i == index);
    //    if (i == index) { // 被点击按钮对应的子控制器
    //        scrollView.scrollsToTop = YES;
    //    } else {
    //        scrollView.scrollsToTop = NO;
    //    }
    }
    // 在上面这个方法中虽然做了判断过滤掉内有创建的子控件的 View 
    // 但是, 如果所有子控制器的 View 都创建了, 这时候就要遍历5 次
    
    // 我的方法二: 更加简洁, 性能更高的方法
    // 前提: 父控件必须的 scrollsToTop == NO;
    //      必须是懒加载子控制器的 View 
    //      所有对应的子控制器 view 都必须是 scrollView 或者 scrollView 的子类
    _previousClickTitleButton.selected = NO;
    
    // 取消上一个的子控制的 view 点击状态栏回顶功能
    UIScrollView *ChildView = (UIScrollView *)self.childViewControllers[_previousClickTitleButton.tag].view;
    ChildView.scrollsToTop = NO;
    
    titleButton.selected = !titleButton.selected;
    _previousClickTitleButton = titleButton;
    
    // 在这里添加对应的控制 View 到 scrollView 中
    [self addChildViewToScrollView:titleButton.tag];
    ChildView = (UIScrollView *)self.childViewControllers[_previousClickTitleButton.tag].view;
    ChildView.scrollsToTop = YES;
    

results matching ""

    No results matching ""