能否在CGPoint子类内部完成自身设置?如何简化NewLabel重复创建代码?
解决方案
首先先明确一个关键细节:CGPoint是C语言结构体,并非Objective-C对象,所以你没法创建它的子类,自然也不存在“在CGPoint子类内部设置自身”的操作。如果需要封装点相关的逻辑,可以考虑写一个NSObject子类持有CGPoint属性,或者用C函数处理,但这对你当前的NewLabel场景来说完全没必要。
回到你的核心需求:精简每个UIViewController中创建NewLabel的重复代码,我们可以把重复的初始化、布局、添加到父视图的逻辑全部封装到NewLabel子类内部,具体有几种实用的实现方式:
方式一:自定义初始化方法
给NewLabel添加一个带参数的初始化方法,把尺寸和父视图传进去,内部一次性完成所有布局和添加操作:
NewLabel.h 声明方法
@interface NewLabel : UILabel // 传入尺寸和父视图,直接创建并添加到父视图的居中位置 - (instancetype)initWithSize:(CGSize)size centerInView:(UIView *)superview; @end
NewLabel.m 实现方法
@implementation NewLabel - (instancetype)initWithSize:(CGSize)size centerInView:(UIView *)superview { if (self = [super initWithFrame:CGRectMake(0, 0, size.width, size.height)]) { // 这里可以统一设置NewLabel的通用样式,不用每个VC重复写 self.textAlignment = NSTextAlignmentCenter; self.font = [UIFont systemFontOfSize:15]; self.backgroundColor = [UIColor lightGrayColor]; // 计算并设置中心位置 self.center = CGPointMake(superview.bounds.size.width / 2.0, superview.bounds.size.height / 2.0); // 直接添加到父视图 [superview addSubview:self]; } return self; } @end
在UIViewController中使用
现在只需要一行代码就能完成所有操作:
NewLabel *label = [[NewLabel alloc] initWithSize:CGSizeMake(120.0f, 40.0f) centerInView:self.view]; // 后续只需要设置label的text等个性化内容即可 label.text = @"Hello World";
方式二:类方法简化调用
如果觉得alloc init的写法繁琐,可以再封装一个类方法,让调用更简洁:
在NewLabel.h中添加类方法
+ (instancetype)labelWithSize:(CGSize)size centerInView:(UIView *)superview;
在NewLabel.m中实现
+ (instancetype)labelWithSize:(CGSize)size centerInView:(UIView *)superview { return [[self alloc] initWithSize:size centerInView:superview]; }
VC中使用示例
NewLabel *label = [NewLabel labelWithSize:CGSizeMake(120.0f, 40.0f) centerInView:self.view]; label.text = @"Hello World";
方式三:固定尺寸的极简版
如果你的NewLabel尺寸是固定的(比如例子里的120x40),可以再封装一个不需要传size的初始化方法:
// 在NewLabel.h中声明 - (instancetype)initCenterInView:(UIView *)superview; // 在NewLabel.m中实现 - (instancetype)initCenterInView:(UIView *)superview { return [self initWithSize:CGSizeMake(120.0f, 40.0f) centerInView:superview]; }
VC中调用
NewLabel *label = [[NewLabel alloc] initCenterInView:self.view]; label.text = @"Hello World";
这种封装的好处不仅是减少重复代码,还能把NewLabel的通用样式统一管理——后续如果要修改字体、背景色,只需要在NewLabel类里改一次,所有VC里的实例都会自动生效,维护起来非常方便。
内容的提问来源于stack exchange,提问作者markl
相关产品推荐
相关产品推荐

