6

私はこれら 2 つの投稿 ( 1907297および689684 ) に似た状況にあり、私の状況を最も簡潔に説明するために、このテキスト/グラフィック レイアウトを提示します (IB で見られるものと同様に、インデント レベルを強制するためにドットが使用されます)。

UIView (メインビュー: 320x460)
. .UIScrollView (ScrollView: 320x460)
. .UIView (OverlayView: 320x40)
. . . .UIButton (ArbitraryButton1)
. . . .UILabel (ArbitraryLabel1)
. . . .UILabel (ArbitraryLabel2)

ここでの目標は、OverlayView が統合された透明なコンテナーとして機能し、ScrollView の上に任意のボタン/ラベルを配置して表示することです。これらのボタン/ラベルは、下の ScrollView のコンテンツがユーザーのスワイプで移動する間、静止したままにする必要があります。ボタン/ラベルは、(アニメーションを使用して) 一緒に非表示/非表示/スケーリングされる場合があるため、それらをすべて単一の OverlayView にグループ化すると便利です。

問題は、OverlayView のタップが下層の ScrollView に正しく送信されているように見える一方で、スワイプ モーションは効果がないことです。をオーバーライドすることで、スワイプを検出/傍受できます

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event

OverlayView のメソッドですが、スクロールする方法で ScrollView に適切に渡す方法をまだ見つけていません。touchesMoved メソッドは、UIScrollView がスワイプを検出/解釈するために使用するものではないことは明らかですか?

私が調査した他のすべての同様の投稿は、私の場合には機能しない別の解決策を見つけたか、解決されなかっただけです。touchesShouldBegin / touchesShouldCancel の採用についての言及も見ましたが、それがどのように実装されるかはわかりません。とにかく、これに対するエレガントな解決策を考え出すことができるコミュニティからの洞察があることを願っています-サンプルコードは素晴らしいでしょう.

前もってありがとう、ジョエル。

PS - これを iOS 3.0 と互換性を持たせる必要があることにも言及する必要があるため、UIGestureRecognizers を使用しようとしていると思います。

4

4 に答える 4

1

私にとってうまくいった簡単な解決策は次のとおりです。

OverlayView (UIScrollView の上にあるビュー) で、幅と高さの両方を 0 にし (ビューが技術的にスクロールビューの上に表示されないようにするため)、 clipsToBounds = NO を設定します (OverlayView のコンテンツが引き続き表示されるようにするため)。スクロールビューの上に)。それは私にとって魅力のように機能しました。

 self.OverlayView.clipsToBounds = NO;
 CGRect frame = self.OverlayView.frame;
 self.OverlayView.frame = CGRectMake(frame.origin.x, frame.origin.y, 0, 0);

OverlayView にインタラクティブなコントロール (上記のボタンなど) が含まれている場合、それらは機能しなくなることに注意してください。UIScrollView の上の独自のビューに移動する必要があります。

于 2013-07-15T17:13:38.360 に答える
0

実行時にviewDidLoadでボタンをコンテナビューから取り出し、サブビューとしてビューに直接配置する(そしてコンテナビューを削除する)のはどうですか?その場合、スワイプをインターセプトするコンテナビューはありませんが、ビューを使用してIB内のものをグループ化することはできます。

また、代わりに、コンテナビューをスクロールビューのサブビューとして配置し、スクロールビューデリゲートでは、ユーザーがスクロールするたびにビューの位置を変更し続ける可能性があります。それはジッターになる可能性が高いように思われますが、試してみる価値があるかもしれません。

また、含まれているビューがビジュアルコンテナであり、それを表示する必要がある場合、CALayersは入力とは関係がなく、CALayersは入力とは関係がないため、代わりにCALayerの上部のスーパービューに配置されたCALayerを使用してスクロールビューをレンダリングできます。それぞれが触れます。

于 2011-03-13T05:36:41.603 に答える
0

UIScrollView をサブクラス化し、touchesShouldCancelInContentView: メソッドをオーバーライドする必要があります。

-(BOOL)touchesShouldCancelInContentView:(UIView *)view
{

    if ([view isKindOfClass:[UIButton class]]) {//or whatever class you want to be able to scroll in
        return YES;
    }

    if ([view isKindOfClass:[UIControl class]]) {
        return NO;
    }

    return YES;
}
于 2013-01-10T18:19:35.303 に答える
0

私は似たようなことをする必要があり、Appleのドキュメントを調査して読んだ後、(MobileJoel)の問題を解決するこの本当にシンプルで安全なオープンソースライブラリを作成しました. デモ プロジェクトではスクロールビューを使用しているため、直接関連しています:
https://github.com/natrosoft/NATouchThroughView

したがって、ビュー階層は次のようになります。

UIView (MainView: 320x460)    
. .UIScrollView (ScrollView: 320x460)
. .UIView (OverlayView: 320x40)  --> change this view to class NARootTouchThroughView in I.B.
. . . .UIView (transparent UIView that you change to class NATouchThroughView in I.B.)
. . . .UIButton (ArbitraryButton1)
. . . .UILabel (ArbitraryLabel1)
. . . .UILabel (ArbitraryLabel2)

したがって、基本的にオーバーレイ ビューはそのタッチをその下に転送し、UIScrollview によって受信されます。UILabels が巨大で、タッチを傍受している場合は、別の NATouchThroughView をそれらの上に配置して、最終結果が次のようになるようにします。

UIView (MainView: 320x460)    
. .UIScrollView (ScrollView: 320x460)
. .NARootTouchThroughView (OverlayView: 320x40)
. . . .NATouchThroughView (transparent)
. . . .UIButton (ArbitraryButton1)
. . . .UILabel (ArbitraryLabel1)
. . . .UILabel (ArbitraryLabel2)
. . . .NATouchThroughView (transparent and covers the labels but not the UIButton)
于 2013-10-22T12:02:50.207 に答える