1

カスタム ビューがあり、それにジェスチャ レコグナイザーを追加したいとします。

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

に のを追加するとpanGestureRecognizer、はなくなります。aselfapanGestureRecognizer

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

4

2 に答える 2

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

その場合、クラスを介して 2 つのジェスチャ レコグナイザーとのみ対話するように注意する必要がありますGestureHandler(特に同期を取りたくない場合を除きます)。

katzenhut が指摘しているように、このクラスを使用して、必要に応じてジェスチャ認識機能を生成することもできます。ただし、標準-initWithTarget:action:はそれ自体で非常に便利です。


ちなみに、[gestureRecogniser copy]うまくいかない理由はUIGestureRecognizerが実装されていないから-copyです。したがって、メッセージがジェスチャ レコグナイザーに送信さ-copyれると、サブクラスのオーバーライド ポイントであるため、例外をスローするように設計された NSObject のメソッドが呼び出されます。

于 2013-07-09T12:58:24.267 に答える