如何限制平移手势区域?

6

我有一个UIImageView,上面放了另一个UIView矩形。通过对UIView矩形应用平移手势,它可以移动到UIImageView之外。但我不想让它被拖到UIImageView之外。

我尝试了下面的代码,但它并没有按照我想要的方式工作。

-(void)handleMovementView:(UIPanGestureRecognizer *)recognizer
{
    CGPoint movement;

    if(recognizer.state == UIGestureRecognizerStateBegan || recognizer.state == UIGestureRecognizerStateChanged || recognizer.state == UIGestureRecognizerStateEnded)
    {
        CGRect rec = recognizer.view.frame;
        CGRect imgvw = self.imgViewCrop.frame;
        if((rec.origin.x >= imgvw.origin.x && (rec.origin.x + rec.size.width <= imgvw.origin.x + imgvw.size.width)))
        {
            CGPoint translation = [recognizer translationInView:recognizer.view.superview];
            movement = translation;
            recognizer.view.center = CGPointMake(recognizer.view.center.x + translation.x, recognizer.view.center.y + translation.y);
            [recognizer setTranslation:CGPointZero inView:recognizer.view.superview];
            [self handleMovementForHandlers:movement];
        }
    }

}

如果我慢慢地应用Pan,它会应用这个条件,但是当我快速移动时,它会超出ImageView的范围。

4个回答

9

不要手动计算点是否在视图范围内,使用 CGRectContainsPoint(rect, point)。这是我使用的方式,我喜欢它因为它更短更易读:

func handlePan(pan: UIPanGestureRecognizer) {
    switch pan.state {
    case .Began:
        if CGRectContainsPoint(self.pannableView.frame, pan.locationInView(self.pannableView)) {
            // Gesture started inside the pannable view. Do your thing.
        }
}

2

试一试

-(void)handleMovementView:(UIPanGestureRecognizer *)recognizer
{
CGPoint movement;

if(recognizer.state == UIGestureRecognizerStateBegan || recognizer.state == UIGestureRecognizerStateChanged || recognizer.state == UIGestureRecognizerStateEnded)
{
    CGRect rec = recognizer.view.frame;
    CGRect imgvw = self.imgViewCrop.frame;
    if((rec.origin.x >= imgvw.origin.x && (rec.origin.x + rec.size.width <= imgvw.origin.x + imgvw.size.width)))
    {
        CGPoint translation = [recognizer translationInView:recognizer.view.superview];
        movement = translation;
        recognizer.view.center = CGPointMake(recognizer.view.center.x + translation.x, recognizer.view.center.y + translation.y);
        rec = recognizer.view.frame;

        if( rec.origin.x < imgvw.origin.x )
            rec.origin.x = imgvw.origin.x;

        if( rec.origin.x + rec.size.width > imgvw.origin.x + imgvw.size.width )
            rec.origin.x = imgvw.origin.x + imgvw.size.width - rec.size.width;

        recognizer.view.frame = rec;

        [recognizer setTranslation:CGPointZero inView:recognizer.view.superview];
        [self handleMovementForHandlers:movement];
    }
}
}

如果在移动时感到卡顿,请尝试使用min、max函数限制区域。例如: var newCenter = CGPoint(x: x + translation.x, y: y + translation.y) newCenter.x = min(maxXcenter,newCenter.x) newCenter.x = max(minXCenter,newCenter.x) newCenter.y = min(maxYCenter,newCenter.y) newCenter.y = max(minYCenter,newCenter.y) - krishan kumar

1

在 @Matt Quiros 的回答基础上,进一步探讨,适用于 Swift 3 / 4:

func shouldRespondToGesture(_ gesture: UIGestureRecognizer, in frame: CGRect) -> Bool {
    return gesture.state == .began && frame.contains(gesture.location(in: self.view))
}

0

首先获取手势识别器(Pan Gesture recognizer)的坐标(CGRect),然后获取 ImageView(您的 ImageView)的坐标(CGRect)。

然后根据您的要求比较这些坐标。

如果您仍然遇到任何问题,请记录图像视图和识别器的 x 和 y 值。


1
请不要在回答中乞求“赞”。 - Sumurai8

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接