【问题标题】:What is the right way to build a UIButton composed of other UIViews?构建由其他 UIView 组成的 UIButton 的正确方法是什么?
【发布时间】:2013-04-11 04:03:47
【问题描述】:

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

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

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

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

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

那么哪个最好:

  1. 子类化和绘制所有内容
  2. 通过组合其他 UIView 进行子类化和构建
  3. 在外部视图中构建按钮
  4. 其他方法...?

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

【问题讨论】:

    标签: ios uiview uibutton


    【解决方案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(参见上面的 sn-p)。现在,每当您单击按钮时,它都会自动调用您在自定义视图中定义的方法。您无需维护任何东西

    希望这会有所帮助。

    【讨论】:

    • 感谢您的回复。我按照你的指示,但我不能调用 [ParentView addSubview:...] 因为我使用情节提要来布局父视图。因此,我尝试将您的建议与以下内容结合起来:blog.compeople.eu/apps/?p=142,它让我走得很远,除了现在我加载的 xib 没有正确替换视图。
    【解决方案2】:

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

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

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

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

    【讨论】:

    • 谢谢丹。我尝试将您的一些指示与 BaZinga 以及来自blog.compeople.eu/apps/?p=142 的一些提示结合起来。不幸的是,即使现在我可以在 xib 中设计我的自定义控件并将其全部连接到相应的 h 和 m 文件中,它也无法在父视图中正确显示。我会把我的代码放上来。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-08-24
    • 1970-01-01
    • 1970-01-01
    • 2022-06-28
    • 1970-01-01
    • 2014-03-25
    • 1970-01-01
    相关资源
    最近更新 更多