UITabBarController移除系統自帶UITabBarButton簡單實現

weixin_33912445發表於2018-06-13

以下做法在iOS 9、10 上可行

在viewWillAppear:方法移除

-(void)viewWillAppear:(BOOL)animated{
    [super viewWillAppear:animated];
    for (UIView *view in self.tabBar.subviews) {
        if([view isKindOfClass:NSClassFromString(@"UITabBarButton")])
            [view removeFromSuperview];
    }
    NSLog(@"%@",self.tabBar.subviews);
}

結果


8065760-6c4632e54a35ddc1.png
WX20180613-211837.png

8065760-2556b39badfa5a97.png
WX20180613-212032.png

在以下兩個方法再次檢視tabBar的子控制元件

-(void)viewWillLayoutSubviews{
    [super viewWillLayoutSubviews];
    NSLog(@"%s",__func__);
    NSLog(@"%@",self.tabBar.subviews);
}

-(void)viewDidAppear:(BOOL)animated{
    [super viewDidAppear:animated];
    NSLog(@"%s",__func__);
    NSLog(@"%@",self.tabBar.subviews);
}

結果顯示確實移除了UITabBarButton


8065760-6c2d85deb3623408.png
WX20180613-212441.png

在iOS11上採用同樣的做法

-(void)viewWillAppear:(BOOL)animated{
    [super viewWillAppear:animated];
    for (UIView *view in self.tabBar.subviews) {
        if([view isKindOfClass:NSClassFromString(@"UITabBarButton")])
            [view removeFromSuperview];
    }
    NSLog(@"%s",__func__);
    NSLog(@"%@",self.tabBar.subviews);
}

-(void)viewWillLayoutSubviews{
    [super viewWillLayoutSubviews];
    NSLog(@"%s",__func__);
    NSLog(@"%@",self.tabBar.subviews);
}

-(void)viewDidAppear:(BOOL)animated{
    [super viewDidAppear:animated];
    NSLog(@"%s",__func__);
    NSLog(@"%@",self.tabBar.subviews);
}

結果
雖然在viewWillApper:方法中移除了UITabBarButton,而且在viewWillLayoutSubViews中顯示為空,但是系統又做了一些處理,還原了UITabBarButton


8065760-156e304d3458f5bf.png
WX20180613-212746.png

暫時解決方案

將移除子控制元件的業務邏輯寫到viewWillLayoutSubviews方法中,得到以下結果,可以移除子控制元件


8065760-a93dcfb064d153ac.png
WX20180613-213152.png

實驗測試寫在viewDidAppear:、viewDidLayoutSubviews均可行

相關文章