ios - 애니메이트 제약은 팬 제스처로 부드럽게 변합니다.




objective-c autolayout (2)

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)];
        }];
    }
}

이것은 샘플 이미지이며 내 화면은 이와 같은 종류입니다. 그러나 내 화면에는 캘린더보기 대신 맵보기가 있습니다.


사용자가 화면을 터치하는 동안보기를 이동하려면 translationInView: 속성을 사용할 수 있습니다. UIGestureRecognizerStateBegan 의 핸들러에서 현재 제한 조건의 값 으로 변환설정하고 새 값을 가져 UIGestureRecognizerStateBegan 의 핸들러에서 제한 조건 상수를 변경할 수 있습니다.

- (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];
   }
}

사용자가 화면 위로 엄지 손가락을 올리거나 내릴 때보기를 이동해야하는 경우 속도를 사용할 수 있습니다. 예를 들어, 감속 효과를 구현할 수 있습니다.


애니메이션을 부드럽게 애니메이트하려면, 다음과 같이 animation 블록 내에서 layoutIfNeeded 호출 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)];
}];




uipangesturerecognizer