为 UIView 创建自定义初始化方法以添加 UILabel

Posted

技术标签:

【中文标题】为 UIView 创建自定义初始化方法以添加 UILabel【英文标题】:Creating custom init method for UIView to add a UILabel 【发布时间】:2014-01-10 23:52:26 【问题描述】:

目前我有一个自定义 UIView 类,它完成了以下操作:

- (id)initWithFrame:(CGRect)frame

    self = [super initWithFrame:frame];
    if (self) 
        // Initialization code
        [self setupView];
    
    return self;

-(void)setupView 
    self.layer.cornerRadius = 4;
    self.layer.masksToBounds= YES;
    self.backgroundColor = [UIColor whiteColor];
    self.layer.borderWidth = 1;
    self.layer.borderColor = [UIColor lightGrayColor].CGColor;

我还有另一个 UIView 类别,它创建一个新的 UIView 并制作它,以便我可以使用以下自动布局:

@implementation UIView (Autolayout)
+(id)autolayoutView

    UIView *view = [self new];
    view.translatesAutoresizingMaskIntoConstraints = NO;
    return view;

两者都相当简单。我现在想做的是为 UIView 创建一个自定义的 init 方法。

问题 我希望使用自定义 init 方法来创建 UILabel 并将其添加到 UIView。但是,我希望 init 方法使用我已经创建的 UIView 类别?我相信这很简单,只是不知道如何完成?

编辑 目前要创建自定义自动布局视图我调用UIView *myView = [MyCustomViewClass autoLayoutView] 我想做的是更新自定义视图类的 init 方法以创建标签,但仍然以相同的方式调用它,以便使用类别并且我也调用了自动布局信息。

编辑 2 真正有用的是如果我可以传入一个参数来确定UIView 是否应该有UILabel。因此,如果视图应该有标签,则可以调用自定义的 init 方法。我知道创建和添加标签/约束的代码我只是不确定子类/类别链接和创建自定义初始化方法。以及如何与autoLayoutView 调用一起调用?

【问题讨论】:

有点不清楚,您是想从类别中添加标签还是从 init 方法添加标签?你是想从 UIView 类中还是从另一个 Controller 或其他东西中调用类别? @Eric - 我添加了一个编辑,希望能阐明我想要实现的目标。我确信它很简单,但我想完全理解这种方法。 还添加了进一步的编辑来解释我在这里的理解困难和困惑。谢谢 【参考方案1】:

这种方法的问题是您使用通用 UIView 上的类别来创建带有UIView *myView = [MyCustomViewClass autoLayoutView] 的 UIView。

由于它是 UIView 而不是您创建的自定义子类,因此它不会引用您创建的任何自定义 init 方法。所以一种解决方案是......为什么不将所有自定义添加到类别中?

+(id)autolayoutViewWithCustomization:(BOOL)customize addLabel:(BOOL)addLabel

    UIView *view = [self new];
    view.translatesAutoresizingMaskIntoConstraints = NO;

    if (customize) 
       view.layer.cornerRadius = 4;
       view.layer.masksToBounds= YES;
       view.backgroundColor = [UIColor whiteColor];
       view.layer.borderWidth = 1;
       view.layer.borderColor = [UIColor lightGrayColor].CGColor;
    

    if (addLabel) 
       // Create a label here
       [self addSubview:label];
    

    return view;

【讨论】:

【参考方案2】:

如果我从您的问题中得到的信息是正确的,那么这就是您想要做的:

只需使用您已经创建的 init 方法,并在其上添加更多内容。

 +(id)autolayoutViewWithAddedLabel:(BOOL)addedLabel
   
     UIView *view = [self new];
     view.translatesAutoresizingMaskIntoConstraints = NO;

     if(addedLabel) 
        // do your label stuff here
        [self addSubview://label];
     
     return view;
 

那么如果你想调用这个方法,你可以像你对​​问题中的方法所做的那样说

  MyClass *mc = [MyClass autolayoutViewWithAddedLabel:YES];

这会将标签添加到您的自定义视图中

希望有帮助!

【讨论】:

以上是关于为 UIView 创建自定义初始化方法以添加 UILabel的主要内容,如果未能解决你的问题,请参考以下文章

自定义 UIView 子类添加 nib 子视图

为UIView自定义Xib

重用复杂的自定义UI元素 - Xcode Storyboard

使用参数创建自定义 UIView 初始化方法

在 xib 中以编程方式自定义 UIView

自定义 UIView(.xib) 在 UITableViewCell 中添加为子视图后自动更改框架