<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                # 事務 Core Animation基于一個假設,說屏幕上的任何東西都可以(或者可能)做動畫。動畫并不需要你在Core Animation中手動打開,相反需要明確地關閉,否則他會一直存在。 當你改變`CALayer`的一個可做動畫的屬性,它并不能立刻在屏幕上體現出來。相反,它是從先前的值平滑過渡到新的值。這一切都是默認的行為,你不需要做額外的操作。 這看起來這太棒了,似乎不太真實,我們來用一個demo解釋一下:首先和第一章“圖層樹”一樣創建一個藍色的方塊,然后添加一個按鈕,隨機改變它的顏色。代碼見清單7.1。點擊按鈕,你會發現圖層的顏色平滑過渡到一個新值,而不是跳變(圖7.1)。 清單7.1 隨機改變圖層顏色 ~~~ @interface ViewController () @property (nonatomic, weak) IBOutlet UIView *layerView; @property (nonatomic, weak) IBOutlet CALayer *colorLayer;/*熱心人發現這里應該改為@property (nonatomic, strong) CALayer *colorLayer;否則運行結果不正確。 */ @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; //create sublayer self.colorLayer = [CALayer layer]; self.colorLayer.frame = CGRectMake(50.0f, 50.0f, 100.0f, 100.0f); self.colorLayer.backgroundColor = [UIColor blueColor].CGColor; //add it to our view [self.layerView.layer addSublayer:self.colorLayer]; } - (IBAction)changeColor { //randomize the layer background color CGFloat red = arc4random() / (CGFloat)INT_MAX; CGFloat green = arc4random() / (CGFloat)INT_MAX; CGFloat blue = arc4random() / (CGFloat)INT_MAX; self.colorLayer.backgroundColor = [UIColor colorWithRed:red green:green blue:blue alpha:1.0].CGColor; ? } @end ~~~ ![](https://box.kancloud.cn/2015-12-24_567bc206dc26f.png) 圖7.1 添加一個按鈕來控制圖層顏色 這其實就是所謂的*隱式*動畫。之所以叫隱式是因為我們并沒有指定任何動畫的類型。我們僅僅改變了一個屬性,然后Core Animation來決定如何并且何時去做動畫。Core Animaiton同樣支持*顯式*動畫,下章詳細說明。 但當你改變一個屬性,Core Animation是如何判斷動畫類型和持續時間的呢?實際上動畫執行的時間取決于當前*事務*的設置,動畫類型取決于*圖層行為*。 事務實際上是Core Animation用來包含一系列屬性動畫集合的機制,任何用指定事務去改變可以做動畫的圖層屬性都不會立刻發生變化,而是當事務一旦*提交*的時候開始用一個動畫過渡到新值。 事務是通過`CATransaction`類來做管理,這個類的設計有些奇怪,不像你從它的命名預期的那樣去管理一個簡單的事務,而是管理了一疊你不能訪問的事務。`CATransaction`沒有屬性或者實例方法,并且也不能用`+alloc`和`-init`方法創建它。但是可以用`+begin`和`+commit`分別來入棧或者出棧。 任何可以做動畫的圖層屬性都會被添加到棧頂的事務,你可以通過`+setAnimationDuration:`方法設置當前事務的動畫時間,或者通過`+animationDuration`方法來獲取值(默認0.25秒)。 Core Animation在每個*run loop*周期中自動開始一次新的事務(run loop是iOS負責收集用戶輸入,處理定時器或者網絡事件并且重新繪制屏幕的東西),即使你不顯式的用`[CATransaction begin]`開始一次事務,任何在一次run loop循環中屬性的改變都會被集中起來,然后做一次0.25秒的動畫。 明白這些之后,我們就可以輕松修改變色動畫的時間了。我們當然可以用當前事務的`+setAnimationDuration:`方法來修改動畫時間,但在這里我們首先起一個新的事務,于是修改時間就不會有別的副作用。因為修改當前事務的時間可能會導致同一時刻別的動畫(如屏幕旋轉),所以最好還是在調整動畫之前壓入一個新的事務。 修改后的代碼見清單7.2。運行程序,你會發現色塊顏色比之前變得更慢了。 清單7.2 使用`CATransaction`控制動畫時間 ~~~ - (IBAction)changeColor { //begin a new transaction [CATransaction begin]; //set the animation duration to 1 second [CATransaction setAnimationDuration:1.0]; //randomize the layer background color CGFloat red = arc4random() / (CGFloat)INT_MAX; CGFloat green = arc4random() / (CGFloat)INT_MAX; CGFloat blue = arc4random() / (CGFloat)INT_MAX; self.colorLayer.backgroundColor = [UIColor colorWithRed:red green:green blue:blue alpha:1.0].CGColor; ?//commit the transaction [CATransaction commit]; } ~~~ 如果你用過`UIView`的動畫方法做過一些動畫效果,那么應該對這個模式不陌生。`UIView`有兩個方法,`+beginAnimations:context:`和`+commitAnimations`,和`CATransaction`的`+begin`和`+commit`方法類似。實際上在`+beginAnimations:context:`和`+commitAnimations`之間所有視圖或者圖層屬性的改變而做的動畫都是由于設置了`CATransaction`的原因。 在iOS4中,蘋果對UIView添加了一種基于block的動畫方法:`+animateWithDuration:animations:`。這樣寫對做一堆的屬性動畫在語法上會更加簡單,但實質上它們都是在做同樣的事情。 `CATransaction`的`+begin`和`+commit`方法在`+animateWithDuration:animations:`內部自動調用,這樣block中所有屬性的改變都會被事務所包含。這樣也可以避免開發者由于對`+begin`和`+commit`匹配的失誤造成的風險。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看