自定义继承UIView的 视图类

转自://www.greatytc.com/p/68b383b129f9
1.要重写UIView的initWithFrame:方法而不是init方法

为什么呢?因为当外部调用init的方法的时候,其内部也会默默地调用initWithFrame:方法,你不能保证别的同事在调用你的类的时候不会直接调用initWithFrame:方法,这时如果你仅重写了init方法,那么两个子控件便无从创建.

于是我们写成这样:

  • (instancetype)initWithFrame:(CGRect)frame {
    if (self = [super initWithFrame:frame]) {
    /* 添加子控件的代码*/
    }
    return self;
    }

2.不要在构造方法里面直接取自身(self,或者说本视图)的宽高,这时候取到的宽高是不准的.

我想初学自定义tableViewCell的小伙伴都遇到过类似这样的问题:
重写cell的初始化方法向cell内添加子控件时
(假设cell的高度设为100,想要添加一个label在cell的底部),

于是这样写:
label.frame = CGRectMake(0,self.frame.size.height - 20, 100, 20),

运行出来却发现添加的label并不在我们期望的位置(底部),
而是在cell比较偏上的位置(实际y的值是44-20而不是100-20).

然后在debug的时候发现:虽然cell的高度已经设定成为100,但在初始化方法里面取到的cell的高度仍然是默认的44.

这其实也是刚才说的原因导致的:我们不能在控件的构造方法里面取其frame或者bounds,这时候取值是不准确的.

所以在重新构造方法的时候,我们只需要把控件放进去,暂时先不用考虑他们在什么位置:

  • (instancetype)initWithFrame:(CGRect)frame {
    if (self = [super initWithFrame:frame]) {
    self.imageView = [[UIImageView alloc]init];
    [self addSubview:self.imageView];

      self.label = [[UILabel alloc]init];
      self.label.textAlignment = NSTextAlignmentCenter;
      [self addSubview:self.label];
    

    }
    return self;
    }

3.在layoutSubViews方法里面布局子控件

如下:

  • (void)layoutSubviews {
    // 一定要调用super的方法
    [super layoutSubviews];

    // 确定子控件的frame(这里得到的self的frame/bounds才是准确的)
    CGFloat width = self.bounds.size.width;
    CGFloat height = self.bounds.size.height;
    self.imageView.frame = CGRectMake(0, 0, width, width);
    self.label.frame = CGRectMake(0, width, width, height - width);
    }
    这里要注意的就是需要在布局之前一定要先调用父类的layoutSubviews方法.

由于在这个方法里可以获取MyView准确的宽和高,我们直接取它的宽高来设置imageView和label的宽高就可以

当然,子控件的创建不一定要写在MyView的构造方法里面,既然声明成为属性,使用懒加载(重写属性的get方法)也是一个不错的选择.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 在项目之前,最好下载该App或者GitHub源码跑一下看一下效果,该项目旨在练习UI及网络数据的处理,推荐初学者边...
    si1ence阅读 3,377评论 13 35
  • 1.badgeVaule气泡提示 2.git终端命令方法> pwd查看全部 >cd>ls >之后桌面找到文件夹内容...
    i得深刻方得S阅读 4,797评论 1 9
  • UIWindow 初始化: self.window= [[UIWindowalloc]initWithFrame:...
    Sunny_Fight阅读 1,057评论 0 1
  • *7月8日上午 N:Block :跟一个函数块差不多,会对里面所有的内容的引用计数+1,想要解决就用__block...
    炙冰阅读 2,556评论 1 14
  • 野火戳不中树叶的经络 晓春飞得了芬香的骨朵 松针树立了阳光的钟 指针游走了白鸽的烟 滴答滴答,雕刻着闪电 愤怒的石...
    上单满路抓阅读 245评论 0 2