【问题标题】:Where to setup a UIView subclass' subviews?在哪里设置 UIView 子类的子视图?
【发布时间】:2016-03-14 09:55:52
【问题描述】:

我有一个简单的UIView 子类,我在其中放置了一个UILabel,以便为UIView 提供特定的框架、背景颜色和来自UIViewController 的标签的文本格式。

我正在阅读View Programming Guide for iOS,但有些事情我还没有完全理解...当您的视图只有系统标准子视图时,例如我的UILabel,我应该覆盖drawRect: 方法吗?还是仅适用于Core Animation 员工?如果我不应该在这种方法中设置标准子视图,那么这样做的正确位置是什么?然后我应该覆盖init 方法吗?

提前致谢

【问题讨论】:

    标签: ios uiview initialization uilabel drawrect


    【解决方案1】:

    不,您不应该重写 drawRect 来初始化子视图,因为它会导致性能下降。这应该在 init、initWithFrame 或 initWithCoder 方法中完成。例如,这就是使用 initWithFrame 方法的方式

    - (id)initWithFrame:(CGRect)frame {
      self = [super initWithFrame:frame];
      if (self) {
          //initialize sub views 
      }
      return self;
    

    【讨论】:

    • 请注意,initUIView 实现仅使用 CGRectZero 调用 initWithFrame。因此,您应该始终覆盖 initWithFrame(或 initWithCoder,如果您使用的是 NSCoding)。
    • 谢谢。我又想到了另一个问题:通过覆盖layoutSubviews 方法来设置子视图怎么样?这会比在初始化方法中设置它们更合适吗?
    • 您应该覆盖layoutSubviews 来为您的子视图执行任何自定义布局逻辑,例如更新它们的框架。因为它可以在UIViews 的生命周期内被多次调用,所以它不适合初始化 子视图本身。这应该在初始化程序中完成。
    • @Hamish 如果要初始化某些子视图,您需要拥有视图的实际框架怎么办?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-12
    • 1970-01-01
    • 2017-01-24
    • 2016-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多