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