UIPageViewController (UIPageViewControllerTransitionStylePageCurl類型) 手勢(shì)沖突及解決

事情起因是新項(xiàng)目,產(chǎn)品要做雜志翻頁(yè)風(fēng)格,也不不顯示導(dǎo)航、標(biāo)簽欄、返回鍵,返回由下滑手勢(shì)出發(fā),上滑會(huì)從底部顯示足跡,也就是說(shuō)一個(gè)頁(yè)面有上下左右四個(gè)方向的手勢(shì),本來(lái)想想覺(jué)得沒(méi)什么問(wèn)題,真寫(xiě)出來(lái)問(wèn)題百出

翻頁(yè)風(fēng)格自然而然想到UIPageViewController,設(shè)置style為UIPageViewControllerTransitionStylePageCurl(翻頁(yè)style是不帶scrollView的,自然也沒(méi)有相應(yīng)的代理之類的)

本來(lái)以為UIPageViewController的翻頁(yè)只是簡(jiǎn)單的左右滑動(dòng),于是我加上項(xiàng)目需要的下滑和上滑手勢(shì)。結(jié)果我錯(cuò)了,除了第一頁(yè)有效,其他頁(yè)都無(wú)效。目前我所了解UIPageViewController至少有兩種手勢(shì):點(diǎn)擊tap(點(diǎn)擊邊緣換頁(yè))和拖動(dòng)pan,并且pan的范圍很廣,完全擋住了滑動(dòng)手勢(shì)。

那么了解到這些,怎樣讓新手勢(shì)和UIPageViewController自帶手勢(shì)同時(shí)相應(yīng)呢?

查了很多,包括網(wǎng)上也發(fā)現(xiàn)有人UIPageViewController和UITableview手勢(shì)沖突的。最后發(fā)現(xiàn)有一種方法有效:


// 同時(shí)響應(yīng)拖動(dòng)和滑動(dòng)手勢(shì)

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {

? ? ? return YES;

}


這是UIGestureRecognizer手勢(shì)的一個(gè)代理方法,那么問(wèn)題來(lái)了,既然是代理方法,肯定要遵從代理才有作用,因此我給我添加的兩個(gè)新手勢(shì)加了代理,為當(dāng)前的視圖控制器,無(wú)效。想了一下是因?yàn)镻ageController的拖動(dòng)手勢(shì)并沒(méi)有設(shè)置代理為當(dāng)前視圖控制器,因此用下面方法取到相關(guān)手勢(shì),并設(shè)置代理:


for (UIGestureRecognizer *gr in _pageViewController.gestureRecognizers) {

? ? ? ? ?if ([gr isKindOfClass:[UIPanGestureRecognizer class]]) {

? ? ? ? ? ? ? ?gr.delegate = self;

? ? ? ? ?}

}


親測(cè)有效!當(dāng)我開(kāi)心的多翻了兩頁(yè),crash!重新試了幾次,發(fā)現(xiàn)是在PageController的第一頁(yè)往前滑和最后一頁(yè)往后滑會(huì)崩,本來(lái)以為是沒(méi)有對(duì)第一頁(yè)和最后一頁(yè)就行判斷設(shè)置,但是檢查了一下發(fā)現(xiàn)沒(méi)錯(cuò)。。。糾結(jié)一下午~~~~~

后來(lái)突然想到,UIPageViewController的手勢(shì)代理當(dāng)然是它自己,我把它的手勢(shì)代理改了,那肯定會(huì)在某些時(shí)候出問(wèn)題嘛,想通了以后,于是進(jìn)行調(diào)整,給UIPageViewController加了一個(gè)分類,添加了兩個(gè)方法:(第二個(gè)方法是為了去掉pageviewcontroller點(diǎn)擊邊緣換頁(yè)的手勢(shì),防止相關(guān)邊緣按鈕沖突)


#import "UIPageViewController+FSGestureDeal.h"

@implementation UIPageViewController (FSGestureDeal)

// pageViewontroller同時(shí)響應(yīng)拖動(dòng)和滑動(dòng)手勢(shì)

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {

? ? ? ? return YES;

}

//解決邊緣自動(dòng)翻頁(yè)跟控件沖突的問(wèn)題

-(BOOL) gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch

{

? ? ?if ([gestureRecognizer isKindOfClass:[UITapGestureRecognizer class]]) {

return NO;

}

return YES;

}

@end


到此,就完美解決了~


更新:最近項(xiàng)目中又遇到UIPageViewController和UITableview手勢(shì)沖突(翻頁(yè)動(dòng)畫(huà)方式中,垂直方向上的沖突,如果是UITableview左滑刪除手勢(shì)沖突,這種方法是解決不了的),解決方式類似,把下面方法替換上面的就可以了:


- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {

if ([gestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]] &&

[otherGestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]]) {

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)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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