我正在处理一些自定义的基于UIView的输入控件,并试图确定设置视图的正确做法.在使用UIViewController时,使用loadView和相关的viewWillviewDid方法相当简单,但是在对UIView进行子类化时,我拥有的最接近的方法是`awakeFromNibdrawRectlayoutSubviews.(我在考虑设置和拆卸回调.)在我的例子中,我在layoutSubviews设置了我的框架和内部视图,但是我在屏幕上看不到任何东西.

确保我的视图具有我想要的正确高度和宽度的最佳方式是什么?(不管我是否使用自动布局,我的问题都适用,尽管可能有两个答案.)什么是正确的"最佳实践"?

推荐答案

苹果在文档中非常明确地定义了如何细分UIView.

看看下面的列表,特别是看一下initWithFrame:layoutSubviews.前者用于设置UIView的框架,而后者用于设置其子视图的框架和布局.

还要记住,只有在以编程方式实例化UIView时,才会调用initWithFrame:.如果您是从nib文件(或故事板)加载,将使用initWithCoder:.在initWithCoder:中,框架尚未计算,因此无法修改在Interface Builder中设置的框架.按照建议in this answer,您可以考虑从initWithCoder:拨打initWithFrame:来设置帧.

最后,如果您从NIB(或故事板)加载UIView,您也有机会执行自定义框架和布局初始化,因为当调用awakeFromNib时,可以保证层次 struct 中的每个视图都已解压和初始化.

NSNibAwaking号文件(现在被awakeFromNib号文件取代)起:

可以从wakeFromNib内部安全地将消息发送到其他对象-到那时,可以确保所有对象都未存档和初始化(当然,不一定被唤醒)

同样值得注意的是,使用自动布局时,您不应该显式设置视图的框架.相反,您应该指定一组足够的约束,以便布局引擎自动计算框架.

直接从documentation分开始:

要重写的方法

初始化

  • 100建议您实现此方法.您还可以实现自定义初始化方法, 或者,代替这种方法.

  • 100如果从Interface Builder nib文件加载视图,并且视图需要自定义

  • 100仅当您希望视图使用不同的核心动画层作为其后备存储区时,才实现此方法.例如, 如果您正在使用OpenGL ES进行绘图,您可能希望 重写此方法并返回CAEAGLLayer类.

绘画和印刷

  • 100如果视图绘制自定义内容,请实现此方法.如果视图不执行任何自定义图形,请避免覆盖该视图

  • 100仅当您希望在打印期间以不同方式绘制视图内容时,才实现此方法.

约束条件

  • 100如果视图类需要约束才能正常工作,则实现此类方法.

  • 100如果视图需要在子视图之间创建自定义约束,请实现此方法.

  • 100101实现这些方法以覆盖视图与其他视图的对齐方式.

布局

  • 100如果希望视图在调整大小时具有不同于正常情况下的默认大小,请实现此方法 运营部.例如,您可以使用此方法来防止您的 视图从收缩到无法显示子视图的程度 正确无误.

  • 100如果需要对子视图布局进行比约束或更精确的控制,请实现此方法 自动调整大小行为提供了.

  • 100101根据需要实现这些方法以跟踪子视图的添加和移除.

  • 100101根据需要实施这些方法,以跟踪当前视图在视图中的移动

  • 100101根据需要实现这些方法,以跟踪视图到不同窗口的移动.

事件处理:

  • 100101102touchesCancelled:withEvent:实施 如果您需要直接处理touch 事件,请使用这些方法.(适用于 基于手势的输入,请使用手势识别器.)

  • 100如果视图直接处理touch 事件,并且可能希望防止附加 手势识别器不会触发其他操作.

Ios相关问答推荐

自定义alert 未执行任何操作

带外部笔划的圆形进度视图

无法关闭包含字体 Select 器的工作表

在 React Native iOS 中加载多个 JS 包

NSError 错误领域: "CBATTErrorDomain" 代码: 128 0x0000000282b111a0

为什么在Actor内部使用withTaskGroupwork并行运行?

将 URLCache 子类与 URLSession 一起使用

React Native IOS base64 编码图像不显示

如何在 Mac OS Ventura 中使用 Xcode 13

转换在 NavigationView 中不起作用

Swiftui为什么在点击第二行之前背景不起作用

SwiftUI 文本字段代理绑定代码忽略空格不起作用?

为什么我的应用在 Testflight 中没有下载 dSYM 按钮?

如何关闭情节提要弹出框

如何使用 Swift 从assets资源 中加载特定图像

使用 AVAudioPlayer 播放声音

如何在 Swift 中使用包含多个值的查询参数构建一个 URL?

如何确定 WKWebView 的内容大小?

无效的 iPhone 应用程序二进制文件

如何从 UIPickerView 获取选定的值