【问题标题】:duplicate panGestureRecognizer?重复 panGestureRecognizer?
【发布时间】:2013-06-03 09:10:04
【问题描述】:

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

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

apanGestureRecognizer 添加到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

【问题讨论】:

  • 你为什么还要复制它?正确的方法是创建一个新的识别器。如果您想要更方便,请创建一个服务方法来为您进行设置。
  • 根据我投反对票的答案...
  • 为什么对这个问题投反对票?
  • 您是否尝试过[[UIPanGestureRecognizer alloc] initWithTarget:action:] 使用与a.panGestureRecognizer 相同的操作
  • @meronix 我没有否决这个问题。鉴于这个问题已经开放了 6 天,并且有多个问题被问到,但没有收到提问者的回应......我现在已经对这个问题投了反对票。

标签: iphone objective-c cocoa-touch


【解决方案1】:

如果您只想复制具有当前状态的手势识别器,则类似:

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 方法,该方法旨在抛出异常,因为它是子类的覆盖点。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2015-10-28
      • 1970-01-01
      • 2018-07-19
      • 1970-01-01
      • 2019-05-11
      • 2014-09-29
      • 1970-01-01
      • 2018-04-05
      • 2021-03-01
      相关资源
      最近更新 更多