簡體   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