UINavigationController

案例一:實現(xiàn)全屏滑動

- (void)viewDidLoad {
    [super viewDidLoad];
    self.title = @"替換系統(tǒng)手勢";
    NSArray *targetsArr =  [self.navigationController.interactivePopGestureRecognizer valueForKey:@"targets"];
    id target = [[targetsArr lastObject] valueForKey:@"target"];
    SEL actionSEL = NSSelectorFromString(@"handleNavigationTransition:");
    UIPanGestureRecognizer *panGesture = [[UIPanGestureRecognizer alloc] initWithTarget:target action:actionSEL];
    [self.view addGestureRecognizer:panGesture];
    panGesture.delegate = self;
}
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer{
    return self.navigationController.childViewControllers.count != 1;
}

案例二:去掉導(dǎo)航欄下的線

    UIView * backgroundView = [self.navigationBar subviews].firstObject;
    UIView * navLine = [backgroundView.subviews firstObject];
    navLine.hidden = YES;

案例三:隱藏tabbar

-(void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated{

    if (self.viewControllers.count > 0) {
        //viewController是將要被push的控制器
        viewController.hidesBottomBarWhenPushed = YES;
    }
    [super pushViewController:viewController animated:animated];
    
}

案例三:隱藏導(dǎo)航欄返回文字

    //ios11 導(dǎo)致箭頭下偏
    [[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(510, 550) forBarMetrics:UIBarMetricsDefault];
    //可以采用如下方法
    if (@available(iOS 11 ,*)) {
        [[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(-300, 0) forBarMetrics:UIBarMetricsDefault];
    }else{
        [[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(0, -300) forBarMetrics:UIBarMetricsDefault];
    }

案例四:改變狀態(tài)欄字體顏色

- (UIStatusBarStyle)preferredStatusBarStyle{
    //白色
    return UIStatusBarStyleLightContent;
}

案例五:隱藏返回按鈕

[self.navigationItem setHidesBackButton:YES animated:YES];

案例六:打開手勢

self.navigationController.interactivePopGestureRecognizer.delegate = self;
#pragma mark UIGestureRecognizerDelegate
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer{
    return YES;
}

案例七:導(dǎo)航欄標(biāo)題字體顏色及其大小

    self.navigationBar.titleTextAttributes = @{NSForegroundColorAttributeName:[UIColor colorWithHex:0x333333 alpha:1],NSFontAttributeName:[UIFont boldSystemFontOfSize:18]};

案例八:改變導(dǎo)航欄圖標(biāo)的顏色

self.navigationBar.tintColor = [UIColor colorWithHex:333333 alpha:1];

案例九:隱藏導(dǎo)航欄
第一種做法
-注意這里一定要用動畫的方式隱藏導(dǎo)航欄,這樣在使用滑動返回手勢的時候效果最好,和上面動圖一致.這樣做有一個缺點(diǎn)就是在切換tabBar的時候有一個導(dǎo)航欄向上消失的動畫.

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];

    [self.navigationController setNavigationBarHidden:YES animated:YES];
}

- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];

    [self.navigationController setNavigationBarHidden:NO animated:YES];
}

第二種做法
設(shè)置self為導(dǎo)航控制器的代理,實現(xiàn)代理方法,在將要顯示控制器中設(shè)置導(dǎo)航欄隱藏和顯示,使用這種方式不僅完美切合滑動返回手勢,同時也解決了切換tabBar的時候,導(dǎo)航欄動態(tài)隱藏的問題.

@interface WLHomePageController () <UINavigationControllerDelegate>

@end

@implementation WLHomePageController 

#pragma mark - lifeCycle
- (void)viewDidLoad {
    [super viewDidLoad];

    // 設(shè)置導(dǎo)航控制器的代理為self
    self.navigationController.delegate = self;
}

#pragma mark - UINavigationControllerDelegate
// 將要顯示控制器
- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated {
    // 判斷要顯示的控制器是否是自己
    BOOL isShowHomePage = [viewController isKindOfClass:[self class]];

    [self.navigationController setNavigationBarHidden:isShowHomePage animated:YES];
}

案例十:UIScrollView手勢與側(cè)滑手勢沖突

    NSArray *gestureArray = self.navigationController.view.gestureRecognizers;
    for (UIGestureRecognizer *gestureRecognizer in gestureArray) {
        
        if ([gestureRecognizer isKindOfClass:[UIScreenEdgePanGestureRecognizer class]]) {
            [_scrollView.panGestureRecognizer requireGestureRecognizerToFail:gestureRecognizer];
        }
    }

案例十一:在UINavigationController的rootViewController上滑動返回時,會出現(xiàn)界面卡死的情況。在導(dǎo)航欄的基類中作如下處理。

#pragma mark - UIGestureRecognizerDelegate
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {
    if (gestureRecognizer == self.interactivePopGestureRecognizer) {
        // 屏蔽調(diào)用rootViewController的滑動返回手勢
        if (self.viewControllers.count < 2 || self.visibleViewController == [self.viewControllers objectAtIndex:0]) {
            return NO;
        }
    }
    return YES;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 15,055評論 4 61
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,769評論 25 709
  • 1.有時候,愛情也會是一個唯美的童話。 認(rèn)識Sam那年,我大一,他大三。 初進(jìn)大學(xué),便常聽人議論他,包括后來和我成...
    蕭蕭_4358閱讀 592評論 0 0
  • 我們開發(fā)出來的APP通常要通過第三方分享到其他社交平臺,如qq、微博、微信等。通過分享可以提高APP的傳播效率,增...
    WYS_wys閱讀 1,084評論 0 2
  • 你的學(xué)習(xí)計劃進(jìn)行的如何? 學(xué)習(xí)效率是否符合你的預(yù)期? 為何你總是半途而廢? 據(jù)統(tǒng)計,一個人完成自己的計劃的概率只有...
    百煉生閱讀 982評論 2 4

友情鏈接更多精彩內(nèi)容