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

现在很多的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进行刷新效果)