如何在 ios 中制作自定义 UILabel

How to make Custom UILabel in ios

在我的项目中有大量 UIlabel。我为 UILabel 创建了一个单独的自定义 class 并且我在 class.

中设置了所有标签的属性

这里我的主要要求是一些标签的颜色是白色,一些标签的文本颜色是黑色,但颜色不适用。

CustomUILabel class:-

#import "CustomLabel.h"

@implementation CustomLabel

-(void)layoutSubviews{

    [self setupUI];
}

- (void)setupUI {

    [self setTextAlignment:NSTextAlignmentLeft];
    [self setFont:[UIFont fontWithName:@"Futura" size:14.0]];
    [self setBackgroundColor:[UIColor clearColor]];
    [self setTextColor:[UIColor blackColor]];
}

@end

主要class:-

#import "MainViewController.h"

@interface MainViewController (){

}

@end

@implementation MainViewController
@synthesize label1,label2;


- (void)viewDidLoad {
    [super viewDidLoad];

     label1.textColor = [UIColor whiteColor];
     label2.textColor = [UIColor blackColor];
}

问题出在您的 layoutSubview 方法和 setupUI 方法上。

layoutSubviews 不是调用 setupUI 的正确位置。 layoutSubviews 可以被调用多次,并且很可能在 viewDidLoad 被调用之后被调用几次,这就是颜色被重置回黑色的原因。

并且始终在您的 layoutSubviews 方法中调用 [super layoutSubviews];

调用您的 setupUI 方法的更好的地方是从一个或多个适当的 init... 方法以及可能的 awakeFromNib.

当您覆盖 layoutSubviews 时,您必须调用 [super layoutSubviews]。但这不是你的问题。问题是您在 layoutSubviews 中调用 setupUI,而您不应该这样做。布局发生在 viewDidLoad 之后,因此当 setupUI 运行时,您在 viewDidLoad 中设置颜色的尝试将在稍后的布局期间被覆盖。

您应该从子类的初始化方法中调用 setupUI

- (instancetype)initWithFrame:(CGRect)frame {
    if (self = [super initWithFrame:frame]) {
        [self setupUI];
    }
    return self;
}

- (instancetype)initWithCoder:(NSCoder *)aDecoder {
    if (self = [super initWithCoder:aDecoder]) {
        [self setupUI];
    }
    return self;
}

而且您根本不应该在 CustomLabel 中覆盖 layoutSubviews