1. 程式人生 > >Core Animation 一 (檢視動畫和使用者互動)

Core Animation 一 (檢視動畫和使用者互動)

UIView 提供了豐富的動畫功能,這些功能使用簡單而且進行了很好的優化。最為常見的動畫可以用+animateWithDuration:animations:和相關方法處理。你可以使用UIview為frame、bounds、center、transform、alpha、BackgroundColor以及contentStretch新增動畫效果。大多時候,我們是為frame、center、transform、alpha使用動畫效果。
-(void)viewDidLoad
{
    [super viewDidLoad];
    self.circleView = [[CircleView alloc] initWithFrame:CGRectMake(0,0,20,20)];
    self.circleView.center = CGPointMake(100,20);
    [[self view] addSubview:self.circleView];

    UITapGestureRecognizer *g;
    g = [[UITapGestureRecognizer alloc]initWithTarget:self action:@Selector(dropAnimate)];
    [[self view] addGestureRecognizer:g];
}
...

-(void)dropAnimate
{
  [UIView animateWithDuration:3 animations:^{self.circleView.center = CGPointMake(100,300);}];
}

以上的是一種基於檢視的最簡單動畫,設計大部分的常見問題,尤其是通過動畫變化大小、位置以及不透明性(alpha)。它也常用與做出縮放、旋轉或平移的變形(transform)動畫效果。較為不太常見的用法是對backGroundColor喝contentStretch 新增動畫效果。改變背景顏色的動畫HUD(Head Up Display,平視顯示器)式介面中尤其有用,可以在近乎透明與近乎不透明的背景間變換。這比單純改變alpha的動畫效果更好。

連續動畫(chaining animation)也很簡單,如以下程式碼所示

-(void)dropAnimate
{
[UIView animateWithDuration:3 animations:^{self.circleView.center = CGPointMake(100,300);}
completion:(^BOOL finished){
[UIView animateWithDuration:1 animations:^{self.circleView.center = CGPointMake(250,300);}];
}];
}
但是現在小球會落下後一到右邊。不過這段程式碼有個小問題。如果你在動畫進行中觸控式螢幕幕,小球就會先跳向左下方然後以動畫效果移到右邊。你可能並不希望出現這種情況。問題在於每次觸控式螢幕幕,程式碼都會執行,如果動畫還在進行中,這就會取消動畫,而且completion程式碼塊會按照finished == NO 的條件執行。下面將會解決這個問題。

要解決上面的問題有兩種解決辦法。

1、更改使用者介面,使觸控小球時才會引發動畫:

[self.circleView addGestureRecognizer:g];

2、是在小球還處在動畫時候忽略觸控事件。
-(void)dropAnimate
{
[UIView animateWithDuration:3 animations:^{
recognnizer.enable = NO;
self.circleView.center = CGPointMake(100,300);}
completion:(^BOOL finished){
[UIView animateWithDuration:1 animations:^{self.circleView.center = CGPointMake(250,300);}
completion:^(BOOL finished){recognnizer.enable = YES;}];
}];
}
這種方式很好,因為它將對檢視的其餘副作用最小化了,不過你可能想要在動畫進行時對檢視禁用所有使用者互動。這種情況下,你可以使用self.view.userInteractionEnabled替換recognizer.enabled。