假设我有一个自定义视图,我想添加手势识别器。
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
答案 0 :(得分:0)
如果您只想复制具有当前状态的手势识别器,那么就像:
UIPanGestureRecognizer *r = [[UIPanGestureRecognizer alloc] initWithTarget:self
action:action];
r.minimumNumberOfTouches = a.panGestureRecognizer.minimumNumberOfTouches;
r.maximumNumberOfTouches = a.panGestureRecognizer.maximumNumberOfTouches;
[self addGestureRecognizer:r];
但是,如果您要确保r
和a.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方法为每个视图创建新实例,或者您可以使用相同的方法来获得更多手势。