ios - 如何使用具有自动布局的 init(frame:) 实例化自定义 UIView 子类?
问题描述
我正在制作一个 ios 应用程序,并依靠 AutoLayout 约束来设置视图和子视图布局的大小。
我制作了一个自定义子类UIScrollView
,见下文。当我编写它的init
方法时,我看到它的超类只init(frame:)
需要重写。但是因为我使用的是自动布局,所以我不应该设置框架。
那么在我的情况下我应该如何编写init
方法呢?我应该传入一个虚拟frame
值:
MyCollectionView: UIScrollView {
init() {
super.init(CGRect(x:0, y:0, width:0, height:0))
}
}
用法:
ViewController:UIViewController {
let myScrollView = MyScrollView()
}
解决方案
您不必像使用 autolauout 时那样担心设置/不是框架
let myScrollView = MyScrollView()
myScrollView.translatesAutoresizingMaskIntoConstraints = false
框架将不会影响translatesAutoresizingMaskIntoConstraints
设置为false
,所以这样做
class MyScrollView: UIScrollView {
override init(frame: CGRect) {
super.init(frame: frame)
setUp()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
setUp()
}
func setUp() {
}
}
let gg = MyScrollView(frame: .zero)
gg.translatesAutoresizingMaskIntoConstraints = false
// add constraints
推荐阅读
- java-8 - Spring Reactor Set 组合成一个 Set
- php - 使用 jquery AJAX 和 PHP 创建特殊的 JSON 文件
- java - 关于 Java 接口的一般问题
- cryptography - 用重复键和计数器打破异或
- r - 如何在 R 中将附加参数(存储在“...”中)传递给 parLapply 的多个核心?
- macos - 在支持早期版本 Mac 的 Macos 10.14.5 上使用 gcc 编译
- service-worker - 如何在.net core 3中将启动类添加到工作服务模板
- caching - Solaris OS 和 L1 L2 L3 高速缓存
- openssl - 在 OpenSSL 1.1.x 中,确定给定的 SSL* 是否对应于连接的服务器端或客户端
- sql-server - 创建“视图”以连接两个数据库