ios - 回転 - translatesautoresizingmaskintoconstraints




パンジェスチャーでスムーズに拘束の変化をアニメート (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)];
        }];
    }
}

これはサンプル画像です、私の画面はこのようなものですが、私の画面にはカレンダービューの代わりにマップビューがあります


スムーズにアニメーションさせたい場合は、アニメーションブロック内で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)];
}];

ユーザーが画面に触れている間にビューを移動するには、 translationInView:プロパティを使用できます。 変換を現在の制約の値に設定して新しい値を取得し( UIGestureRecognizerStateBeganハンドラで)、制約の定数をUIGestureRecognizerStateChangedハンドラで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];
   }
}

ユーザーが画面上で親指を上げたときにビューを移動したり、上下に移動したりする必要がある場合は、速度を使用できます。 たとえば、減速効果を実装できます。





uipangesturerecognizer