Objective c 使用触摸事件的iOS自定义视图
我正在实现一个自定义视图来处理图像的编辑(非常特殊的目的),并且我一直在处理触摸事件 根据我覆盖Objective c 使用触摸事件的iOS自定义视图,objective-c,iphone,uiview,uigesturerecognizer,uipageviewcontroller,Objective C,Iphone,Uiview,Uigesturerecognizer,Uipageviewcontroller,我正在实现一个自定义视图来处理图像的编辑(非常特殊的目的),并且我一直在处理触摸事件 根据我覆盖触摸开始、触摸移动、触摸结束和触摸取消并实现它们后的逻辑,因此如果触摸击中目标(视图的一部分),我正在处理事件,而\u不调用[超级触摸XXX]事件不应传递给其父级ui响应者 但是,我的视图位于UIPageViewController上,触摸事件运行良好,但出于某种原因,UIPageViewController也会始终接收事件,并通过滑动手势接管,这使我无法执行需要移动触摸的操作,因为每次触摸都会水平移
触摸开始
、触摸移动
、触摸结束
和触摸取消
并实现它们后的逻辑,因此如果触摸击中目标(视图的一部分),我正在处理事件,而\u不调用[超级触摸XXX]
事件不应传递给其父级ui响应者
但是,我的视图位于UIPageViewController
上,触摸事件运行良好,但出于某种原因,UIPageViewController
也会始终接收事件,并通过滑动手势接管,这使我无法执行需要移动触摸的操作,因为每次触摸都会水平移动UIPageViewController
将其识别为滑动
所以基本上我的代码如下:
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
if([self withinBounds:touches]) {
//do own stuff
} else {
[super touchesBegan:touches withEvent:event];
}
}
我已经完成了调试打印,在我做水平移动之前,一切都很完美,它从不调用super的touchesBegind或touchesMoved或其他任何东西,但手势被激活了
我还尝试通过设置自定义UIgestureRecognitizer
delegate来覆盖该手势,该委托在shouldReceiveTouch方法上始终返回NO,但滑动手势仍在继续
另外,如果有必要的话,我的目标平台是iOS 8.1,我正在模拟器上运行该应用程序没有简单的方法通过scrollview或继承自它的类来实现这一点。这两个手势完全相同,scrollview的第一个镜头显然在视图层次结构中更高 要么不要使用pageviewcontroller,要么创建更复杂的触摸逻辑
例如,您可以检查是否长按要编辑的图像。如果长按,则禁用scrollview的用户交互,处理图像的移动,然后启用交互。您可以在要跟踪的任何触摸事件期间禁用UIPageViewController手势识别器 自定义视图将保留对UIPageViewController手势识别器的引用。然后,它只需禁用
-touchsbegind:
中的手势,然后重新启用-touchscancelled:
和-touchsended:
中的手势
例如:
然后,您可以将UIPageViewController.GestureRecognitors
分配给视图的覆盖手势
属性
或者,如果要将UIPageViewController的手势限制在屏幕的特定区域,请在屏幕的所需区域放置一个空UIView,并将UIPageViewController的手势附加到该视图。逻辑非常简单,但问题是,如何禁用滚动视图的用户交互?我的意思是,如果我在scroll视图的委托的shouldReceiveTouch上返回NO,它仍然接收事件并执行它的操作。UIScrollView继承了UIView。所以,是的,您可以将他设置为在运行时使其无响应。那么
辞职FirstResponder
或类似的东西呢?iOS应用程序分别积极使用责任链模式处理事件和触摸事件。
@interface MyView : UIView
@property (nonatomic, copy) NSArray* overriddenGestures;
@end
@implementation MyView
- (void)setGesturesEnabled:(BOOL)enabled
{
for (UIGestureRecognizer* gr in _overriddenGestures)
{
gr.enabled = enabled;
}
}
- (void)touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event
{
NSLog(@"BEGIN: %@", event);
[self setGesturesEnabled:NO];
}
- (void)touchesCancelled:(NSSet*)touches withEvent:(UIEvent*)event
{
NSLog(@"CANCEL: %@", event);
[self setGesturesEnabled:YES];
}
- (void)touchesEnded:(NSSet*)touches withEvent:(UIEvent*)event
{
NSLog(@"END: %@", event);
[self setGesturesEnabled:YES];
}
- (void)touchesMoved:(NSSet*)touches withEvent:(UIEvent*)event
{
NSLog(@"MOVE: %@", event);
}
@end