使用平移手势平滑地更改动画约束

时间:2018-04-02 07:34:58

标签: ios objective-c autolayout nslayoutconstraint uipangesturerecognizer

  

如何在iOS中使用平移手势平滑地更改约束更改动画?

我正在尝试开发一个视图位于屏幕底部的屏幕。我已经为这个观点添加了平移手势。在拖动该视图时,我想要更改该视图的顶部约束。平移手势仅允许在垂直和向下方向。我添加了一些拖动视图的限制。它工作但不顺利。如何使用平移手势平滑地修改约束变化?这是我的代码。

 - (void)handleGesture:(UIPanGestureRecognizer *)sender
{
    CGPoint velocity = [sender velocityInView:_locationContainer];

    [sender setTranslation:CGPointMake(0, 0) inView:self.view];

    if (fabs(velocity.y) > fabs(velocity.x)) {

        NSLog(@"velocity y %f ",velocity.y * 0.13);

        if(velocity.y < 0 && (self.locationDetailsTop.constant > minimumTop) )
        {
            NSLog(@"gesture moving Up");
            self.locationDetailsTop.constant = self.locationDetailsTop.constant - fabs(velocity.y * 0.1);
        }
        else if (self.locationDetailsTop.constant < firstTop)
        {
            NSLog(@"gesture moving Bottom");

            self.locationDetailsTop.constant = self.locationDetailsTop.constant + fabs(velocity.y * 0.1);
        }

        [self.view layoutIfNeeded];
        [UIView animateWithDuration:0.1 animations:^{
            [self.mapView setFrame:CGRectMake(0, 0, self.view.frame.size.width, self.locationContainer.frame.origin.y)];
        }];
    }
}

这是示例图片, 我的屏幕是这样的,但在我的屏幕上,有一个地图视图而不是日历视图

enter image description here

3 个答案:

答案 0 :(得分:4)

要在用户触摸屏幕时移动视图,您可以使用translationInView:属性。您可以set a translation获取当前约束的值并获取新值(在UIGestureRecognizerStateBegan的处理程序中)并在UIGestureRecognizerStateChanged的处理程序中更改约束的常量:< / p>

- (void)padRecognizerStateChanged:(UIPanGestureRecognizer*)sender
{
   if(sender.state == UIGestureRecognizerStateBegan)
   {
      [sender setTranslation:CGPointMake(0.0, [self getConstraintValue]) inView: _locationContainer]; 
   }
   else if (sender.state == UIGestureRecognizerStateChanged)
   {
      [self setConstraintValue: [sender translationInView:_locationContainer].y];
      [self.view setNeedsLayout];
   }
}

如果您需要在用户将拇指放在屏幕上方向上或向下移动时移动视图,则可以使用力度。例如,您可以实现减速效果。

答案 1 :(得分:1)

如果您希望它能够流畅地制作动画,请尝试在动画块中调用layoutIfNeeded,如下所示:

[UIView animateWithDuration:0.1 animations:^{
    [self.view layoutIfNeeded];
    [self.mapView setFrame:CGRectMake(0, 0, self.view.frame.size.width, self.locationContainer.frame.origin.y)];
}];

答案 2 :(得分:0)

我认为最初的问题是询问如何平稳地执行此动画。但是,如果将地图视图约束链接到拖动的视图约束,则由于自动布局约束和MKMapView布局之间的多项式关系,计算将非常紧张,因此可能会出现滞后。如果UI / UX设计允许,我建议从拖动的视图约束中断开地图约束。