背景:在开发过程中有一个让UILabel无论高度多少,让文字内容始终在顶部。
解决方案:想到的解决方案也有很多,比如:用sizeToFit改变UILabel的高度、尾部强制补齐、UITextField或UITextView来替换UILabel。
对以上方案的分析:觉得以上方案都不是最优,而且比较粗暴,关键扩展性不高比较局限,只满足了文字内容在顶部。如果需求更改为底部对齐呢?
最优方案:重写UILabel的drawInRect方法
.h文件
#import
NS_ASSUME_NONNULL_BEGIN
@interface WlcLable : UILabel
@end
NS_ASSUME_NONNULL_END
.m文件
#import "WlcLable.h"
@implementation WlcLable
- (id)initWithFrame:(CGRect)frame {
return [super initWithFrame:frame];
}
- (CGRect)textRectForBounds:(CGRect)bounds limitedToNumberOfLines:(NSInteger)numberOfLines {
CGRect textRect = [super textRectForBounds:bounds limitedToNumberOfLines:numberOfLines];
//重写CGRect,根据自己的需求自由发挥
//顶部对齐
textRect.origin.y = bounds.origin.y;
//顶部左边距
textRect.origin.x = 10;
textRect.size.width = self.frame.size.width - 10*2;
return textRect;
}
-(void)drawTextInRect:(CGRect)requestedRect {
CGRect actualRect = [self textRectForBounds:requestedRect limitedToNumberOfLines:self.numberOfLines];
[super drawTextInRect:actualRect];
}
@end
方法调用
WlcLable *label = [[WlcLable alloc] init];
label.frame = CGRectMake(10, 100, 300, 300);
label.text = @"顶部对齐,左边留白10像素";
label.numberOfLines = 0;
label.backgroundColor = [UIColor redColor];
[self.view addSubview:label];
运行结果:
Simulator Screen Shot - iPhone SE (2nd generation) - 2020-08-12 at 14.54.49.png