复制panGestureRecognizer?

时间:2013-06-03 09:10:04

标签: iphone objective-c cocoa-touch

假设我有一个自定义视图,我想添加手势识别器。

    UIPanGestureRecognizer* y  = a.panGestureRecognizer;  
    y.minimumNumberOfTouches = 2;
    y.maximumNumberOfTouches = 2;
    [self addGestureRecognizer:y]; 

panGestureRecognizer a添加到self后,a将不再拥有panGestureRecognizer

我该怎么办,即使将UIPanGestureRecognizer添加到self后,a仍会将其自身(例如复制它)?

我按照meronix的建议尝试了这个但是得到例外。

 UIPanGestureRecognizer* y  = [a.panGestureRecognizer copy]; //I'm using ARC so I didn't add autorelease.
 [self addGestureRecognizer:y];

-[UIScrollViewPanGestureRecognizer copyWithZone:]: unrecognized selector sent to instance 0x1c5c2460

2 个答案:

答案 0 :(得分:0)

如果您只想复制具有当前状态的手势识别器,那么就像:

UIPanGestureRecognizer *r = [[UIPanGestureRecognizer alloc] initWithTarget:self
                                                                    action:action];
r.minimumNumberOfTouches = a.panGestureRecognizer.minimumNumberOfTouches;
r.maximumNumberOfTouches = a.panGestureRecognizer.maximumNumberOfTouches;
[self addGestureRecognizer:r];

但是,如果您要确保ra.panGestureRecognizer发生任何更改,您可以设置一个帮助程序类来为您处理此问题。

例如:

@interface GestureHandler: NSObject
// ...
- (void)setNewMinTouches(unsigned int)num;
// Weak references to a and r (for example)
@property (nonatomic, weak) UIPanGestureRecognizer *gestureRecognizerFromA;
@property (nonatomic, weak) UIPanGestureRecognizer *gestureRecognizerR;

@end

@implementation GestureHandler
// ...
- (void)setNewMinTouches(unsigned int)num {
    self.gestureRecognizerFromA.minimumNumberOfTouches = num;
    self.gestureRecognzierR.minimumNumberOfTouches = num;
}
// ... and so on.
@end

然后,您必须要小心,您只能通过GestureHandler课程与两个手势识别器进行互动(除非您特别希望它们不同步)。

正如katzenhut指出的那样,你也可以使用这个类来根据需要生成手势识别器。标准-initWithTarget:action:本身就非常有用。


顺便说一句,[gestureRecogniser copy]无效的原因是因为UIGestureRecognizer没有实现-copy。因此,当消息发送到手势识别器时,会调用NSObject的-copy方法,该方法用于抛出异常,因为它是子类的覆盖点。

答案 1 :(得分:0)

Apple不提供复制手势的实例。仅仅因为手势与视图和选择器方法相关联。 您总是必须使用selector方法为每个视图创建新实例,或者您可以使用相同的方法来获得更多手势。

相关问题