0

これがセットアップです。

PrimeView のサブビューとしてカスタム UIScrollView があります。

カスタム UIScrollView はオーバーレイ スクロールビューと見なすことができ、最初にすべてのタッチ イベントを取得します。

ここで、スクロール ビューがドラッグされていないときに、タッチ イベントを他のレスポンダーに渡したいと思います。
以下は現在の私のコードですが、ここで self.nextResponder と super の違いについてはよくわかりません。

touchesBegan がスーパービューに正しく渡される理由がわかりませんが、touchesMoved がスーパービューに渡されません。

-(void) touchesBegan: (NSSet *) touches withEvent: (UIEvent *) event
{
    if (!self.dragging)
    {
        [self.nextResponder touchesBegan: touches withEvent:event];

    }

    [super touchesBegan: touches withEvent: event];
}

-(void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    [self.nextResponder touchesBegan: touches withEvent:event]; //                                                                                                                                                                                                    
    [super touchesMoved:touches withEvent:event];
}
4

1 に答える 1

3

Apple のスタンスは、次のようなことは決してすべきではないというものです。

    [self.nextResponder touchesBegan: touches withEvent:event];

これを行うと、UIKit 自身のレスポンダー チェーンのメッセージ転送の範囲外になり、結果は未定義になります。

また、あなたのでは、疑わしいと思われる にtouchesMoved:withEvent:送信touchesBegan:withEvent:しています。nextResponder

また、あなたのtouchesMoved:withEvent:では、イベントを 2 回渡していますが、これは悪い考えのように思えます。

ドラッグを条件付きで処理したい場合は、UIPanGestureRecognizer. レコグナイザーがイベントを受け入れない場合は、通常どおりレスポンダー チェーンに転送されます。

登録済み (有料) の iOS 開発者であれば、WWDC 2012 のビデオにアクセスできるはずです。「スクロール ビューによるユーザー エクスペリエンスの向上」ビデオをご覧になることを強くお勧めします。その内容はまだNDAの下にあるので、私はそれについてこれ以上言いません.

于 2012-06-26T05:52:51.837 に答える