我创建了一个基本的解锁滑块,就像你用来解锁iPhone一样。
在我的touchesEnded函数中,我使用动画将滑块移回原位。
用户第一次移动滑块(并且实际上没有点击结束以解锁),动画工作正常,滑块移回原位。
但是,下次用户尝试移动滑块(并且会调用touchesMoved)时,滑块会被推离屏幕(向左),因为它们之前滑动了滑块。
那么,发生了什么?
- (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];
}
}
修改
这是工作功能,清理了一下,虽然它可能会更好(感谢几个来自一个黑客的SO回答问题)。我将博客完整的模块,因为似乎没有标准的小部件:
- (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;
}
答案 0 :(得分: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];
}
}
通过修改其框架而不是其平移来移动滑块,这应该使其与快照动画更好地交互。或者,不是在隐式动画师中重置帧,而是可以重置那里的翻译。
答案 1 :(得分:0)
您需要在touchesEnded处理程序中重置视图转换:
[self.unlock setTransform:CGAffineTransformIdentity];
尝试使用{而不是动画frame
属性。