美文网首页
点击已选中的UITabBarItem进行刷新效果

点击已选中的UITabBarItem进行刷新效果

作者: EI_Rey | 来源:发表于2018-11-02 11:31 被阅读15次

    现在很多的App都有点击UITabBarItem刷新页面的功能,例如网易云音乐,知乎,简书,微博......(也可以自定义tabbar实现双击刷新)

    实现分三步

    1.记录上次选中的tabBarItem,用于下次点击时判断是选择新控制器还是刷新

    1.1 设置属性用以记录

    @property (nonatomic, strong) UITabBarItem *lastItem;
    

    1.2 viewWillAppear中赋值

    - (void)viewWillAppear:(BOOL)animated{
        [super viewWillAppear:animated];
        // 将默认被选中的tabBarItem保存为属性
        self.lastItem = self.tabBar.selectedItem;
    }
    

    1.3 遵循UITabBarControllerDelegate,保存选中的item,如果这次点击的和上次的一样就发出通知让一些页面刷新

    - (void)tabBar:(UITabBar *)tabBar didSelectItem:(UITabBarItem *)item{
        // 判断本次点击的UITabBarItem是否和上次的一样
        if (item == self.lastItem) { // 一样就发出通知
            SendNotify(TABBARDIDCLICK_NOTIFICATION, nil)
        }
        // 将这次点击的UITabBarItem赋值给属性
        self.lastItem = item;
    }
    

    2. 控制器里监听通知进行刷新,但在刷新前需要判断该页面是否正在显示,不然注册通知的界面都会刷新

    RegisterNotify(TABBARDIDCLICK_NOTIFICATION, @selector(tabBarDidClick))
    
    - (void)tabBarDidClick
    {
        // 如果本控制器的view显示在最前面,就下拉刷新
        if ([self.view isShowingOnKeyWindow]) { // 判断一个view是否显示在根窗口上,该方法在UIView的分类中实现
            [self.scrollView.mj_header beginRefreshing]; // MJRefresh
        }
    }
    
    - (void)dealloc{
        RemoveNofifys(TABBARDIDCLICK_NOTIFICATION, nil)
    }
    

    2.1判断当前view是否正在显示,为UIView添加一个分类方法

    - (BOOL)isShowingOnKeyWindow
    {
        // 主窗口
        UIWindow *keyWindow = [UIApplication sharedApplication].keyWindow;
        
        // 以主窗口左上角为坐标原点, 计算self的矩形框
        CGRect newFrame = [keyWindow convertRect:self.frame fromView:self.superview];
        CGRect winBounds = keyWindow.bounds;
        
        // 主窗口的bounds 和 self的矩形框 是否有重叠
        BOOL intersects = CGRectIntersectsRect(newFrame, winBounds);
        
        return !self.isHidden && self.alpha > 0.01 && self.window == keyWindow && intersects;
    }
    

    相关文章

      网友评论

          本文标题:点击已选中的UITabBarItem进行刷新效果

          本文链接:https://www.haomeiwen.com/subject/vuvqxqtx.html