我的屏幕上有六个座位对象(字母属性设置为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?
感谢您的任何建议。
答案 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)。
至于你提到的错误,如果它还在发生,你可以设置一个计时器,当被触发时,遍历所有座位并检查那些没有正确显示的计时器。您可能希望将此间隔设置为非常罕见,以便它不会中断或影响其他动画的性能。