UIView的動畫相關API

weixin_33727510發表於2016-12-05

只記錄自己不熟悉的,具體見View Programming Guide for iOS - Animations篇

檢視屬性動畫

  • setAnimationsEnabled:
    預設情況下,動畫塊中所有可動畫屬性的更改都將進行動畫處理。如果你想要一部分進行動畫處理剩下的不做動畫,使用setAnimationsEnabled:方法臨時禁用動畫,做你想要的改變,然後在呼叫setAnimationsEnabled:允許動畫。可以通過呼叫類方法areAnimationsEnabled 判斷當前是否支援動畫
Tables Are
setAnimationStartDate: setAnimationDelay: 使用這兩個方法指明什麼時候開始執行,如果指明的開始時間是過去的則動畫立即執行
setAnimationDuration: 使用這個方法指明動畫時間
setAnimationCurve: 使用此方法設定動畫的時間曲線。 這控制動畫是在某些時間線性執行還是改變速度。
setAnimationRepeatCount: setAnimationRepeatAutoreverses: 使用這些方法設定動畫重複次數以及在動畫結束時是否反轉
setAnimationDelegate: setAnimationWillStartSelect: setAnimationDidStopSelect: 使用這些方法設定代理以及在動畫開始前和結束後執行相應程式碼
setAnimationBeginFromCurrentState: 使用這個方法去立即結束所有之前的動畫並且在當前狀態下開始新的動畫。如果你將引數傳為NO則新的動畫將在之前的動畫結束之後再執行

動畫代理方法:

// This method begins the first animation.

- (IBAction)showHideView:(id)sender

{
    [UIView beginAnimations:@"ShowHideView" context:nil];

    [UIView setAnimationCurve:UIViewAnimationCurveEaseIn];

    [UIView setAnimationDuration:1.0];

    [UIView setAnimationDelegate:self];

    [UIView setAnimationDidStopSelector:@selector(showHideDidStop:finished:context:)];

    // Make the animatable changes.

    thirdView.alpha = 0.0;
    // Commit the changes and perform the animation.

    [UIView commitAnimations];

}

// Called at the end of the preceding animation.
- (void)showHideDidStop:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context

{
    [UIView beginAnimations:@"ShowHideView2" context:nil];

    [UIView setAnimationCurve:UIViewAnimationCurveEaseOut];

    [UIView setAnimationDuration:1.0];

    [UIView setAnimationDelay:1.0];

    thirdView.alpha = 1.0;

    [UIView commitAnimations];
}

動畫代理方法應該如下所示:

- (void)animationWillStart:(NSString *)animationID context:(void *)context;
- (void)animationDidStop:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context;

animationID和context是在動畫塊開始方法中beginAnimations:context: 傳遞的引數,

  • animationID - 應用程式提供的用於標識動畫的字串。
  • context - 應用程式提供的物件用於傳遞額外的資訊給代理
    setAnimationDidStopSelector:的方法有一個額外的引數——一個布林值,如果是YES則表明動畫執行完成。如果值為NO,則動畫可能被取消或者被其他動畫打斷了。

建立檢視過渡動畫

檢視過渡動畫可以隱藏在檢視層級中和新增,刪除,隱藏和展示的相關的突然改變。可以通過使用檢視過渡動畫實現以下改變:

  • 改變現有檢視的可見子檢視。當你想對現有檢視做出一些小改變時使用這個選項
  • 在檢視層級中替換一個檢視。當你想要改變整個或大部分螢幕檢視的時候使用這個選項

改變子檢視(iOS 4以後鼓勵使用):

- (IBAction)displayNewPage:(id)sender
{
    [UIView transitionWithView:self.view
        duration:1.0
        options:UIViewAnimationOptionTransitionCurlUp
        animations:^{
            currentTextView.hidden = YES;
            swapTextView.hidden = NO;
        }
        completion:^(BOOL finished){
            // Save the old text and then swap the views.
            [self saveNotes:temp];
            UIView*    temp = currentTextView;
            currentTextView = swapTextView;
            swapTextView = temp;
        }];
}

使用begin/commit方法改變子檢視

    [UIView beginAnimations:@"ToggleSiblings" context:nil];
    [UIView setAnimationTransition:UIViewAnimationTransitionCurlUp forView:self.view cache:YES];
    [UIView setAnimationDuration:1.0];

    // Make your changes 

    [UIView commitAnimations];

替換檢視

- (IBAction)toggleMainViews:(id)sender {

    [UIView transitionFromView:(displayingPrimary ? primaryView : secondaryView)
        toView:(displayingPrimary ? secondaryView : primaryView)
        duration:1.0
        options:(displayingPrimary ? UIViewAnimationOptionTransitionFlipFromRight :

                    UIViewAnimationOptionTransitionFlipFromLeft)
        completion:^(BOOL finished) {
            if (finished) {
                displayingPrimary = !displayingPrimary;
            }
    }];
}

相關文章