iOS中tabBar按钮再次点击实现界面回滚或刷新

下面是新浪微博示意图
tabBar按钮点击.gif
  • 在这里说下实现思路

    • 首先是自定义tabBar,遍历子控件,监听按钮的点击事件
    • 在按钮点击事件方法中判断按钮是否为再次点击,如果是对外发出通知
    • 在要实现的刷新或回滚的控制器中接收通知
    • 在对应的控制器中实现刷新或回滚
  • 下面直接上代码

    • 自定义tabBar
      在ZBHTabBar.m中,在这里需要做的是判断当前要点击按钮是否为上一个按钮,如果是,再对外发出通知

#import "ZBHTabBar.h"

@interface ZBHTabBar ()

/** 记录上一次被点击按钮的tag */
@property (nonatomic, assign) NSInteger previousClickedTag;

@end

@implementation ZBHTabBar

//在layoutSubvews布局子控件
- (void)layoutSubviews{
    [super layoutSubviews];

    //遍历子控件
    NSInteger i = 0;
    for (UIButton *tabbarButton in self.subviews) {
        if ([tabbarButton isKindOfClass:NSClassFromString(@"UITabBarButton")]) {
           //绑定tag 标识
            tabbarButton.tag = i;
            i++;
            
            //监听tabbar的点击.
            [tabbarButton addTarget:self action:@selector(tabbarButtonClick:) forControlEvents:UIControlEventTouchUpInside];
        }
    }
    
}
#pragma mark -- tabbar按钮的点击
- (void)tabbarButtonClick:(UIControl *)tabbarBtn{
    //判断当前按钮是否为上一个按钮
    if (self.previousClickedTag == tabbarBtn.tag) {
        
        [[NSNotificationCenter defaultCenter] postNotificationName:
@"TabbarButtonClickDidRepeatNotification" object:nil];
    }
    self.previousClickedTag = tabbarBtn.tag;
}

@end
  • 在需要实现刷新的控制器(如新浪首页)接收通知,幷实现刷新
- (void)viewDidLoad {
    [super viewDidLoad];
    //接收通知
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(tabbarButtonClick) name:@"TabbarButtonClickDidRepeatNotification" object:nil];
}

在这里需要判断当前的视图是否在窗口上,我创建了UIView的分类用来实现的,后面会附上代码

#pragma mark -- 通知按钮的点击
- (void)tabbarButtonClick{
    
    //判断window是否在窗口上
    if (self.view.window == nil) return;
    //判断当前的view是否与窗口重合  nil代表屏幕左上角
    if (![self.view hu_intersectsWithAnotherView:nil]) return;
    //刷新
    [self.tableView.mj_header beginRefreshing];
}

同样的在需要回滚的控制器(如新浪 发现 界面)接收通知,在接收通知方法实现回滚

- (void)tabbarButtonClick{
    
    //判断window是否在窗口上
    if (self.view.window == nil) return;
    //判断当前的view是否与窗口重合
    if (![self.view hu_intersectsWithAnotherView:nil]) return;
    //实现界面的回滚
    [self.tableView scrollRectToVisible:CGRectMake(0, 0, 1, 1) animated:YES];
}
  • 下面是UIView分类中的方法的实现
/** 判断self和anotherView是否重叠 */
- (BOOL)hu_intersectsWithAnotherView:(UIView *)anotherView
{

    //如果anotherView为nil,那么就代表keyWindow
    if (anotherView == nil) anotherView = [UIApplication sharedApplication].keyWindow;
    
    
    CGRect selfRect = [self convertRect:self.bounds toView:nil];

    CGRect anotherRect = [anotherView convertRect:anotherView.bounds toView:nil];
    
    //CGRectIntersectsRect是否有交叉
    return CGRectIntersectsRect(selfRect, anotherRect);
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容