IOS面试题(UIView) ----- UIView相关

OC面试题目合集地址

问题1: 请说一下UIView和CALayer有什么关系

图示

UIView里面有个layer属性, 其实指向的就是CALayer类型。实际上UIView的显示部分是由CALayercontents决定的(绘图部分)。例如: UIview的background显示, 其实就是CALayer中contents中backing store显示的位图

  • UIView: 为其提供内容, 处理触摸等事件, 参与响应链
  • CALayer: 负责显示内容contents

接下来我们看一下开辟内存情况

#import 
#import 

   UIView *v1 = [[UIView alloc] init];
   CALayer *c1 = [[CALayer alloc] init];
    

    NSLog(@"v1对象实际需要的内存大小: %zd", class_getInstanceSize([v1 class]));
    NSLog(@"v1对象实际分配的内存大小: %zd", malloc_size((__bridge const void *)(v1)));
    NSLog(@"c1对象实际需要的内存大小: %zd", class_getInstanceSize([c1 class]));
    NSLog(@"c1对象实际分配的内存大小: %zd", malloc_size((__bridge const void *)(c1)));
开辟大小

可看出CALayer的轻量级要比UIView小很多

我们再看2个例子

Label 例子
Image 例子

也可以看出CALayer量级要小很多, 所以一般的展示, 不涉及响应链情况, 可以用CALayer来代替UIView 已达到减少内存目的



问题2: 请说一下 frame, bounds和center

  • frame: 当前视图相对于父视图平面坐标系统中位置和大小
  • bounds: 当前视图相对于自己平面坐标系统位置和大小
  • center: 设置视图中心点坐标, 本质是CGPoint



问题3: 父视图坐标改变, 子视图 frame, bounds, center 怎么变化

    UIView *bv = [[UIView alloc] initWithFrame:CGRectMake(50, 100, 300, 300)];
    bv.backgroundColor = UIColor.blackColor;
    [self.view addSubview: bv];
    self.bv = bv;
    
    UIView *v1 = [[UIView alloc] initWithFrame:CGRectMake(50, 50, 100, 100)];
    v1.backgroundColor = UIColor.redColor;
    [bv addSubview: v1];

    UIView *v2 = [[UIView alloc] init];
    v2.bounds = CGRectMake(0, 0, 70, 70);
    v2.backgroundColor = UIColor.yellowColor;
    [bv addSubview: v2];
    
    UIView *v3 = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 50, 50)];
    v3.center = CGPointMake(150, 150);
    v3.backgroundColor = UIColor.brownColor;
    [bv addSubview: v3];
    
    UIButton *btn = [UIButton buttonWithType: UIButtonTypeCustom];
    btn.frame = CGRectMake(kSCREEN_WIDTH/2 - 100, kSCREEN_HEIGHT - 70, 200, 50);
    [btn setBackgroundColor:[UIColor blueColor]];
    [btn setTitleColor:[UIColor whiteColor] forState: UIControlStateNormal];
    [btn setTitle:@"点击变换" forState: UIControlStateNormal];
    btn.layer.masksToBounds = YES;
    btn.layer.cornerRadius = 10;
    [self.view addSubview:btn];
    [btn addTarget:self action:@selector(changeframe) forControlEvents: UIControlEventTouchUpInside];


- (void)changeframe {
    
    self.bv.frame = CGRectMake(50, 400, 300, 300);
}
例子

可以看出点击按钮, 父视图坐标变换的情况下, 子视图都随着父视图坐标改变而改变

你可能感兴趣的:(IOS面试题(UIView) ----- UIView相关)