首页 > 解决方案 > 如何使用具有自动布局的 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()

}

标签: iosswiftautolayout

解决方案


您不必像使用 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

推荐阅读