记录一些 iOS 开发中的小 tip。
-
origin 为负,子视图右下移动,origin 为正,子视图左上移动,contentOffset 同理。
-
velocity 为正,为向左/上滑动,velocity 为负,为向右/下滑动。
-
contentInset 会影响 contentOffset 的变化范围,top/left 影响 contentOffset 的初始值,但并不会改变 contentSize 的值。
-
layer 的 mask 的颜色不重要,重要的是颜色的透明度,不透明,即 alpha = 1 时,则 layer 部分可以被显示出来。
-
常用的几个函数:abs 绝对值,floor 向下取整,ceil 向上取整,round 四舍五入,sqrt 平方根。
-
数组一定记得要初始化。
-
手势的 translationInView 是手势开始后移动的总量,而不是上一次调用到这一次调用的 delta 值,常常为了得到这个 delta 值,在获取到 translation 后调用 setTranslation:CGPointZero。
-
存入 NSUserDefaults 的数组时并不会记录是否是可变的,取出来的时候必须转换;存入 NSUserDefaults 里的字典中的键必须为 NSString,而值也只能为 plist 接受的值。
-
layoutSubviews 什么时候会被调用?1. 添加或移除子视图时,2. bounds 变化时(包括 origin 和 size),3. 约束(自己和子视图的)变化时,4. 主动调用 setNeedsLayout 和 layoutIfNeeded 时。
-
调用 dequeueReusableCell(withIdentifier:for:) 之前需要注册 cell,且该方法一定返回可用的 cell;dequeueReusableCell(withIdentifier:) 可以不注册 cell,但是可能会返回 nil,需要自己创建 cell。
-
直接改变 tableHeaderView 的 frame 不会生效,必须对 tableView.tableHeaderView 重新赋值才可以。
-
在 iOS 中,layer 的动画在完成后默认是移除的,也就是说 layer 并不会保持动画结束的状态,这个行为可以用 isRemovedOnCompletion 来控制,默认为 true。所以排除这个影响,我们要在 false 的时候来讨论 CAAnimation 的 fillMode,fillMode 默认是 removed,也就是完成动画后回到最初的状态;forward 是完成动画后保持动画结束时的状态;backward 是在动画 delay 的过程中就设置为动画开始的状态而动画结束之后回到最初的状态;both 就是将 forward 和 backward 结合起来。
在 iOS 11 以下无法通过 auto layout 和子视图的约束来自动得到 size,所以最好的做法是固定一个大小,加上一个 contentView,其他的子视图添加到 contentView 上,来实现居中效果。可以通过子视图来确定大小,系统自动居中布局,但是要注意的是,iOS 11 以下需要将 translatesAutoresizingMaskIntoConstraints 设为 false 才行。