6

UIImageViewパン ジェスチャで移動できる があります。

UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePan:)];
[self.photoMask addGestureRecognizer:pan];

これが画面上で移動できる領域を制限したいと思います。ユーザーがビューを画面の右側にドラッグできるようにするのではなく、何らかのマージンでビューを制限したいと考えています。これどうやってするの?

また、これは回転時にどのように処理されますか?

編集 - -

#pragma mark - Gesture Recognizer
-(void)handlePan:(UIPanGestureRecognizer *)gesture {
    NSLog(@"Pan Gesture");
    gesture.view.center = [gesture locationInView:self.view];
}

これは、パンを処理する私の現在の方法です。私がする必要があるのは、画像ビューを中心点で移動し続け、たとえば画面の端に近いときにその動きを制限することです。

4

4 に答える 4

7

これに対する考えられる解決策の 1 つは、handlePan メソッドで、画面上のポイントの位置を確認し、制限したい境界内にある場合にのみ変更をコミットすることです。

たとえば。

-(void) handlePan:(UIGestureRecognizer*)panGes{

    CGPoint point = [panGes locationInView:self.view];

    //Only allow movement up to within 100 pixels of the right bound of the screen
    if (point.x < [UIScreen mainScreen].bounds.size.width - 100) {

        CGRect newframe = CGRectMake(point.x, point.y, theImageView.frame.size.width, theImageView.frame.size.height);

        theImageView.frame = newframe;

    }

}

これにより、画面の回転も正しく処理されると思います

編集

画像ビューをフレームの中心に移動するには、handlePanメソッドは次のようになります。

-(void)handlePan:(UIPanGestureRecognizer *)gesture {

    CGPoint point = [gesture locationInView:self.view];

    //Only allow movement up to within 50 pixels of the bounds of the screen
    //Ex. (IPhone 5)
    CGRect boundsRect = CGRectMake(50, 50, 220, 448);

    if (CGRectContainsPoint(boundsRect, point)) {
        imgView.center = point;
    }       
}

ポイントが目的の境界内にあるかどうかを確認し、そうであれば、画像ビュー フレームの中心をそのポイントに設定します。

于 2013-07-23T22:45:46.013 に答える
3

ここで単純化しすぎているかどうかはわかりませんが、if 句を使用することでこれを達成できると思います。

-(void)handlePan:(UIPanGestureRecognizer*)gesture {

    UIImageView *viewToDrag = gesture.view; // this is the view you want to move

    CGPoint translation = [gesture translationInView:viewToDrag.superview]; // get the movement delta

    CGRect movedFrame = CGRectOffset(viewToDrag.frame, translation.x, translation.y); // this is the new (moved) frame

    // Now this is the critical part because I don't know if your "margin"
    // is a CGRect or maybe some int values, the important thing here is
    // to compare if the "movedFrame" values are in the allowed movement area

    // Assuming that your margin is a CGRect you could do the following:
    if (CGRectContainsRect(yourPermissibleMargin, movedFrame)) {
        CGPoint newCenter = CGPointMake(CGRectGetMidX(movedFrame), CGRectGetMidY(movedFrame));
        viewToDrag.center = newCenter; // Move your view
    }

    // -OR-

    // If you have your margins as int values you could do the following:
    if ( (movedFrame.origin.x + movedFrame.size.width) < 50) {
        CGPoint newCenter = CGPointMake(CGRectGetMidX(movedFrame), CGRectGetMidY(movedFrame));
        viewToDrag.center = newCenter; // Move your view
    }
}

おそらく、特定のニーズに合わせてこれを調整する必要があります。

お役に立てれば!

于 2013-07-23T22:44:31.490 に答える
0
- (void)dragAction:(UIPanGestureRecognizer *)gesture{
     UILabel *label = (UILabel *)gesture.view;
     CGPoint translation = [gesture translationInView:label];
     if (CGRectContainsPoint(label.frame, [gesture locationInView:label] )) {
         label.center = CGPointMake(label.center.x,
                                label.center.y);
        [gesture setTranslation:CGPointZero inView:label];
   }
   else{
       label.center = CGPointMake(label.center.x,
                                label.center.y + translation.y);
        [gesture setTranslation:CGPointZero inView:label];
   }
}
于 2017-04-05T06:21:34.957 に答える