点按“手势”以拖动视图但限制可以拖动的范围

时间:2015-04-16 19:55:47

标签: ios objective-c

我目前有2个圈子。一个大圆圈和一个小圆圈。小圆圈具有轻敲手势识别器,允许用户拖动它。我希望小圆圈的中心不会超过大圆的半径。我在内圈有4个自动布局限制。固定宽度为1,固定高度为1,x为中心距离为1,y为中心距离为1。以下是我的意思:

- (IBAction)handlePan:(UIPanGestureRecognizer *)recognizer {
    if (recognizer.state == UIGestureRecognizerStateChanged) {
        CGPoint translation = [recognizer translationInView:self.view];
        CGFloat x = recognizer.view.center.x + translation.x;
        CGFloat y = recognizer.view.center.y + translation.y;
        CGPoint desiredPoint = CGPointMake(x, y);

        //check if point the user is trying to get to is outside the radius of the outer circle
        //if it is, set the center of the inner circle to the right position at the distance of the radius and with the same angle
        if ([self distanceBetweenStartPoint:self.outerCircleView.center endPoint:desiredPoint] > self.outerCircleRadius) {
            CGFloat angle = [self angleBetweenStartPoint:self.outerCircleView.center endPoint:actualPosition];
            desiredPoint = [self findPointFromRadius:self.outerCircleRadius startPoint:self.outerCircleView.center angle:angle];
        }

        //adjust the constraints to move the inner circle
        self.innerCircleCenterXConstraint.constant += actualPosition.x - recognizer.view.center.x;
        self.innerCircleCenterYConstraint.constant += actualPosition.y - recognizer.view.center.y;

        [recognizer setTranslation:CGPointMake(0.0, 0.0) inView:self.view];
    }
}

- (CGFloat)distanceBetweenStartPoint:(CGPoint)startPoint endPoint:(CGPoint)endPoint {
    CGFloat xDif = endPoint.x - startPoint.x;
    CGFloat yDif = endPoint.y - startPoint.y;
    //pythagorean theorem
    return sqrt((xDif * xDif) + (yDif * yDif));
}

- (CGPoint)findPointFromRadius:(CGFloat)radius startPoint:(CGPoint)startPoint angle:(CGFloat)angle {
    CGFloat x = radius * cos(angle) + startPoint.x;
    CGFloat y = radius * sin(angle) + startPoint.y;

    return CGPointMake(x, y);
}

- (CGFloat)angleBetweenStartPoint:(CGPoint)startPoint endPoint:(CGPoint)endPoint {
    CGPoint originPoint = CGPointMake(endPoint.x - startPoint.x, endPoint.y - startPoint.y);
    return atan2f(originPoint.y, originPoint.x);
}

这几乎完美无缺。问题是我试图找到用户向圆圈外移动的百分比。所以我使用distanceBetweenStartPoint(外圆的中心)endPoint(内圆的中心)方法并将其除以外圆的半径。当圆圈被拖到尽可能远的一侧时,这应该给我一个值1。不幸的是我得到的值为0.9994324或1.000923。可能是什么导致了这个?感谢您的任何见解!

0 个答案:

没有答案