《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()
这些自动的行为是core graphics 的实现,CAAction的协议,允许layer改变之后自动触发这些行为。
属性动画
隐式动画可以用几行代码很快有效的解决动画,但是复杂的自定义动画他们没办法完成
CAAnimation 是一个动画的抽象类,提供了可以动画的layer属性。
保持动画结束的状态
当动画结束的时候, layer会返回初始状态。 这种行为跟展现layer和模型layer有关系。
在动画工程中,展示layer的值已经改变,但是layer的数据并没有改变,所以动画结束的时候,展示层清除掉,然后原来的图层就返回到初始位置
可以设置fillMode属性的值为 kCAFillModeForwards . removedOnCompletion 的为false
animation.fillMode = kCAFillModeForwards animation.removedOnCompletion = false
这样动画结束之后,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")
关键帧动画
关键帧动画主要可以控制动画的过程
- values
- keyTimes: 0-1的值,按照比例时间
移除动画
layer 立马重绘当动画被移除了。 为了避免layer返回初始状态,你可以寻找当前的展示层的layer 并且用这个展示层的数据覆盖掉layer. 例如
func removeColorsAnimation(){ roundedLayer.backgroundColor = roundedLayer.presentationLayer().backgroundColor roundedLayer.removeAnimationForKey("Colors") }
五、UI Interactions – Touches and Gestures
UITouch
- locationInView: 相对于当前视图的位置
- previousLocationInView: 前一个点的位置
Responder chain
- beginIgnoringInteractionEvents: 完全停止应用程序接收触摸时间消息
- endIgnoringInteractionEvents: 恢复接收消息