为UIView创建自定义init方法以添加UILabel

时间:2014-01-10 23:52:27

标签: ios objective-c uiview ios7 uilabel

目前我有一个自定义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,并使它可以使用autolayout,如下所示:

@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方法。我知道创建和添加标签/约束的代码我只是不确定子类/类别链接和创建自定义init方法。以及如何与autoLayoutView调用一起调用它?

2 个答案:

答案 0 :(得分:0)

如果我从你的问题中得到的是正确的,那么这就是你想要做的事情:

只使用已经创建的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];

并且会将标签添加到自定义视图

希望有所帮助!

答案 1 :(得分:0)

这种方法的问题在于您在通用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;
}