自定義導(dǎo)航欄實(shí)現(xiàn)全屏滑動(dòng)返回

導(dǎo)航控制器默認(rèn)自帶了側(cè)滑功能,當(dāng)用戶在界面的左邊滑動(dòng)的時(shí)候,就會(huì)有側(cè)滑功能
打印導(dǎo)航控制器自帶的滑動(dòng)手勢(shì),看下它的真實(shí)面目。
系統(tǒng)自帶的滑動(dòng)手勢(shì)interactivePopGestureRecognizer

- (void)viewDidLoad {
    [super viewDidLoad];
    NSLog(@"%@",self.interactivePopGestureRecognizer);
}
1438668848795036.png

由圖中可知:

1.系統(tǒng)自帶的手勢(shì)是UIScreenEdgePanGestureRecognizer類型對(duì)象,屏幕邊緣滑動(dòng)手勢(shì)

2.系統(tǒng)自帶手勢(shì)target是_UINavigationInteractiveTransition類型的對(duì)象

3.target調(diào)用的action方法名叫handleNavigationTransition:

分析:

UIScreenEdgePanGestureRecognizer,看名稱就知道,這個(gè)手勢(shì)的范圍只能在屏幕的周邊,就是因?yàn)檫@個(gè)手勢(shì),系統(tǒng)自帶的滑動(dòng)效果,只能實(shí)現(xiàn)側(cè)邊滑動(dòng)

實(shí)現(xiàn)自定義導(dǎo)航欄全屏滑動(dòng)返回
給自己的導(dǎo)航控制器,添加一個(gè)全屏的滑動(dòng)手勢(shì),調(diào)用系統(tǒng)自帶滑動(dòng)手勢(shì)的target的action方法,利用系統(tǒng)實(shí)現(xiàn)的滑動(dòng)返回功能,加上自己全屏滑動(dòng)手勢(shì),就有全屏滑動(dòng)功能了。

問(wèn)題:如何拿到系統(tǒng)自帶的target對(duì)象?,action方法名已經(jīng)知道,而且系統(tǒng)肯定在target對(duì)象實(shí)現(xiàn)了,只要拿到target對(duì)象,調(diào)用這個(gè)方法就行。

通過(guò)打印系統(tǒng)自帶的滑動(dòng)手勢(shì)的代理,發(fā)現(xiàn)正好是_UINavigationInteractiveTransition對(duì)象,因此我猜測(cè)這個(gè)代理對(duì)象就是target對(duì)象,只要拿到它,就拿到系統(tǒng)自帶滑動(dòng)手勢(shì)的target對(duì)象

- (void)viewDidLoad {
    [super viewDidLoad];
    // 獲取系統(tǒng)自帶滑動(dòng)手勢(shì)的target對(duì)象
    id target = self.interactivePopGestureRecognizer.delegate;
    // 創(chuàng)建全屏滑動(dòng)手勢(shì),調(diào)用系統(tǒng)自帶滑動(dòng)手勢(shì)的target的action方法
    UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:target action:@selector(handleNavigationTransition:)];
    // 設(shè)置手勢(shì)代理,攔截手勢(shì)觸發(fā)
    pan.delegate = self;
    // 給導(dǎo)航控制器的view添加全屏滑動(dòng)手勢(shì)
    [self.view addGestureRecognizer:pan];
    // 禁止使用系統(tǒng)自帶的滑動(dòng)手勢(shì)
    self.interactivePopGestureRecognizer.enabled = NO;
}
// 什么時(shí)候調(diào)用:每次觸發(fā)手勢(shì)之前都會(huì)詢問(wèn)下代理,是否觸發(fā)。
// 作用:攔截手勢(shì)觸發(fā)
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
{
    // 注意:只有非根控制器才有滑動(dòng)返回功能,根控制器沒(méi)有。
    // 判斷導(dǎo)航控制器是否只有一個(gè)子控制器,如果只有一個(gè)子控制器,肯定是根控制器
    if (self.childViewControllers.count == 1) {
        // 表示用戶在根控制器界面,就不需要觸發(fā)滑動(dòng)手勢(shì),
        return NO;
    }
    return YES;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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