2012-01-16 4 views
5

私は幅と高さが256x256のスクロールビューを持っています。私は両方向(左と右)に伸びるそのスクロールビューのサブビューを持っています。 clipToBoundsをNOに設定すると、スクロールビューの項目が表示されます。iOS UIScrollView clipToBounds = NOサブビューが検出されない

ユーザーがスクロールビューホルダー(256x256を超える領域)に触れると、ヒットテストを確認してscrollViewを返します。

私の問題は、私のスクロールビューのボタンはボタンであり、ボタンが256x256の中になければ、タッチイベントを受信して​​いません。スクロールビューのボタンをどのように循環させ、イベントをボタンに転送するのですか?

私はこのPaging UIScrollView with peeking neighbor pages

のようにやっているしかし、私のscrollviewのサブビューは、イベントを受信して​​いません。

私はイベントをワイヤで送信し、私のボタンはイベントを受信しないはずです。イベントチェーンは、私のアイテムをスクロールできるようにする私のUIScrollビューでは常に停止しますが、イベントをスクロールビューのボタンにどのように転送しますか?

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event { 
    if ([self pointInside:point withEvent:event]) { 
     return self.scrollView; 
    } 
    return nil; 
} 

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event { 
    if ([self pointInside:point withEvent:event]) { 
     return self.scrollView; 
    } 
    return nil; 
} 

- (UIView *) hitTest:(CGPoint) point withEvent:(UIEvent *)event { 
    UIView* child = nil; 

    if ((child = [super hitTest:point withEvent:event]) == self) { 
     return self.scrollView; 
    } 
    return child; 
} 

答えて

-1

あなたのスクロールビューは大きくする必要があります。 メインスクロールビューのフレーム外のすべてのイベントは検出されません。 ユーザーに特定の背景ゾーンを表示する必要がある場合は、スクロールビューの背景を透明にし、別のビューを背面に配置します。

+0

ページングが適切に機能するため、スクロールビューのサイズを変更しました。スクロールビュー幅を全幅に拡大すると、1つのアイコンの代わりに全幅がページされます。プログラムでページングの場所を設定する方法はありますか? – spentak

0

UIScrollViewのhitTestをオーバーライドしましたか?

- (UIView*)hitTest:(CGPoint)pt withEvent:(UIEvent*)event 
{ 
    UIView *contentView = [self.subviews count] ? [self.subviews objectAtIndex:0] : nil; 
    return [contentView hitTest:pt withEvent:event]; 
} 
+0

私はこの正確なコードを私のscrollviewカスタムクラスに持っていますが、ボタンはイベントを受け取ることはありません。 – spentak

6

これは答えとより良い解決策でした。任意のビューにイベントを転送する代わりに、UIScrollViewでこれを行い、すべてのボタンとスワイプが正常に動作します。

- (UIView)hitTest:(CGPoint)point withEvent:(UIEvent)event { 
    UIView *view = [super hitTest:point withEvent:event]; 
    for (UIView *subview in self.subviews) { 
     if (view != nil && view.userInteractionEnabled) { 
      break; 
     } 
     CGPoint newPoint = [self convertPoint:point toView:subview]; 
     view = [subview hitTest:newPoint withEvent:event]; 
    } 
    return view; 
} 
+0

私は同じことをやろうとしていましたが、これは私にとっては完璧でした。ありがとう。 – ultrafez

0

マット・ギャロウェイのチュートリアルHow To Use UIScrollView to Scroll and Zoom Contentセクションは、スクロールビュー外タッチの検出を参照してください -

あなたが画面よりも小さく、未確認クリップサブビューとスクロールビューます

Xcode screenshot

そしてコンテナビューにラップすると、スクロールビューにイベントが転送されます。

- (UIView*)hitTest:(CGPoint)point withEvent:(UIEvent*)event { 
    UIView *view = [super hitTest:point withEvent:event]; 
    if (view == self) { 
     return _scrollView; 
    } 
    return view; 
} 
関連する問題