Анимационное ограничение меняется плавно с помощью жесты pan
Как оживить ограничение с плавным движением в 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)];
}];
}
}
Это образ образца, мой экран такого же типа, как и этот, но на моем экране есть вид карты вместо календаря
Ответы
Ответ 1
Чтобы переместить просмотр, когда пользователь касается экрана, вы можете использовать свойство translationInView:. Вы можете установить перевод на текущее значение ограничения и получить новое значение (в обработчике UIGestureRecognizerStateBegan) и изменить константу ограничения в обработчике UIGestureRecognizerStateChanged:
- (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];
}
}
Вы можете использовать скорость, если вам нужно переместить вид, когда пользователь поднял большой палец над экраном для движения вверх или вниз. Например, вы можете реализовать эффект замедления.
Ответ 2
Если вы хотите, чтобы он плавно анимировался, попробуйте вызвать 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)];
}];