You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 03:44:01