2

検索した質問がありますが、決定的な答えが見つかりません。これが私のレイアウトです:

UIView - ViewController   
   |_UIScrollView - added programatically
      | |_UIView to hold a backgound/perimeter  - added programmatically
      |_UIView 1 - added programmatically
      |_UIView 2 - added programmatically
       and so on

私の質問は、UIView 2 on touch と言うと、ViewController が "touchesMoved" を 1 回だけ呼び出すのはなぜですか?

現在、UIView には独自の touchesMoved メソッドがありますが、ScrollView と通信してその位置を更新する必要があるため、コントローラーの touchesMoved を呼び出す必要があります。その UIView 2 が角に近い場合など、ScrollView が少し移動して UIView 2 が完全に表示されるようにします。

これを回避する方法がない場合、ScrollView を UIView 2 から更新して、隅に近づいたときにスクロールする方法はありますか?

編集:

回避策を見つけたかもしれないと思います。これが Apple に受け入れられるかどうかはわかりませんが、

= であるインスタンス変数を self.superview に呼び出しました。これにより、UIView の touchesMoved 内で ScrollView に戻ることができます。

メソッド [ScrollView setContentOffset:(CGPoint)contentOffset animation:(BOOL)animated] を呼び出すことができるので、サブビュー (UIView2) が UIWindow の端に近づくと ScrollView が更新されます。

提案していただきありがとうございます。

4

1 に答える 1

3

UIScrollViewあなたが説明する動作は、タッチ移動イベントをハイジャックした結果です。つまり、タッチ移動イベントがそのフレーム内にあることが検出されるとすぐにUIScrollView、それを制御します。UIScrollView特別なスワイプハンドラーを作成しようとしているときに同じ動作を経験しましたが、スワイプにも興味があるたびに失敗しました。

私の場合、sendEvent:カスタムでオーバーライドされたイベントをインターセプトすることで問題を解決しUIWindowましたが、同じことをしたいかどうかはわかりません。いずれにせよ、これは私のために働いたものです:

- (void)sendEvent:(UIEvent*)event {
NSSet* allTouches = [event allTouches];
UITouch* touch = [allTouches anyObject];
UIView* touchView = [touch view];

//-- UIScrollViews will make touchView be nil after a few UITouchPhaseMoved events;
//-- by storing the initialView getting the touch, we can overcome this problem
if (!touchView && _initialView && touch.phase != UITouchPhaseBegan)
    touchView = _initialView;

    //-- do your own management of the event

    //-- let the event propagate if you want also the default event management
[super sendEvent:event];

}

調査する可能性のある別のアプローチは、ジェスチャ認識機能をビューにアタッチすることです。これらの優先度は非常に高いため、UIScrollView がそれらを台無しにすることはなく、より適切に機能する可能性があります。

これを回避する方法がない場合、ScrollView を UIView 2 から更新して、隅に近づいたときにスクロールする方法はありますか?

UIScrollView次のように呼び出してスクロールを作成しようとしましたか:

- (void)setContentOffset:(CGPoint)contentOffset animated:(BOOL)animated
于 2012-09-14T16:04:20.480 に答える