繁体   English   中英

iPhone /可可动画的效果我不明白

[英]iPhone/Cocoa Animation having effect I don't understand

我已经创建了一个基本的解锁滑块,就像您用来解锁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; 
}

在上一个问题中,我没有意识到您是通过更改其变形来移动滑块的。 通过更改帧和变换来混合运动将变得相当复杂。

也许您可以尝试做更多这样的事情:

- (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];
  }
}

通过修改滑块的框架(而不是平移)来移动滑块,这应使滑块与回弹动画更好地交互。 或者,您可以在此处重置转换,而不是在隐式动画师中重置框架。

您需要在touchesEnded处理程序中重置视图转换:

[self.unlock setTransform:CGAffineTransformIdentity];

尝试这样做,而不是对frame属性设置动画。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM