項(xiàng)目中用到系統(tǒng)右滑返回時(shí)解決取消滑動(dòng)的方法

   //禁用系統(tǒng)手勢(shì),因?yàn)楦鷖plitView手勢(shì)有沖突
      self.interactivePopGestureRecognizer?.isEnabled = false
//        let target = self.interactivePopGestureRecognizer?.delegate
//        let pan:UIPanGestureRecognizer = UIPanGestureRecognizer(target: target!, action: Selector(("handleNavigationTransition:")))

      pan = UIPanGestureRecognizer(target: self, action: #selector(handleNavigationTransition(_ :)))
      self.view.addGestureRecognizer(pan)
      pan.delegate = self

本來想交換一下系統(tǒng)的handleNavigationTransition,增加狀態(tài)判斷,發(fā)現(xiàn)不好做,原因是handleNavigationTransition并不是類的成員方法,獲取不到啊,它是target的方法不好獲取,放棄了。
其次有想用 NSInvoke 方法調(diào)用handleNavigationTransition 發(fā)現(xiàn)swift不好用,就用了oc
就是target用自己的方法,在自己的手勢(shì)方法里調(diào)用系統(tǒng)的handleNavigationTransition,這樣又能使用系統(tǒng)的右滑,又能獲取手勢(shì)的狀態(tài)了。
現(xiàn)在可以獲得它的狀態(tài)了,發(fā)現(xiàn)并不是想象的那樣,沒有理解cancle狀態(tài):取消手勢(shì)后才觸發(fā)。。。。悲劇了
看來還是要判斷手勢(shì)的位移了

//MARK: 處理右滑返回取消/失敗的問題
    @objc func handleNavigationTransition(_ sender: UIPanGestureRecognizer) {

        let target = self.interactivePopGestureRecognizer?.delegate
        let selector = Selector(("handleNavigationTransition:"))
        DealHandle.invoke(target, selector: selector, arguments: [sender])
        print("swizzle state: ---- \(sender.state.rawValue)")

        //處理右滑返回到首頁時(shí)取消了滑動(dòng),側(cè)邊欄仍然顯示的錯(cuò)誤
        if sender.state == UIGestureRecognizerState.ended && self.viewControllers.count == 1{
            let position = sender.location(in: sender.view)
            if position.x > 0 && position.x < UIScreen.width/2   {
                self.splitViewController?.preferredDisplayMode = UISplitViewControllerDisplayMode.primaryHidden
            }
        }
    }

最后貼一下DealHandle.invoke的方法,也就是最簡單的調(diào)用

//此方法用來調(diào)用系統(tǒng)的方法
+ (void) invoke:(id)target selector:(SEL)selector arguments:(NSArray *)arguments {

    //生成selector的函數(shù)簽名
    //若有另一個(gè)selector1與這個(gè)selector返回值、參數(shù)列表相同,也可以用selector1的函數(shù)簽名
    NSMethodSignature *signature = [[target class] instanceMethodSignatureForSelector:selector];
    //根據(jù)函數(shù)簽名生成一個(gè)NSInvocation對(duì)象,NSInvocation對(duì)象的生成僅能通過其類方法實(shí)現(xiàn)
    NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];

    //設(shè)置target、selector,并且target、selector分別占據(jù)其參數(shù)列表第0個(gè)和第1個(gè)的位置
    [invocation setTarget:target];
    [invocation setSelector:selector];

    id num = arguments[0];

    [invocation setArgument:&num atIndex:2];
    //轉(zhuǎn)發(fā)此消息
    [invocation invoke];
}
最后編輯于
?著作權(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),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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