在自定义视图中处理 UITapGestureRecognizer

Posted

技术标签:

【中文标题】在自定义视图中处理 UITapGestureRecognizer【英文标题】:Handling UITapGestureRecognizer in custom view 【发布时间】:2012-02-22 21:22:28 【问题描述】:

我有一个自定义视图类。在我的视图控制器中,我在这个视图对象上添加了一个 Tap 手势识别器。现在,在点击手势的处理程序中,我正在我的视图对象上设置一个属性,我试图在我的视图类的 drawRect 中获取该属性。现在,令人惊讶的是,当我在“handleGesture”和“drawRect”中打印视图对象时,我得到了两个不同的对象。因此,我在 drawRect 中的 if 条件不会被执行。可能是什么原因?

它没有进入 UIGestureRecognizerStateBegan 状态。它总是在 UIGestureRecognizerStateEnded 里面。

// Adding Gesture in my view
 MyCustomView *customView= [[[MyCustomView alloc] init] autorelease];
UIGestureRecognizer *GestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleGesture:)];
        [customView addGestureRecognizer:GestureRecognizer];
        [GestureRecognizer release];

// Handling tap on my view
- (void)handleGesture:(UIGestureRecognizer *)GestureRecognizer; 
    MyCustomView *aView= (MyCustomView *)GestureRecognizer.view;
switch (iGestureRecognizer.state) 
    case UIGestureRecognizerStateBegan:
        NSLog(@"Began");
        [aView setNeedsDisplay];
        aView.touchDown = YES;
        break;
    case UIGestureRecognizerStateEnded:    
        NSLog(@"Ended");
        aView.touchDown = NO;
        [aView setNeedsDisplay];
        break;
    default:
        break;



// Inside my view class
- (void)drawRect:(CGRect)iRect 
    if (self.touchDown) 
// Do something here


【问题讨论】:

【参考方案1】:

没有调用 drawRect 方法。您不想直接执行此操作,但在您的 handleGesture 方法中,您可以调用 [aView setNeedsDisplay] 并且您的视图的 drawRect 将在下一个绘图周期中被调用。

【讨论】:

如果你想做一些重构,你可以让你的自定义视图创建自己的手势识别器和handleGesture的实现。这样它就可以在视图内部处理所有这些逻辑,并且您可能不需要您正在使用的 touchDown 标志。也许您甚至可以消除覆盖 drawRect 的需要: 是的...我这么认为并尝试过,但那没有帮助。这样做的原因是我在我的“handleGesture”中重绘我的表格,它创建了我的自定义视图的另一个对象,然后一切都搞砸了。 啊,更多的理由是从控制器到视图的手势识别。毫无疑问,在任何情况下,您都不应该创建自定义视图的其他实例。 有一些逻辑需要在我的视图控制器中处理,因为点击不仅驱动我的视图外观,它还控制要显示的数据。所以,我正在考虑创建一个自定义视图对象的可变字典并从那里获取它们,而不是创建新的。

以上是关于在自定义视图中处理 UITapGestureRecognizer的主要内容,如果未能解决你的问题,请参考以下文章

在自定义视图上处理来自 VoiceOver 的“点击”

如何在自定义 ListView 适配器中处理 RadioGroup 的 onCheckedChangeListener

iOS:在自定义视图中添加新约束依赖于视图的框架

如何通过在自定义视图中按下按钮从超级视图中删除自定义视图?

在自定义表格单元中更改图像视图

在自定义视图中绘制描边形状