1

SDKをいじるだけで、UITouchイベントがUIScrollView内で機能するかどうか疑問に思いました。

大きなUIViewを処理するUIScrollViewをセットアップしました。UIView内にはUIImageViewがあり、UITouchでUIImageViewをUIScrollViewの外にドラッグできましたが、内部ではイベントが登録されていません。

私が達成しようとしていたのは、UIImageViewがドラッグを開始したときのUIViewのPOSを超えてUIScrollViewが画像に沿って移動するときに、UIImageViewを大きなUIViewの周りにドラッグすることだったと思いますが、それが理にかなっている場合はどうでしょうか。

どうもありがとう

4

3 に答える 3

4

(質問を正しく理解した場合)

UIScrollViewはtouchMovedイベントをインターセプトし、スクロールが有効になっている場合はイベントをそのコンテンツに伝播しません。そのため、アプリのUIScrollViewコンテンツをドラッグするために、次のトリックを実行しました。

touchesBegan: 「ドラッグ可能な」領域に触れているかどうかを確認します。はいの場合-UIScrollViewでのスクロールを無効にします。

touchesMoved: スクロールが無効になっているため、コンテンツビューはこのイベントを受け取り、それに応じてドラッグ可能なUIImageViewを移動できます。

touchesEnded: UIScrolliewでスクロールを再度有効にします。

表示されているUIScrollView領域の外側にビューをドラッグする場合は、境界に近いかどうかを手動で確認し、コンテンツのオフセットを手動で調整する必要があります(私はこれを自分で試していませんが、機能するはずです)。

于 2010-03-14T21:32:06.383 に答える
0

私が見つけたこれを実装する最良の方法は、uiscrollviewクラス自体をサブクラス化してから、サブクラスにtouchesbeginedイベントメソッドを追加することでした。これは私のために働いた。

于 2012-04-05T16:21:22.960 に答える
0
(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{

NSLog(@"DEBUG: Touches began" );

UITouch *touch = [[event allTouches] anyObject];

[super touchesBegan:touches withEvent:event];
}

(void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event {

NSLog(@"DEBUG: Touches cancelled");

// Will be called if something happens - like the phone rings

UITouch *touch = [[event allTouches] anyObject];

[super touchesCancelled:touches withEvent:event];

}


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

NSLog(@"DEBUG: Touches moved" );

UITouch *touch = [[event allTouches] anyObject];

[super touchesMoved:touches withEvent:event];

}

(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
NSLog(@"DEBUG: Touches ending" );
//Get all the touches.
NSSet *allTouches = [event allTouches];

//Number of touches on the screen
switch ([allTouches count])
{
    case 1:
    {
        //Get the first touch.
        UITouch *touch = [[allTouches allObjects] objectAtIndex:0];

        switch([touch tapCount])
        {
            case 1://Single tap

                break;
            case 2://Double tap.

                break;
        }
    }
        break;
}
[super touchesEnded:touches withEvent:event];
}
于 2012-05-15T10:29:31.947 に答える