如何在添加到子视图之前获取UIView的宽度和高度?

问题描述:

我正在构建一个UIPageViewController,它具有基于视图数组中视图高度的可变页数。如何在添加到子视图之前获取UIView的宽度和高度?

我有一个叫做BlockView类,看起来像这样:

final class BlockView: UIView { 

    init(viewModel: BlockViewModel) { 
     super.init(frame: .zero) 

     let primaryLabel = UILabel() 
     primaryLabel.text = viewModel.labelText 
     addSubview(primaryLabel) 

     constrain(primaryLabel) { 
      $0.top == $0.superview!.top + 8 
      $0.bottom == $0.superview!.bottom - 8 
      $0.left == $0.superview!.left + 8 
      $0.right == $0.superview!.right - 8 
     } 
    } 

    required init?(coder aDecoder: NSCoder) { 
     fatalError("init(coder:) has not been implemented") 
    } 
} 

我想什么,能够做的是循环通过我BlockViews的阵列和运行print(blockView.frame)和看到未帧零。

现在我知道我将frame设置为.zero里面的BlockView.init。这是因为我希望视图根据其标签来确定自己的尺寸。

是否有我需要运行来实现这个功能?

感谢

+0

虽然我个人不使用框架(自动布局来代替),从声音你不能*做到这一点。两者都基于视图和控制器生命周期。是的,**两个**都不知道它们在'init'上的“框架” - 除非控制器*足够远以便给它*视图的框架*或者*提供特定的框架。所以我想问题是 - 你有什么'UIViewController'代码可能有帮助? – dfd

+0

我总是使用自动布局。我面临的棘手的部分,我想要添加视图作为子视图,如果它适合没有溢出,或者我想为UIPageViewController创建一个新的视图控制器,然后*然后*添加元素。这需要调整 –

+0

BlockView有没有限制?如果添加约束,手动框架设置将不起作用。 –

尝试sizeThatFits(_:)来计算的话,而不把它给上海华。该方法的唯一参数是CGSize,它表示应显示的边界。例如,如果你知道上海华(例如,340点)的宽度,你想知道多少会采取高度:

let expectedSize = view.sizeThatFits(CGSize(width: 340, height: .greatestFiniteMagnitude)) 

但是,你BlockView似乎不具备设置还适当限制。你用super.init(frame: .zero)初始化它 - 因此它的大小为0,0。

而且你的约束不改变这种状况,如:

constrain(primaryLabel) { 
    $0.centerY == $0.superview!.centerY 
    $0.left == $0.superview!.left + 8 
} 

这看起来像你设置的标签块视图中心的Y轴的中心,以及标签到左侧被定位视图的左侧锚点。如果blockView已经具有尺寸,那将正确定位标签。但现在,块视图的大小完全不受标签大小的影响。我想你会想将标签限制在blockView的左侧,右侧,顶部和底部锚点,以便当您尝试计算blockView的大小时,自动布局必须首先计算标签的大小并根据在这个大小的blockView本身。

一个可能的解决方案(我用的锚基于自动版式语法),你可以尝试把对的BlockView初始化:

primaryLabel.leftAnchor.constraint(equalTo: self.leftAnchor, constant: 8).isActive = true 
primaryLabel.topAchor.constraint(equalTo: self.topAnchor, constant: 8).isActive = true 
primaryLabel.rightAnchor.constraint(equalTo: self.rightAnchor, constant: -8).isActive = true 
primaryLabel.bottomAnchor.constraint(equalTo: secondaryLabel.topAnchor, constant: -8).isActive = true 
secondaryLabel.leftAnchor.constraint(equalTo: self.leftAnchor, constant: 8).isActive = true 
secondaryLabel.rightAnchor.constraint(equalTo: self.rightAnchor, constant: -8).isActive = true 
secondaryLabel.bottomAnchor.constraint(equalTo: self.bottomAnchor, constant: -8).isActive = true 
+0

这假定视图有一个大小,对吧?我正在运行这个,'let width = UIScreen.main.bounds.size.width - 24.0'' print(view.sizeThatFits(CGSize(width:width,height:.greatestFiniteMagnitude)))'getting(0,0) –

+0

看到更新的ansewer –

+0

我更新了我原来的帖子,并根据你的回答提供了新的约束条件,但我仍然在(0,0)运行'sizeThatFits' –