Core Animation 一 (檢視動畫和使用者互動)
阿新 • • 發佈:2019-02-16
UIView 提供了豐富的動畫功能,這些功能使用簡單而且進行了很好的優化。最為常見的動畫可以用+animateWithDuration:animations:和相關方法處理。你可以使用UIview為frame、bounds、center、transform、alpha、BackgroundColor以及contentStretch新增動畫效果。大多時候,我們是為frame、center、transform、alpha使用動畫效果。
2、是在小球還處在動畫時候忽略觸控事件。
-(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)也很簡單,如以下程式碼所示
但是現在小球會落下後一到右邊。不過這段程式碼有個小問題。如果你在動畫進行中觸控式螢幕幕,小球就會先跳向左下方然後以動畫效果移到右邊。你可能並不希望出現這種情況。問題在於每次觸控式螢幕幕,程式碼都會執行,如果動畫還在進行中,這就會取消動畫,而且completion程式碼塊會按照finished == NO 的條件執行。下面將會解決這個問題。-(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);}]; }]; }
要解決上面的問題有兩種解決辦法。
1、更改使用者介面,使觸控小球時才會引發動畫:
[self.circleView addGestureRecognizer:g];
2、是在小球還處在動畫時候忽略觸控事件。
這種方式很好,因為它將對檢視的其餘副作用最小化了,不過你可能想要在動畫進行時對檢視禁用所有使用者互動。這種情況下,你可以使用self.view.userInteractionEnabled替換recognizer.enabled。-(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;}]; }]; }