問題描述
我正在我的視圖控制器(UIViewController 的自定義子類)中處理幾個 UI 組件的觸摸.它有方法 touchesBegan:withEvent:
、touchesMoved:withEvent:
和 touchesEnded:withEvent:
.它工作正常.然后我添加了一個滾動視圖(UIScrollView)作為層次結(jié)構(gòu)中的頂視圖.
I am handling touches for a couple of my UI components in my view controller (custom subclass of UIViewController). It has methods touchesBegan:withEvent:
, touchesMoved:withEvent:
, and touchesEnded:withEvent:
. It was working fine. Then I added a scroll view (UIScrollView) as the top view in the hierarchy.
現(xiàn)在我在視圖控制器上的觸摸處理程序不起作用.他們不會被召喚.有趣的是,我在滾動視圖中有各種其他的 UI 組件可以工作.有些是按鈕,有些是自定義視圖,它們定義了自己的 touchesBegan:withEvent:
等.唯一不起作用的是視圖控制器上的觸摸處理程序.
Now my touch handlers on the view controller don't work. They don't get called. The interesting thing is, I have various other UI components within the scroll view that do work. Some are buttons, some are custom views that define their own touchesBegan:withEvent:
, etc. The only thing that doesn't work is the touch handlers on the view controller.
我想這可能是因為滾動視圖出于自己的目的攔截了這些觸摸,但我將 UIScrollView 子類化,只是為了看看我是否可以讓它工作,我總是從 返回
和 YES
>touchesShouldBegin:withEvent:inContentView:NO
始終來自 touchesShouldCancelInContentView:
.還是不行.
I thought maybe it's because the scroll view is intercepting those touches for its own purposes, but I subclassed UIScrollView and just to see if I could get it to work I am returning YES
always from touchesShouldBegin:withEvent:inContentView:
and NO
always from touchesShouldCancelInContentView:
. Still doesn't work.
如果它有所不同,我的視圖控制器位于標(biāo)簽欄控制器中,但我認(rèn)為它不相關(guān).
If it makes a difference my view controller is within a tab bar controller, but I don't think it's relevant.
有沒有人遇到過這個問題并有現(xiàn)成的解決方案?我的猜測是滾動視圖猴子在響應(yīng)者鏈上.我可以猴子回來嗎?我想如果我想不出其他任何東西,我會將滾動視圖下的頂級視圖設(shè)為自定義視圖并將消息轉(zhuǎn)發(fā)到視圖控制器,但看起來很笨拙.
Has anyone had this problem and have a ready solution? My guess is the scroll view monkeys up the responder chain. Can I monkey it back? I guess if I can't figure anything else out I'll make the top level view under my scroll view be a custom view and forward the messages on to the view controller, but seems kludgy.
推薦答案
創(chuàng)建 UIScrollView 類的子類并覆蓋 touchesBegan: 和其他觸摸方法如下:
create a subclass of UIScrollView class and override the touchesBegan: and other touch methods as follows:
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
// If not dragging, send event to next responder
if (!self.dragging){
[self.nextResponder touchesBegan: touches withEvent:event];
}
else{
[super touchesBegan: touches withEvent: event];
}
}
-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{
// If not dragging, send event to next responder
if (!self.dragging){
[self.nextResponder touchesMoved: touches withEvent:event];
}
else{
[super touchesMoved: touches withEvent: event];
}
}
-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{
// If not dragging, send event to next responder
if (!self.dragging){
[self.nextResponder touchesEnded: touches withEvent:event];
}
else{
[super touchesEnded: touches withEvent: event];
}
}
這篇關(guān)于UIScrollView 防止視圖控制器上的 touchesBegan、touchesMoved、touchesEnded的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網(wǎng)!