2011-09-16 15 views
26

View Controller(UIViewControllerのカスタムサブクラス)でUIコンポーネントのいくつかを操作しています。方法はtouchesBegan:withEvent:,touchesMoved:withEvent:、およびtouchesEnded:withEvent:です。それは正常に動作していた。次に、階層のトップビューとしてスクロールビュー(UIScrollView)を追加しました。UIScrollViewはtouchesBeganを防ぎます、touchesMoved、View ControllerでtouchesEndedを返します

今、ビューコントローラのマイタッチハンドラが機能しません。彼らは呼ばれない。興味深いのは、スクロールビュー内で動作する他のさまざまなUIコンポーネントがあることです。いくつかはボタンであり、いくつかは独自のtouchesBegan:withEvent:などを定義するカスタムビューです。機能しないのはビューコントローラ上のタッチハンドラだけです。

私は、スクロールビューは、独自の目的のためにタッチを傍受されているので、多分それはだと思ったが、私はUIScrollViewのをサブクラス化し、私はそれが私がtouchesShouldCancelInContentView:から常にtouchesShouldBegin:withEvent:inContentView:NOから常にYESを返しています仕事を得ることができればちょうど見るために。まだ動作しません。

もし私のビューコントローラがタブバーコントローラ内にありますが、それは関係がないと思います。

誰もこの問題を抱えており、解決策がありますか?私の推測はレスポンダーチェーンの上のスクロールビューのサルです。それを元に戻すことはできますか?私は他の何かを描くことができないと思う私は私のスクロールビューの下でトップレベルのビューをカスタムビューにし、ビューコントローラにメッセージを転送するが、クルージュのようだ。

+0

がここhttp://stackoverflow.com/questions/1685956/uiscrollview-touchesbegan/17759373#私の答えをフォロー17759373 – Rajneesh071

答えて

0

"うまくいきました。次に、階層のトップビューとしてスクロールビュー(UIScrollView)を追加しました。"

はアイテムを含むコンテンツビューの上にスクロール表示されますか?

すべてのコンポーネントがまあscrollview

+0

上部が階層的に上になります。他のすべてのビューと同様に、スクロールビューのサブビューです。よく具体的には、スクロールビューのサブビューであるビューが1つあり、それ以外のサブビューはすべてサブビューやサブビューのサブビューなどです。 – morningstar

2

の背後にあるビューscrollviewにしていないする必要があり、これは働いたが、nextResponderはUIViewのの一つではないので、私は、私は「それで逃げる」ことができわからないんだけどあなたがサブクラスでオーバーライドするのを "奨励"しているメソッド。

@interface ResponderRedirectingView : UIView { 

    IBOutlet UIResponder *newNextResponder; 

} 

@property (nonatomic, assign) IBOutlet UIResponder *newNextResponder; 

@end 


@implementation ResponderRedirectingView 

@synthesize newNextResponder; 

- (id)initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) { 
     // Initialization code 
    } 
    return self; 
} 

- (UIResponder *)nextResponder { 
    return self.newNextResponder; 
} 

- (void)dealloc 
{ 
    [super dealloc]; 
} 

@end 

はその後Interface Builderで私は、スクロールビューこれらの1の直接サブビューを作り、scrollviewをスキップして、ビューコントローラに直接指すようにそのnewNextResponderをフックアップ。

これは、これらのオーバーライドでnextResponderのオーバーライドを交換し、あまりにも動作します:それはUIViewのサブクラスであり、これらのメソッドをオーバーライドするため

- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    [self.newNextResponder touchesBegan:touches withEvent:event]; 
} 

- (void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { 
    [self.newNextResponder touchesMoved:touches withEvent:event]; 
} 

- (void) touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { 
    [self.newNextResponder touchesEnded:touches withEvent:event]; 
} 

- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event { 
    [self.newNextResponder touchesCancelled:touches withEvent:event]; 
} 
-1

touchesBegan:などの方法がNEVERUIScrollViewで呼び出されません。利用可能な異なるUIScrollViewメソッドを確認してくださいhere。回避策は、実装したいものによって異なります。次のように他のタッチ方法:

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ 

// If not dragging, send event to next responder 
    if (!self.dragging){ 
    [self.nextResponder touchesBegan: touches withEvent:event]; 
    } 
    else{ 
    [super touchesBegan: touches withEvent: event]; 
    } 
} 
-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{ 

// If not dragging, send event to next responder 
    if (!self.dragging){ 
    [self.nextResponder touchesMoved: touches withEvent:event]; 
    } 
    else{ 
    [super touchesMoved: touches withEvent: event]; 
    } 
} 
-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{ 

    // If not dragging, send event to next responder 
    if (!self.dragging){ 
    [self.nextResponder touchesEnded: touches withEvent:event]; 
    } 
    else{ 
    [super touchesEnded: touches withEvent: event]; 
    } 
} 
+0

スクロールビューでは呼び出されていないtouchesBeganメソッドではありません。それらは私のView Controller上にあります。一方、スクロールビューの「中」のビューに対するtouchesBeganが呼び出されています。それは全く反対の問題です。彼らはスクロールビューの "アウト"になることはできません。 – morningstar

+0

私はまだあなたの質問を完全にはしませんでしたが、touchesBeganメソッドはscrollView内のビューで動作することを指摘したいと思います! – tipycalFlow

+0

私はUIScrollViewとUIScrollViewDelegateのドキュメントを見て、利用可能なものを試しました。私がしようとしていることは、タップジェスチャーと同じくらい単純なものから、画面の領域を強調するタッチの複雑な解釈までさまざまです。私はジェスチャー認識プログラムに切り替えることができ、それはおそらく問題を解決するだろうが、私はコードを書き直したくない。b)ジェスチャー認識機能を持たない3.0で動作させたい。 – morningstar

22

はUIScrollViewのクラスのサブクラスを作成し、touchesBeganをオーバーライドします。しかし、タッチを少量以上動かすと、パンジェスチャーとして解釈されます。

それは二本の指が必要ですので、私はパンジェスチャー認識器の動作を変更することにより、これを克服:

-(void)awakeFromNib 
{ 
    NSArray     *gestureRecognizers = self.gestureRecognizers; 
    UIGestureRecognizer  *gestureRecognizer; 

    for (gestureRecognizer in gestureRecognizers) { 
     if ([gestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]]) { 
      UIPanGestureRecognizer  *pgRecognizer = (UIPanGestureRecognizer*)gestureRecognizer; 
      pgRecognizer.minimumNumberOfTouches = 2; 
     } 
    } 

} 
+2

サブクラス化するのではなく、カテゴリでこれを行うのは安全です。 –

+0

ありがとうございます、これまでのところ私のカテゴリ(あなたのコードから)は私のアプリで完璧に動作しています! –

0

user1085093の答えは私のために働いた

関連する問題