<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國際加速解決方案。 廣告
                # 呈現與模型 `CALayer`的屬性行為其實很不正常,因為改變一個圖層的屬性并沒有立刻生效,而是通過一段時間漸變更新。這是怎么做到的呢? 當你改變一個圖層的屬性,屬性值的確是立刻更新的(如果你讀取它的數據,你會發現它的值在你設置它的那一刻就已經生效了),但是屏幕上并沒有馬上發生改變。這是因為你設置的屬性并沒有直接調整圖層的外觀,相反,他只是定義了圖層動畫結束之后將要變化的外觀。 當設置`CALayer`的屬性,實際上是在定義當前事務結束之后圖層如何顯示的*模型*。Core Animation扮演了一個*控制器*的角色,并且負責根據圖層行為和事務設置去不斷更新*視圖*的這些屬性在屏幕上的狀態。 我們討論的就是一個典型的*微型MVC模式*。`CALayer`是一個連接用戶界面(就是MVC中的*view*)虛構的類,但是在界面本身這個場景下,`CALayer`的行為更像是存儲了視圖如何顯示和動畫的數據模型。實際上,在蘋果自己的文檔中,圖層樹通常都是值的圖層樹模型。 在iOS中,屏幕每秒鐘重繪60次。如果動畫時長比60分之一秒要長,Core Animation就需要在設置一次新值和新值生效之間,對屏幕上的圖層進行重新組織。這意味著`CALayer`除了“真實”值(就是你設置的值)之外,必須要知道當前*顯示*在屏幕上的屬性值的記錄。 每個圖層屬性的顯示值都被存儲在一個叫做*呈現圖層*的獨立圖層當中,他可以通過`-presentationLayer`方法來訪問。這個呈現圖層實際上是模型圖層的復制,但是它的屬性值代表了在任何指定時刻當前外觀效果。換句話說,你可以通過呈現圖層的值來獲取當前屏幕上真正顯示出來的值(圖7.4)。 我們在第一章中提到除了圖層樹,另外還有*呈現樹*。呈現樹通過圖層樹中所有圖層的呈現圖層所形成。注意呈現圖層僅僅當圖層首次被*提交*(就是首次第一次在屏幕上顯示)的時候創建,所以在那之前調用`-presentationLayer`將會返回`nil`。 你可能注意到有一個叫做`–modelLayer`的方法。在呈現圖層上調用`–modelLayer`將會返回它正在呈現所依賴的`CALayer`。通常在一個圖層上調用`-modelLayer`會返回`–self`(實際上我們已經創建的原始圖層就是一種數據模型)。 ![圖7.4](https://zsisme.gitbooks.io/ios-/content/chapter7/7.4.jpeg "圖7.4") 圖7.4 一個移動的圖層是如何通過數據模型呈現的 大多數情況下,你不需要直接訪問呈現圖層,你可以通過和模型圖層的交互,來讓Core Animation更新顯示。兩種情況下呈現圖層會變得很有用,一個是同步動畫,一個是處理用戶交互。 * 如果你在實現一個基于定時器的動畫(見第11章“基于定時器的動畫”),而不僅僅是基于事務的動畫,這個時候準確地知道在某一時刻圖層顯示在什么位置就會對正確擺放圖層很有用了。 * 如果你想讓你做動畫的圖層響應用戶輸入,你可以使用`-hitTest:`方法(見第三章“圖層幾何學”)來判斷指定圖層是否被觸摸,這時候對*呈現*圖層而不是*模型*圖層調用`-hitTest:`會顯得更有意義,因為呈現圖層代表了用戶當前看到的圖層位置,而不是當前動畫結束之后的位置。 我們可以用一個簡單的案例來證明后者(見清單7.7)。在這個例子中,點擊屏幕上的任意位置將會讓圖層平移到那里。點擊圖層本身可以隨機改變它的顏色。我們通過對呈現圖層調用`-hitTest:`來判斷是否被點擊。 如果修改代碼讓`-hitTest:`直接作用于*colorLayer*而不是呈現圖層,你會發現當圖層移動的時候它并不能正確顯示。這時候你就需要點擊圖層將要移動到的位置而不是圖層本身來響應點擊(這就是為什么用呈現圖層來響應交互的原因)。 清單7.7 使用`presentationLayer`圖層來判斷當前圖層位置 ~~~ @interface ViewController () @property (nonatomic, strong) CALayer *colorLayer; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; //create a red layer self.colorLayer = [CALayer layer]; self.colorLayer.frame = CGRectMake(0, 0, 100, 100); self.colorLayer.position = CGPointMake(self.view.bounds.size.width / 2, self.view.bounds.size.height / 2); self.colorLayer.backgroundColor = [UIColor redColor].CGColor; [self.view.layer addSublayer:self.colorLayer]; } - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { //get the touch point CGPoint point = [[touches anyObject] locationInView:self.view]; //check if we've tapped the moving layer if ([self.colorLayer.presentationLayer hitTest:point]) { //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; } else { //otherwise (slowly) move the layer to new position [CATransaction begin]; [CATransaction setAnimationDuration:4.0]; self.colorLayer.position = point; [CATransaction commit]; } } ~~~ @end
                  <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>

                              哎呀哎呀视频在线观看