iOS如何添加中劃手勢而不出現(xiàn)假死

方法一:

1.在ViewDidLoad方法中添加中劃手勢

// 獲取屏幕邊緣手勢識別器
 UIScreenEdgePanGestureRecognizer *gesture = (UIScreenEdgePanGestureRecognizer *)self.interactivePopGestureRecognizer;

// 先禁止系統(tǒng)的左側(cè)滑手勢
gesture.enabled  = NO;

// 利用KVC強制獲取手勢數(shù)組
// 利用運行時查看私有屬性
NSMutableArray *targets = [gesture valueForKeyPath:@"_targets"];

// 獲取這個這個手勢對象
id gestureTarget = [targets firstObject];

// 利用KVC獲取手勢的私有屬性target
id target = [gestureTarget valueForKeyPath:@"_target"];

// 創(chuàng)建滑動手勢
UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:target action:@selector(handleNavigationTransition:)];

// 設(shè)置自定義的手勢代理為控制器,這樣自定義的手勢就會調(diào)用代理的這個方法`gestureRecognizerShouldBegin:`
pan.delegate = self;

// 添加自定義手勢到手勢識別器的View中
[gesture.view addGestureRecognizer:pan];

添加上面的方法后,就可以實現(xiàn)中間和側(cè)滑都可以返回的功能,但是回到導(dǎo)航控制器的跟界面,任然可以中劃和側(cè)滑,并且跳轉(zhuǎn)出現(xiàn)假死狀態(tài);解決方案很簡單,只要是導(dǎo)航控制器的跟控制器,我們過濾掉這個側(cè)滑和中劃功能;

2.遵守代理協(xié)議,實現(xiàn)代理的方法

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {

    // 這里有兩個條件不允許手勢執(zhí)行:1、當(dāng)前控制器為根控制器;2、如果這個push、pop動畫正在執(zhí)行(私有屬性)
    return self.viewControllers.count != 1 && ![[self valueForKey:@"_isTransitioning"] boolValue];
}

方法二:

1.設(shè)置導(dǎo)航控制器的代理為自己,遵守導(dǎo)航控制器代理協(xié)議

@interface DXNavigationController ()<UINavigationControllerDelegate>
self.delegate = self;

2.調(diào)用導(dǎo)航控制器的代理方法

// 導(dǎo)航控制器加載完畢一個View的時候就會調(diào)用這個方法
- (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
    if (viewController == self.childViewControllers[0])
    {
        [self addGesture:nil];
    }else{
        [self addGesture:@selector(handleNavigationTransition:)];
    }
}

2.1添加自定義手勢

- (void)addGesture:(SEL)action
{
    UIScreenEdgePanGestureRecognizer *gesture = (UIScreenEdgePanGestureRecognizer *)self.interactivePopGestureRecognizer;
    gesture.enabled  = NO;
    NSMutableArray *targets = [gesture valueForKeyPath:@"_targets"];
    id gestureTarget = [targets firstObject];
    id target = [gestureTarget valueForKeyPath:@"_target"];
    UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:target action:action];
    [gesture.view addGestureRecognizer:pan];
}

效果圖:


demo.gif
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

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