1

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

它没有进入状态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 
} 
} 

回答

2

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

+0

如果你想做一些重构,你可以让你的自定义视图创建自己的手势识别器和handleGesture的实现。这样它可以在视图内部处理所有这些逻辑,并且您可能不需要使用touchDown标志。也许你甚至可以消除重写drawRect的需要: – picciano 2012-02-22 21:32:50

+0

是的......我认为是这样并尝试过,但那并没有帮助。原因是我在我的“handleGesture”中重绘了我的表格,它创建了我自定义视图的另一个对象,然后它全部混乱起来。 – Abhinav 2012-02-22 21:34:10

+0

啊,更多的原因是从控制器到视图更多的手势识别。无论如何,毫无疑问,您不应该创建自定义视图的其他实例。 – picciano 2012-02-22 21:36:47

相关问题