A原理/底层

iOS控制器加载底层原理和UI初始化的过程

2017-08-28  本文已影响62人  找不到工作的iOS

控制器加载底层原理

1.有xib文件的控制器加载

- 1. [init]
- 2. [initWithNibName: bundle:]
- 3. [viewDidLoad]
- 4. [viewWillAppear:]
- 5. [viewDidAppear:]

2.无xib文件的控制器加载

- 1. [loadView] //有xib获取xib的view,没有自己生成
- 2. [viewDidLoad]
- 3. [viewWillAppear]
- 4. [viewWillLayoutSubviews]
- 5. [viewDidLayoutSubviews:]
- 6. [viewDidAppear:]
- (UIView *)view {
      if(!_view) {
        [self loadView];
       //如果这里没有对self.view初始化,就会一直循环
        [self viewDidLoad];
      }
      return _view;
}

3.实战应用 - 拆分Controller

- (void)loadView {    
    //[super loadView]; //系统的
    self.view = [CustomView new]; //自己的 (给控制器自己定义的)    
}

4.探究xib文件屏幕尺寸设置在运行时的影响

- (void)viewDidLoad {
    [super viewDidLoad];
    
    self.view.backgroundColor = [UIColor blueColor];
    //断点处,po self.view
}

UI初始化的过程

1.无xib的UIView加载

1.[init]
2.[initWithFrame:]
3.[layoutSubview] 

2.有xib的UIView加载

1.[initWithCoder]
2.[awakeFromNib:]
3.[layoutSubview] //只要addSubView都会执行

3.运行时的布局成型时机之[layoutSubview]

4.[layoutSubview]实战运用

#import "CustomButton.h"

@implementation CustomButton

- (void)layoutSubviews {
    self.titleLabel.frame = CGRectMake(<#CGFloat x#>, <#CGFloat y#>, <#CGFloat width#>, <#CGFloat height#>);
    self.imageView.frame = CGRectMake(<#CGFloat x#>, <#CGFloat y#>, <#CGFloat width#>, <#CGFloat height#>);    
}

@end

-[tableView reload]由于具有一定的延迟,如果我们要立刻获取某个cell的准确布局位置,那么可以

[tableView reload];
[self setNeedsLayout];
[self layoutIfNeeded];

5.[darwRect:]

- (void)drawRect:(CGRect)rect {
   
//系统底层的执行思想 
    CGContextRef contextRef; //获取当前CALayer的上下文,实际不能这样操作,只是一个示意
    UIGraphicsPushContext(contextRef); //push到top of stack
    UIGraphicsPopContext(); //从top of stack移除,并且把current context恢复为上一个context
    
}

6.视图可视化操作

#import <UIKit/UIKit.h>

IB_DESIGNABLE

@interface CustomView : UIView

@end
#import <UIKit/UIKit.h>

IB_DESIGNABLE

@interface CustomView : UIView
@property (nonatomic,strong)IBInspectable UIColor *strokeColor;
@end
#import "CustomView.h"

@implementation CustomView

- (void)drawRect:(CGRect)rect {
    [self.strokeColor setStroke];
}

@end
上一篇下一篇

猜你喜欢

热点阅读