如何在构造函数中使用边界[重复]

Posted

技术标签:

【中文标题】如何在构造函数中使用边界[重复]【英文标题】:How to use bounds within constructor [duplicate] 【发布时间】:2018-09-14 15:34:03 【问题描述】:

我正在通过构造函数为我的 collectionViewCell 类创建一个视图。但是我不能在其中使用 bounds 属性,但是在一个函数中,我可以使用它,我不想使用它,因为我必须在渲染单元格的地方相应地修改我的构造函数属性。这是我所做的代码 -

let customView:UIView = 
    let view = UIView(frame: CGRect(x: 20,
                                    y: 20,
                                    width: bounds.width - 40,
                                    height: 100))
    view.backgroundColor = .white
    view.layer.cornerRadius = 15
    return view
()

这里我得到了边界错误 -

实例成员“bounds”不能用于类型“CustomCollectionViewCell”

我不知道这或我的方法有什么问题。

【问题讨论】:

【参考方案1】:

你需要lazy关键字来访问self实例

lazy var customView:UIView = 
     let view = UIView(frame: CGRect(x: 20,
                                y: 20,
                                width: bounds.width - 40,
                                height: 100))
    view.backgroundColor = .white
    view.layer.cornerRadius = 15
    return view
()

将您的属性标记为lazy 告诉编译器在运行时第一次实际调用该属性之前不要为该属性分配内存。这就是为什么您可以在闭包中访问self 的原因——因为这是一个惰性变量,所以可以保证在执行闭包时self 已完全初始化,并且您可以访问self.bounds

【讨论】:

还有一个问题,我必须对每个构造函数都使用惰性变量吗? 不,只有你必须喜欢你遇到的东西【参考方案2】:

您不能使用边界,因为在那个阶段您的超级视图尚未初始化,因此没有框架或边界。您需要在适当的时候更改customView 的框架。例如在layoutSubviews

override func layoutSubviews() 
     super.layoutSubviews()
     customView.frame =  CGRect(
           x: 20,
           y: 20,
           width: bounds.width - 40,
           height: 100
     )


如果您确定您的视图在init(frame: CGRect) 处的大小合适,您可以在初始化时添加与框架相关的代码。

【讨论】:

我没有尝试过你的方法,但@Sh_Khan 的回答为我做了这个工作。我希望这是正确的方法。不管怎样,谢谢哥们! 是的,他的解决方案在这种情况下是一流的,干杯。

以上是关于如何在构造函数中使用边界[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何在模板类之外定义构造函数[重复]

如何在打字稿中使用可选参数调用类构造函数[重复]

C ++:如何在派生类中定义基类构造函数,如果基构造函数具有带有私有成员的初始化列表[重复]

如何在构造函数中初始化指向字符串的指针数组[重复]

如何将参数传递给正则表达式构造函数,并在 String.matchAll 方法中使用 [重复]

如何在 C++ 中调用基类构造函数 [重复]