构建由其他UIViews组成的UIButton的正确方法是什么?

时间:2013-04-11 04:03:47

标签: ios uiview uibutton

我正在尝试创建一个自定义的UIButton。它有一个(变化的)图像,一些信息文本,当然还有更标准的东西,如标题等。我正在使用界面构建器和故事板来完成我的应用程序中的大部分设计工作。

构建这样的自定义UIButton的最佳做法是什么?

我决定不进行子类化,然后只是接管绘图,因为按钮可以用更标准的元素构建。

相反,我尝试了子类化UIButton并构建和添加子视图,如UIImageView,UILabel等。这看起来效果很好有一个例外,我不确定何时定位所有内容因为未在awakeFromNib中设置边界并且从不调用initWithFrame。最后,我添加了另一个我的UIViewController在viewDidAppear中调用的方法。

然后我意识到也许我可以在UIViewController中的viewDidLoad或viewDidAppear中构建按钮而不进行子类化,但我再次注意到按钮上的边界尚未可用。

哪个最好:

  1. 子类化和绘制所有内容
  2. 按其他UIViews的组成进行子类化和构建
  3. 在外部视图中构建按钮
  4. 其他一些方法......?
  5. 此外,似乎框架中的所有内容都与父母使用自动布局时手动布局子视图密谋,所以我认为必须有更好的方法。

2 个答案:

答案 0 :(得分:1)

创建一个单独的UIView类并将所有按钮放入其中。
然后将该视图子类化到您的视图控制器。

像:

1)使用您的按钮创建一个视图,并将该视图作为类名提供给您的自定义.xib以及视图。

即。我正在使用名为“MultipleChoiceLayout”的按钮创建一个自定义视图    - MultipleChoiceLayout.h
   - MultipleChoiceLayout.m
   - MultipleChoiceLayout.xib

我将MultipleChoiceLayout定义为File的所有者,也定义到自定义视图 enter image description here

2)将此自定义视图添加到父视图

    NSArray *array = [[NSBundle mainBundle] loadNibNamed:@"MultiChoiceLayout" owner:self options:nil];

    MultiChoiceLayout *multipleChoiceLayout = [[MultipleChoiceLayout alloc] initWithArray:array];

   [ParentView addSubview:multipleChoiceLayout];

了解我如何在父视图中初始化自定义视图。

我将数组传递给“MultipleChoiceLayout”类,在multichoicelayout类中我定义了self。

-(id)initWithArray:(NSArray*)array
   {
    self = [array objectAtIndex:0];
    if(self) {

     }
    return self;
}
  • 现在发生的事情是您将自定义视图对象从父级传递到自定义视图,方法是从父级传递自身(请参阅上面的代码段)。现在,无论何时单击按钮,它都会自动调用您在自定义视图中定义的方法。你不必保留任何东西

希望这会有所帮助。

答案 1 :(得分:1)

有一些常见的做法可以像这样构建自定义控件。在您的情况下,UIControl的子类将为您提供比标准UIView更多的灵活性,因此您不必为按钮交互创建自定义手势。子类化UIButton总是会让我感到头疼。

另一个答案显示,在单独的xib中创建控件也是可重用性的好主意。通常,让你的UIControl子类设置它的组件(UIImageView等),而不是让视图控制器处理它。在这种情况下,如果从xib加载,控件将收到initWithCoder:之类的消息,以便您可以正确设置子视图。

至于使用自动布局,如果应用程序的其余部分使用它,那么您的自定义控件也应该使用它。永远不要混合自动布局和手动设置框架,事情会破裂!

希望这能回答你的一些问题。