2009-07-19 9 views
0

iPhoneのロックを解除するのと同じように、基本的なロック解除スライダーを作成しました。iPhone/Cocoaアニメーション効果がありません

私のtouchesEnded関数では、スライダをホームに戻すためにアニメーションを使用します。

ユーザーが初めてスライダーを移動したとき(実際にはロック解除のために最後に当たっていない)、アニメーションは正常に機能し、スライダーは元の位置に戻ります。

しかし、次回ユーザーがスライダーを移動しようとすると(とtouchesMovedが呼び出されます)、スライダーは前にスライダーをスライドさせた量だけ画面外に(左に)押し出されます。

何が起こっているのですか? (夫婦のおかげで1人のハッカーからSOの質問に答え)より良いかもしれないけれども

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { 
    self.dragging = NO; 
    self.startX = 0; 
    [UIView beginAnimations:nil context:nil]; 
    [UIView setAnimationDuration:0.5]; 
    self.unlock.frame = CGRectMake(0, 0, 75, 35); 
    [UIView commitAnimations]; 
} 

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { 
    if (!self.dragging) { return; } 
    UITouch *touch = [[event allTouches] anyObject]; 
    CGPoint point = [touch locationInView:self]; 
    int offset = point.x - self.startX; 
    NSLog(@"%i", offset); 
    if (offset > (LENGTH-SIZE)) { 
    offset = (LENGTH-SIZE); 
    } 
    CGAffineTransform myTransform = CGAffineTransformMakeTranslation(offset, 0.0); 
    [self.unlock setTransform:myTransform]; 
    if (point.x >= (LENGTH-(SIZE-self.startX))) { 
    NSLog(@"Slider reached end"); 
    [self.sliderView removeFromSuperview]; 
    } 
} 

EDIT

はここで、少しクリーンアップ、作業機能です。

[self.unlock setTransform:CGAffineTransformIdentity]; 

その代わりに試してみてください:あなたはビューがあなたのtouchesEndedハンドラに変換リセットする必要が

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { 

    if (!self.dragging) { return; } 

    UITouch *touch = [[event allTouches] anyObject]; 
    CGPoint point = [touch locationInView:self]; 

    if (point.x >= (LENGTH-(SIZE-self.startX))) { 
    NSLog(@"Slider reached end"); 
    [self.sliderView removeFromSuperview]; 
    } 

    // offset based on where the user clicked the slider 
    int offset = point.x - self.startX; 
    if (offset > (LENGTH-SIZE)) { 
    offset = (LENGTH-SIZE); 
    } 

    //move the slider 
    CGRect oldFrame = self.unlock.frame; 
    CGRect newFrame = CGRectMake(self.frame.origin.x+offset, self.frame.origin.y-5, oldFrame.size.width, oldFrame.size.height); 
    self.unlock.frame = newFrame; 
} 

答えて

1

あなたの以前の質問では、私はあなたがその変換を変更することによってスライダーを動かしていたとは思いませんでした。フレームとトランスフォームを変更してモーションをミックスすることは、やや複雑になるでしょう。

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { 
    if (!self.dragging) { return; } 
    UITouch *touch = [[event allTouches] anyObject]; 
    CGPoint point = [touch locationInView:self]; 
    int offset = point.x - self.startX; 
    NSLog(@"%i", offset); 
    if (offset > (LENGTH-SIZE)) { 
    offset = (LENGTH-SIZE); 
    } 

    CGRect oldFrame = self.frame; 
    CGRect newFrame = CGRectMake(oldFrame.origin.x+offset, oldFrame.origin.y, oldFrame.size.width, oldFrame.size.height); 
    self.frame = newFrame; 

    if (point.x >= (LENGTH-(SIZE-self.startX))) { 
    NSLog(@"Slider reached end"); 
    [self.sliderView removeFromSuperview]; 
    } 
} 

そのフレームではなく、それがスナップバックアニメーションとのより良い対話するようになりますその翻訳を修正することにより、スライダーを移動します。

たぶん、あなたはより多くのこのような何かをやってみてください。代わりに暗黙のアニメーターでフレームをリセットするのではなく、そこの変換をリセットすることもできます。

+0

ありがとう、このコメントはそれを働かせた。私は少しコードを微調整しなければならなかった、そして、私はそれに厄介な整数リテラルを入れた。私は上記の作業コードを掲示し、それをさらに修正します。 –

0

:私は、標準のウィジェットがあるようには思えないので、完全なモジュールをブログするつもりですframeプロパティをアニメートします。

+0

これは元々これを設定していたもので、うまくいきましたが、素敵なアニメーションを家に持ち帰っていません。 –

関連する問題