2

UIViewを最小化および最大化するために、UIPangestureRecognizerを使用しています。コードは以下のとおりです。

-(void) pannningMyView:(UIPanGestureRecognizer*) panGesture{
    CGPoint newPoint=[panGesture translationInView:self.view];
    CGPoint oldPoint=self.myPanningView.frame.origin;
    CGFloat dx=newPoint.x;
    CGFloat dy=newPoint.y;
    if(dx>0){
        CGRect oldRect=self.myPanningView.frame;
        oldRect.size.width+=dx;
        oldRect.size.height+=dy;
        self.myPanningView.frame=oldRect;
    }
}

ただし、遷移は非常に高速であるため、数ピクセル移動すると画面全体がカバーされます。コードにどのような修正が必要かわかりません。

4

1 に答える 1

1

問題は、連続ジェスチャの最初からの翻訳であるため、翻訳が累積されるtranslationInViewことですが、元のフレームではなく、現在のフレームに翻訳を追加していることになります。これは、ジェスチャの状態を確認することで解決されます。ジェスチャの開始時に元のフレームを保存し、ジェスチャが進むにつれて、それを将来の翻訳の基礎として使用します。

-(void) panningMyView:(UIPanGestureRecognizer*) panGesture
{
    static CGRect originalFrame; // or you could make this a non-static class ivar

    if (panGesture.state == UIGestureRecognizerStateBegan)
    {
        originalFrame = self.myPanningView.frame;
    }
    else if (panGesture.state == UIGestureRecognizerStateChanged)
    {
        CGPoint translation = [panGesture translationInView:self.view];
        if (translation.x > 0) {
            CGRect newFrame = originalFrame;
            newFrame.size.width += translation.x;
            newFrame.size.height += translation.y;
            self.myPanningView.frame = newFrame;
        }
    }
}

oldPoint注意してください、あなたがそれを使用していないようだったので、私はそれを取り除きました。また、画面上のポイントではなく、画面上で指がどれだけ移動(または移動)したかを示すために、名前を変更newPointしました。また、それが何であるかをより正確に捉えていると思うので、名前をにtranslation変更oldRectしました。newFrame

基本的に、私はあなたのルーチンのロジックを維持しようとしましたが、単にあなたのロジックと変数名を明確にします。終了またはキャンセルされたジェスチャをチェックし、アニメーションを使用してジェスチャを完了または反転するなど、追加の原因が必要になる可能性があると思いelse ifましたが、元の質問でこれを参照していなかったため、これには取り組みませんでした。

とにかく、私たちがここで何をしているのかを理解していただければ幸いです。現在のフレームに適用するのではなく、元のフレームを保存して、それに変換を適用します。


アップデート:

フォローアップの質問で、アニメーションを明確にする方法を尋ねました。あなたは次のようなことをするかもしれません:

-(void) panningMyView:(UIPanGestureRecognizer*) panGesture
{
    static CGRect originalFrame; // or you could make this a non-static class ivar
    CGPoint translation = [panGesture translationInView:self.view];

    if (panGesture.state == UIGestureRecognizerStateBegan)
    {
        originalFrame = self.myPanningView.frame;
    }
    else if (panGesture.state == UIGestureRecognizerStateChanged)
    {
        if (translation.x > 0) {
            CGRect newFrame = originalFrame;
            newFrame.size.width += translation.x;
            newFrame.size.height += translation.y;
            self.myPanningView.frame = newFrame;
        }
    }
    else if (panGesture.state == UIGestureRecognizerStateEnded ||
             panGesture.state == UIGestureRecognizerStateCancelled ||
             panGesture.state == UIGestureRecognizerStateFailed)
    {
        CGRect finalFrame = originalFrame;

        // if we've gone more than half way, move it all the way, 
        // otherwise return it to the original frame

        if (translation.x > (self.view.frame.size.width / 2.0))
        {
            finalFrame.size.width += self.view.frame.size.width;
            finalFrame.size.height += self.view.frame.size.height;
        }

        [UIView animateWithDuration:0.5
                              delay:0.0
                            options:UIViewAnimationOptionCurveEaseOut
                         animations:^{
                                self.myPanningView.frame = finalFrame;
                             }
                         completion:nil];
    }
}
于 2012-12-25T17:54:29.120 に答える