UIKit
大约 2 分钟
UIView
UIViewvsCALayer类型 说明 UIView 用户交互, UIView = CALayer.delegateCALayer 图像和动画的渲染 bounds&frame&anchorPoint&position类型 说明 bounds相对于自身控件 frame相对于父控件 anchorPoint锚点; 范围 : 0.0 (layer 左上角) ~ 1.0 (layer 右下角); 默认为 : (0.5, 0.5) positionlayer 中的 anchorPoint 点在 superLayer 中的位置坐标 // frame、position 与 anchorPoint 的关系 frame.origin.x = position.x - anchorPoint.x * bounds.size.width; frame.origin.y = position.y - anchorPoint.y * bounds.size.height;layoutvsdisplay概念 标记函数 自动调用函数 功能说明 layout (布局) setNeedsLayoutlayoutSubViews将元素位置进行重新排列布局 display (绘图) setNeedsDisplaydrawRect:将元素绘制显示出来 setNeedsDisplayvslayoutIfNeeded方法 说明 setNeedsDisplay给视图添加标记,需要重新布局 layoutIfNeeded检查是否有视图被标记,有标记立即刷新布局 xibvsstoryboardxib加载流程initWithCoder:->awakeAfterUsingCoder:->awakeFromNibSegue:storyboard用来界面跳转的线,是一个UIStoryboardSegue对象
类型 说明 xib轻量级,描述局部的 UI 界面 storyboard重量级,描述整个软件的页面关系 // xib 文件的加载 // 1> 直接从 bundle 中加载 xib 并创建 NSArray *objs = [[NSBundle mainBundle] loadNibNamed:@"CustomerView" owner: nil options: nil]; // 2> 先加载 xib 再实例化 UINib *nib = [UINib nibWithNibName:@"CustomerView" bundle:[NSBundle mainBundle]]; NSArray *objs = [nib instantiateWithOwner: nil options: nil];Touch&Event&ResponderFirst responder: 第一响应者Responder Chain: 响应者链UIView -> UIViewController -> SuperView -> ... -> TopView -> Window -> UIApplication -> 丢弃核心方法 说明 hitTest: withEvent:寻找并返回最合适的 view pointInside: withEvent:判断点是否在当前 view 中
UIViewController
UIViewController lifecycle 生命周期
viewDidLoad加载时机现象 - 在初始化设置控制器参数时,如果进行 UI 设置,会触发
viewDidLoad,此时还未进行 push 跳转控制器 View 创建流程
- 如果 nibName 有值,就会加载对应的 xib 文件来创建 view
- 如果 nibName 没有值
- 2.1> 优先加载同名
View.xib文件来创建 view - 2.2> 再加载同名
ViewController.xib文件来创建 view - 2.3> 如果没有找到上面所述的 xib 文件,就会用代码创建一个透明的 view
- 2.1> 优先加载同名
initWithCoder:vsinitWithNibName:bundle:// 创建一个控制器的三种方法 // 1. 通过 storyboard 创建 UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle: nil]; // 创建 storyboard 中的初始化控制器(箭头所指的控制器) ViewController *vc = [storyboard instantiateInitialViewController]; // 通过一个标识初始化对应的控制器 ViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"id"]; // 2. 直接创建 ViewController *vc = [[ViewController alloc] init]; // 3. 指定 xib 文件来创建 ViewController *vc = [[ViewController alloc] initWithNibName:@"ViewController" bundle: nil]; // 改变导航控制器的默认 push 动画效果 // 定义转场动画 CATransition* transition = [CATransition animation]; transition.type = kCATransitionMoveIn; transition.subtype = kCATransitionFromTop; transition.duration = 0.3; // 修改导航控制器转场动画 [self.navigationController.view.layer addAnimation:transition forKey:kCATransition];