0

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

像这样构建自定义 UIButton 的最佳实践是什么?

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

相反,我尝试继承 UIButton 并构建和添加子视图,如 UIImageView、UILabel 等。这似乎很好用,但有一个例外,我不确定何时定位所有内容,因为边界未在 awakeFromNib 中设置,并且从未调用 initWithFrame。最后,我添加了我的 UIViewController 在 vi​​ewDidAppear 中调用的另一个方法。

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

那么哪个是最好的:

  1. 子类化和绘制一切
  2. 通过组合其他 UIView 进行子类化和构建
  3. 在外部视图中构建按钮
  4. 还有什么方法……?

此外,当父母使用自动布局时,似乎框架中的所有内容都反对手动布局子视图,所以我认为必须有更好的方法。

4

2 回答 2

1

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

喜欢:

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

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

我将 MultipleChoiceLayout 定义为 File 的所有者以及自定义视图。
在此处输入图像描述

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;
}
  • 现在发生的情况是,您通过从父级传递 self 将自定义视图对象从父级传递到自定义视图(参见上面的代码段)。现在,每当您单击按钮时,它都会自动调用您在自定义视图中定义的方法。你不必维护任何东西

希望这会有所帮助。

于 2013-04-11T04:32:58.633 回答
1

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

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

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

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

于 2013-04-11T05:20:47.603 回答