悬停在上方的动画alpha属性

时间:2011-07-26 01:27:18

标签: ios xcode animation uiview

我的屏幕上有六个座位对象(字母属性设置为0的UIViews)的集合,我的播放器对象基本上放在它们之上。座位可能有也可能没有玩家。我现在所拥有的是我已经编制了玩家的touchesMoved事件,以便当我在座位对象上拖动玩家时,座位的alpha属性将从0变为0.6。然后在拖动玩家的同时,如果我将他拖离座位,则alpha属性将返回到0.

相反,是否有一个内置的UIView动画可以反而导致alpha属性在.6和.2之间来回波动?有点悸动的效果?这需要核心动画还是更先进的东西?

我在玩家的touchesMoved方法中使用以下内容来拖动玩家并检测它是否在座位上方:

UITouch *aTouch = [touches anyObject];
self.center = [aTouch locationInView:[self.superview]];
Seat *seat = [controller seatAtPoint:[aTouch locationInView:self.superview]];

if (seat) {
self.hoverSeat = seat;
  seat.alpha = .6;
} else {
  self.hoverSeat.alpha = 0;
}

我的控制器中的seatAtPoint方法如下:

- (Seat *) seatAtPoint:(CGPoint)point {

NSMutableArray seats = [NSMutableArray arrayWithCapacity:6];

for (int i = 1; i <= 6; i++) {
  Seat *aSeat = (Seat*)[self.view viewWithTag:i];
  [seats addObject:aSeat];
}

for (Seat *seat in seats) {
 if (CGRectContainsPoint([seat frame], point)) {
  return seat;
 }
}
return nil;
}

我使用hoverSeat ivar来固定玩家悬停的座位。然后,如果返回的座位为零,则将座位的alpha设置为0。

我在这段代码中看到的一个错误是,如果我将播放器移动到屏幕上有点太快,有时alpha属性将不会回到0.有人能想到更有效的方法来确保它能够回到0?

感谢您的任何建议。

1 个答案:

答案 0 :(得分:2)

我会考虑使用CoreAnimation;它并不难用。这是淡入淡出的样子:

[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:.5];
seat.alpha = 1;
[UIView commitAnimations];  

您可以查看类似这些方法用于创建某种脉冲动画(Trigerring other animation after first ending Animation (Objetive-C))的回调,当它与您可以将其设置为永久循环的条件结合使用时。另外值得注意的是,UIView动画在运行时禁用用户输入(Infinitely looping animation)。

至于你提到的错误,如果它还在发生,你可以设置一个计时器,当被触发时,遍历所有座位并检查那些没有正确显示的计时器。您可能希望将此间隔设置为非常罕见,以便它不会中断或影响其他动画的性能。