《Learning iOS UI Development》- 读书笔记

mailwang 8年前

来自: 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: 恢复接收消息
</div>