//禁用系統(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];
}