小伙伴们在开发时可能经常遇到这样的需求
里面的内容是不固定的,四周都有间距,遇到这样的需求先不要急着用view嵌套再计算内容宽高来处理,有些麻烦了,下面说下思路
如果单单用label来处理的话不能用分类,只能自定义label解决,因为需要重绘label的内容区域,这里需要用到两个方法
1.- (CGRect)textRectForBounds:(CGRect)bounds limitedToNumberOfLines:(NSInteger)numberOfLines
2.- (void)drawTextInRect:(CGRect)rect
在自定义的label里面重写这两个方法,下面详细讲解一下这两个方法的作用:
1.该方法传进来的bounds不用理会,如果你硬要了解可以输出一下,是3.xxxxxx很长一串,不清楚系统做了什么处理,在该方法里重新调用这个方法使用cgrect接收一下
这个rect是label的内容区域,你可以改变这个rect 然后返回,就相当于改变了内容的位置和大小。 到这里第一个方法完毕,这个方法返回了内容的区域,那么如何调用它呢,两种办法
第一种:
sizeToFit或者sizeThatFits 这两个方法写上会重走上面第一个方法,但是这样调用并没有什么卵用,下面就该用到上面第二个方法了。
第二种:
- (void)drawTextInRect:(CGRect)rect {
CGRect Rect = [self textRectForBounds:rect limitedToNumberOfLines:self.numberOfLines];
[super drawTextInRect:Rect];
}
介绍一下第二种方法,它相当于重绘label的编辑区域,把它呈现在画布上,相当于上面第一种方法的应用。
使用例子:
调用的话sizeToFit和sizeThatFits这两个方法可以不用写,因为drawTextInrect这个方法系统会调用,那么就肯定会调用textRectForBounds这个方法啦,下面我再说一下什么时候用sizeToFit这个方法
说完啦!
可能有点罗嗦了,这里面心得体会真的很多,有想法的朋友可以评论下方交流,大家一起进步。
网友评论