2013-06-03 17 views
0

比方說,我有一個自定義視圖,我想添加手勢識別器。重複panGestureRecognizer?

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

加入apanGestureRecognizerself後,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

+3

你甚至爲什麼要複製它?正確的方法是創建一個新的識別器。如果你想更方便,創建一個服務方法,將爲你做的設置。 – katzenhut

+0

按照我的低調答案... – Fogmeister

+0

爲什麼贊成這個問題? – meronix

回答

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方法,該方法旨在引發異常,因爲它是子類的替代點。

0

Apple不提供重複手勢實例。僅僅因爲該手勢與視圖和選擇器方法相關聯。 你總是必須用選擇器方法爲每個視圖創建新的實例,或者你可以使用相同的方法來獲得更多的手勢。