《Learning iOS UI Development》- 讀書筆記
來自: 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>