使用uipangesturerecognizer和自动布局查看幻灯片(垂直向上/向下按手指位置)

时间:2015-07-14 13:06:06

标签: ios objective-c autolayout uipangesturerecognizer

这是一个非常简单的问题,但我无法弄明白。首先,这是如何将视图添加为子视图,并且我使用Autolayout。 (黑色)根视图包含蓝色和橙色视图。橙色视图是最顶部,部分覆盖蓝色视图。橙色视图中的按钮具有平移手势识别器。如果手势结束然后橙色视图正确定位,我就可以正常工作了(或者就像覆盖蓝色视图的照片一样,或者橙色可以向下滑动直到只有橙色可见。)橙色视图的位置仅为使用自动布局常量垂直更改。

enter image description here

我面临的问题是,如果一个人上下移动UIGestureRecognizerStateChanged,那么橙色视图会滑向相反的平移方向。如何正确更改自动布局常量?橙色视图的垂直移动范围是从草图向下的起点到橙色按钮保持可见。

#define MIN_SIZE 50
   -(void)handlePan:(UIPanGestureRecognizer *) pan
   {
   CGFloat viewHeight = pan.view.superview.height; //superView is the big orange view
if (pan.state == UIGestureRecognizerStateBegan)
{
    self.startLocation = [pan locationInView:self.view];
}

if (pan.state == UIGestureRecognizerStateChanged)
{
    CGPoint stopLocation = [pan locationInView:self.view];
    CGFloat dist = sqrt(pow((stopLocation.x - self.startLocation.x), 2) + pow((stopLocation.y - self.startLocation.y), 2));

    if (velocityOfPan.y > 0)
    {
        if (self.verticalConstraint.constant >= viewHeight - MIN_SIZE)
        {
            self.verticalConstraint.constant = viewHeight - MIN_SIZE;
        }
        else
            self.verticalConstraint.constant = dist;
    }
    else if(velocityOfPan.y < 0)
    {
        if (self.verticalConstraint.constant <= 0)
        {
            self.verticalConstraint.constant = 0;
        }
        else
        {
            self.verticalConstraint.constant = (viewHeight - MIN_SIZE - dist);
        }
    }
}
else if(pan.state == UIGestureRecognizerStateEnded)
{
    if (velocityOfPan.y > 0)
    {
        self.verticalConstraint.constant = viewHeight - MIN_SIZE;

    }
    else if (velocityOfPan.y < 0)
    {
        self.verticalConstraint.constant = 0;
    }

}

[self updateViewAnimation];
}
}

-(void) updateViewAnimation
{
[self.view updateConstraintsIfNeeded];

[UIView animateWithDuration:0.5 delay:0 usingSpringWithDamping:0.6 initialSpringVelocity:-1 options:UIViewAnimationOptionBeginFromCurrentState animations:^{
    [self.view layoutIfNeeded];
} completion:nil];
}

1 个答案:

答案 0 :(得分:1)

经过一些搜索和阅读后,我发现了我做错了什么。以下是我如何解决它,以防其他人想知道它。

-(void)(UIPanGestureRecognizer *) pan
{
CGPoint velocityOfPan = [pan velocityInView:self.view];
CGFloat viewHeight = pan.view.superview.height;

CGPoint delta;
switch(pan.state)
{
    case UIGestureRecognizerStateBegan:
        self.startLocation = delta = [pan translationInView:self.view];
        break;
    case UIGestureRecognizerStateChanged:
    {
        delta = CGPointApplyAffineTransform([pan translationInView:self.view], CGAffineTransformMakeTranslation(-self.startLocation.x, -self.startLocation.y));
        self.startLocation = [pan translationInView:self.view];

        if(delta.y < 0 && self.verticalConstraint.constant < 0)
        {
            delta.y = 0;
        }
        else
        {
            delta.y = self.verticalConstraint.constant + delta.y;
        }
        self.verticalConstraint.constant = delta.y;
        [self updateViewAnimation];
        break;
    }
    case UIGestureRecognizerStateEnded:
    {
        if (velocityOfPan.y > 0)
        {
            delta.y = (viewHeight - MIN_SIZE);

        }
        else if(velocityOfPan.y < 0)
        {
            delta.y = 0;
        }
        self.verticalConstraint.constant = delta.y;
        [self updateViewAnimation];
        break;
    }
    default:
        break;
}
}