3

いくつかの小さなUIViewサブクラスを含むUIScrollViewがあります。UIScrollViewはスクロール対応であり、各UIViewをUIScrollView内に自由にドラッグできるようにしたいと思います。

私のUIViewサブクラスには次のメソッドがあります。

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    UITouch *touch = [touches anyObject];
    if ([touch view] != self) {
        return;
    }
    CGPoint touchPoint = [touch locationInView:self.superview];
    originalX = self.center.x;
    originalY = self.center.y;
    offsetX = originalX - touchPoint.x;
    offsetY = originalY - touchPoint.y;
    [self.superview bringSubviewToFront:self];
}

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    UITouch *touch = [touches anyObject];
    if ([touch view] == self) {
        CGPoint location = [touch locationInView:self.superview];
        CGFloat x = location.x + offsetX;
        CGFloat y = location.y + offsetY;
        self.center = CGPointMake(x, y);        
        return;
    }
}

- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event {
    UITouch *touch = [touches anyObject];
    if ([touch view] == self) {
        self.center = CGPointMake(originalX, originalY);
    }
}

UIViewを数ピクセルドラッグするたびにtouchesCancelled:withEventが呼び出されることがわかりました。ただし、UIControlのサブクラスである場合、これらのコードは正しく機能します。なんで?

前もって感謝します!

4

1 に答える 1

3

UIScrollViewは、ユーザーがどのような対話を考えているかを判断しようとします。スクロールビュー内のビューをタップすると、そのビューがタッチを開始します。次にユーザーがドラッグすると、スクロールビューはユーザーがスクロールすることを決定したため、最初にイベントを取得したビューにtouchesCancelledを送信します。次に、ドラッグ自体を処理します。

サブビューの独自のドラッグを有効にするには、UIScrollViewをサブクラス化し、andをオーバーライドtouchesShouldBegin:withEvent:inContentView:しますtouchesShouldCancelInContentView:

于 2010-07-19T08:56:24.757 に答える