跳至主要內容

UIKit

naijoug大约 2 分钟

UIView

  • UIView vs CALayer

    类型说明
    UIView用户交互,UIView = CALayer.delegate
    CALayer图像和动画的渲染
  • 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;
    
  • layout vs display

    概念标记函数自动调用函数功能说明
    layout (布局)setNeedsLayoutlayoutSubViews将元素位置进行重新排列布局
    display (绘图)setNeedsDisplaydrawRect:将元素绘制显示出来
  • setNeedsDisplay vs layoutIfNeeded

    方法说明
    setNeedsDisplay给视图添加标记,需要重新布局
    layoutIfNeeded检查是否有视图被标记,有标记立即刷新布局
  • xib vs storyboard

    • xib 加载流程

      initWithCoder: -> awakeAfterUsingCoder: -> awakeFromNib

    • Segue : 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 & Responder

    First responder : 第一响应者

    Responder Chain : 响应者链 UIView -> UIViewController -> SuperView -> ... -> TopView -> Window -> UIApplication -> 丢弃

    核心方法说明
    hitTest: withEvent:寻找并返回最合适的 view
    pointInside: withEvent:判断点是否在当前 view 中

UIViewController

  • UIViewController lifecycle 生命周期 viewDidLoad 加载时机

    现象 - 在初始化设置控制器参数时,如果进行 UI 设置,会触发 viewDidLoad,此时还未进行 push 跳转

  • 控制器 View 创建流程

    1. 如果 nibName 有值,就会加载对应的 xib 文件来创建 view
    2. 如果 nibName 没有值
      • 2.1> 优先加载同名 View.xib 文件来创建 view
      • 2.2> 再加载同名 ViewController.xib 文件来创建 view
      • 2.3> 如果没有找到上面所述的 xib 文件,就会用代码创建一个透明的 view
  • initWithCoder: vs initWithNibName: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];