2021-03-10

VC生命周期
- (instancetype)init{
    if (self = [super init]) {
        NSLog(@"1.init初始化");
    }
    return self;
}
//当时xib加载时
- (void)awakeFromNib{
    [super awakeFromNib];
    NSLog(@"2.Nib加载成功");
}
- (void)loadView{
    [super loadView];
    NSLog(@"3.加载view。");
}
- (void)viewDidLoad {
    [super viewDidLoad];
    NSLog(@"4.载入完成,可以进行自定义数据以及动态创建其他控件");
}
- (void)viewWillAppear:(BOOL)animated{
    [super viewWillAppear:animated];
    NSLog(@"5.视图将出现在屏幕之前");
}
- (void)viewWillLayoutSubviews{
    [super viewWillLayoutSubviews];
    NSLog(@"6.将要对子视图进行调整");
}
- (void)viewDidLayoutSubviews{
    [super viewDidLayoutSubviews];
    NSLog(@"7.对子视图进行调整完毕");
}
- (void)viewDidAppear:(BOOL)animated{
    [super viewDidAppear:animated];
    NSLog(@"8.视图已在屏幕上渲染完成");
}
- (void)viewWillDisappear:(BOOL)animated{
    [super viewWillDisappear:animated];
    NSLog(@"9.视图将被从屏幕上移除");
}
- (void)viewDidDisappear:(BOOL)animated{
    [super viewDidDisappear:animated];
    NSLog(@"10.视图已经被从屏幕上移除");
}
- (void)dealloc{
    NSLog(@"11.视图被销毁,此处需要对你在init和viewDidLoad中创建的对象进行释放");
}
- (void)didReceiveMemoryWarning{
    [super didReceiveMemoryWarning];
    NSLog(@"12.内存警告");
}

A push B 生命周期变化过程
B viewDidLoad
A viewWillDisappear
B viewWillAppear
B viewWillLayoutSubViews
B viewDidLayoutSubviews
A viewDidDisappear
B viewDidAppear

B pop A. 此时layout
B viewWillDisappear
A viewWillAppear
A viewWillLayoutSubViews
A viewDidLayoutSubviews
B viewDidDisappear
A viewDidAppear

UIView 的frame,bounds,center
  • frame: 描述当前界面元素在其父界面元素中的位置和大小。
  • bounds: 描述当前界面元素在其自身坐标系统中的位置和大小。
  • center: 描述当前界面元素的中心点在其父界面元素中的位置.
如何处理UITableVier 中Cell 动态计算高度的问题,都有哪些方案
  • 你的Cell要使用AutoLayout来布局约束这是必须的;设置tableview的estimatedRowHeight为一个非零值,这个属性是设置一个预估的高度值,不用太精确。 设置tableview的rowHeight属性为UITableViewAutomaticDimension
  • 第三方 UITableView+FDTemplateLayoutCell(计算布局高度缓存的)
  • 手动计算每个控件的高度并相加,最后缓存高度
高效的实现控件的圆角效果
- (UIImage *)imageWithCornerRadius:(CGFloat)radius {
        CGRect rect = (CGRect){0.f, 0.f, self.size};
        UIGraphicsBeginImageContextWithOptions(self.size, NO, UIScreen.mainScreen.scale);
        CGContextAddPath(UIGraphicsGetCurrentContext(), [UIBezierPath bezierPathWithRoundedRect:rect cornerRadius:radius].CGPath);
        CGContextClip(UIGraphicsGetCurrentContext());
        [self drawInRect:rect];
        UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
        return image;
    }

//或
UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:self.bounds byRoundingCorners:UIRectCornerAllCorners cornerRadii:self.bounds.size];
    CAShapeLayer *maskLayer = [[CAShapeLayer alloc]init];
    maskLayer.frame = self.bounds;
    maskLayer.path = maskPath.CGPath;
    self.layer.mask = maskLayer;
CALayer如何添加点击事件

通过 touchesBegan: withEvent 方法,监听屏幕点击事件,在这个方法中通过 convertPoint 找到点击位置,进行判断,如果点击了 layer 视图内坐标,就触发点击事件
通过 hitTest方法找到包含坐标系的 layer 视图

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
//  方法一,通过 convertPoint 转为为 layer 坐标系进行判断
    CGPoint point = [[touches anyObject]   locationInView:self.view];
    CGPoint redPoint = [self.redLayer  convertPoint:point fromLayer:self.view.layer];
    if ([self.redLayer containsPoint:redPoint]) {
    NSLog(@"点击了calayer");
    }
//  方法二 通过 hitTest 返回包含坐标系的 layer 视图
    CGPoint point1 = [[touches anyObject] locationInView:self.view];
    CALayer *layer = [self.view.layer hitTest:point1];
    if (layer == self.redLayer) {
       NSLog(@"点击了calayer");
    }
}
请简述 UITableViewCell的复用机制
  • 每次创建 cell 的时候通过 dequeueReusableCellWithIdentifier:方法创建 cell,它先到 缓存池中找指定标识的 cell,如果没有就直接返回 nil
  • 如果没有找到指定标识的 cell,那么会通过 initWithStyle:reuseIdentifier:创建一个 cell
  • 当 cell 离开界面就会被放到缓存池中,以供下次复用

参考: 面试整理

你可能感兴趣的:(2021-03-10)