如何在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)];
}];
}
}
这是示例图片, 我的屏幕是这样的,但在我的屏幕上,有一个地图视图而不是日历视图
答案 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设计允许,我建议从拖动的视图约束中断开地图约束。