《Learning iOS UI Development》- 讀書筆記

mailwang 8年前發布 | 14K 次閱讀 iOS開發 Objective-C開發

來自: http://www.liuchendi.com/2016/01/30/iOS/36_learning-iOS-UI-Development/

《Learning iOS UI Development》的讀書筆記

今天無意間看到了這本書: 《Learning iOS UI Development》

翻看了一下覺得還行,雖然只有將近200頁,基本上都是概括的東西,所以就當做查缺補漏吧,順便記錄一些閱讀的筆記,可能會簡單了點。知識點有個索引印象比較好,到時候真的遇見了查找起來也比較快。就像 HashMap .

一、UI Fundamentals

1、當一個視圖添加到父視圖上面的時候,會調用 didMoveToSuperview ,父視圖的方法會被攔截 didAddSubview

2、 layoutSubviews 在子視圖添加或者移除、控件的大小被改變的時候被調用。

3、iOS在屏幕顯示視圖上面做了重要的優化。View不是連續的繪制。系統會為每一個顯示的視圖元素創建一個快照,直到視圖不需要更新前,當前的快照會一直顯示。 視圖然后被重繪,更新新的視圖快照。這樣就用了非常巧妙的方式避免智能手機上資源的浪費,達到最優化

4、 setNeedsDisplay 和 setNeedsDisplayInRect ,兩個函數被調用,作用是通知系統重新繪制新的內容。在下一個runloop期間,系統把view重新繪制。

兩者的區別是, setNeedsDisplay 是把整個視圖重新繪制。 setNeedsDisplayInRect 是重新繪制視圖的一部分

setNeedsDisplay 調用的時候, drawRect 方法會被執行

5、 loadView : 視圖被創建分配到 view 屬性上,取決于控制器創建的時候,一個視圖可以被sb或者xib文件創建。 不要去復寫這個方法,除非你不用IB去實現

二、UI Components Overview

1、iOS8之后使用label計算動態高度的時候需要設置 preferredMaxLayoutWidth 屬性,表示默認最大寬度。

在某些情況下(設置了 preferredMaxLayoutWidth ), string的內容并不一定能適應整一個label。

可以設置 adjustsFontSizeToFitWidth 屬性,設置一個font size減少string的可顯示區域。

minimumScaleFactor . 設置顯示的比例,((for example, a font with size 24 and a minimum scale factor of 0.5 can be reduced up to a minimum value of 12))

2、UIStepper、UIProgressView

3、 imageWithRenderingMode 設置 rendering mode ,

  • AlwaysOriginal 渲染原始圖
  • AlwaysTemplate : 忽略color information 渲染

三、AutoLayout

1、修改控件的約束值后,需要調用 setNeedsUpdateConstraints 方法

四、Layer and Animation

隱式動畫

最簡單的方法是改變 animatable 屬性,在runtime的時候改變值。 創建了animation附屬在layer,在下一次重繪的時候執行

CATransaction.begin()
CATransaction.setValue(kCFBooleanTrue, forKey:
kCATransactionDisableActions)
layer.backgroundColor = UIColor.redColor().CGColor
CATransaction.commit()

</div>

這些自動的行為是core graphics 的實現,CAAction的協議,允許layer改變之后自動觸發這些行為。

屬性動畫

隱式動畫可以用幾行代碼很快有效的解決動畫,但是復雜的自定義動畫他們沒辦法完成

CAAnimation 是一個動畫的抽象類,提供了可以動畫的layer屬性。

保持動畫結束的狀態

當動畫結束的時候, layer會返回初始狀態。 這種行為跟展現layer和模型layer有關系。

在動畫工程中,展示layer的值已經改變,但是layer的數據并沒有改變,所以動畫結束的時候,展示層清除掉,然后原來的圖層就返回到初始位置

可以設置fillMode屬性的值為 kCAFillModeForwards . removedOnCompletion 的為false

 animation.fillMode = kCAFillModeForwards
   animation.removedOnCompletion = false

</div>

這樣動畫結束之后,layer將保持最后的位置。

需要重復重復說明的一點是: 你在屏幕上看到的一切都是展示層的layer. 計入你想嘗試改變layer的position 屬性數據,

另外一種不同尋常的解決辦法是,在執行動畫前,先把最后的結果賦值給layer屬性,然后再執行動畫。例如

// Set the model
  roundedLayer.position.x = 150


  // Perform the animation
  let animation = CABasicAnimation(keyPath: "position.x")
  animation.fromValue = 60
  animation.toValue = 150
  animation.duration = 0.5
  roundedLayer.addAnimation(animation, forKey: "Move")

</div>

關鍵幀動畫

關鍵幀動畫主要可以控制動畫的過程

  • values
  • keyTimes: 0-1的值,按照比例時間

移除動畫

layer 立馬重繪當動畫被移除了。 為了避免layer返回初始狀態,你可以尋找當前的展示層的layer 并且用這個展示層的數據覆蓋掉layer. 例如

func removeColorsAnimation(){
      roundedLayer.backgroundColor =
             roundedLayer.presentationLayer().backgroundColor
      roundedLayer.removeAnimationForKey("Colors")
  }

</div>

五、UI Interactions – Touches and Gestures

UITouch

  • locationInView: 相對于當前視圖的位置
  • previousLocationInView: 前一個點的位置

Responder chain

  • beginIgnoringInteractionEvents: 完全停止應用程序接收觸摸時間消息
  • endIgnoringInteractionEvents: 恢復接收消息
  • </ul> </div>

 本文由用戶 mailwang 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!