1

サブビューをドラッグ アンド ドロップできるようにしたい UIView がありますが、これは一度は正常に機能しています。

- (void)pan: (UIPanGestureRecognizer *)recognizer
{
    if (recognizer.state == UIGestureRecognizerStateBegan) {
        CGPoint startPos = [recognizer locationInView:self];
        for (UIControl *sv in self.subviews){
            if ([sv pointInside:startPos withEvent:nil]){
                 self.controlBeingDragged = sv;
            }
         }
     }
     if (((recognizer.state == UIGestureRecognizerStateChanged) ||
         (recognizer.state == UIGestureRecognizerStateEnded)) &&
         self.controlBeingDragged){
         CGPoint translation = [recognizer translationInView:self];
         self.controlBeingDragged.center = CGPointMake(self.controlBeingDragged.center.x + translation.x, self.controlBeingDragged.center.y + translation.y);
         [recognizer setTranslation:CGPointZero inView:self];
         if (recognizer.state == UIGestureRecognizerStateEnded){
             self.controlBeingDragged = nil;
         }

     }
 }

ただし、同じ UIControl を再度ドラッグしようとすると、含まれているビューはそれがどこにあるのかわかりません。元の位置から開始することで再度ドラッグできるため、サブビューが移動したことを含むビューに通知するために行っていないことが明らかにあります。しかし、何?

4

1 に答える 1

2

一度でも機能していることに驚いています。pointInside:withEvent:メッセージには受信者の座標系の点が必要ですが、受信者のスーパービューの座標系にある点を送信しています。メッセージでポイントを送信する前に、 for each subview を使用convertPoint:toView:して、ポイントをサブビューの座標系に変換できpointInside:withEvent:ます。

CGPoint subviewPoint = [self convertPoint:startPos toView:sv];
if ([sv pointInside:subviewPoint withEvent:nil]) {
    ...

-[UIView hitTest:withEvent:]メッセージがサブビュー検索ループ全体を置き換えることができるかどうかを確認することもできます。

于 2012-07-11T23:56:19.523 に答える