以编程方式加载的 Nib 不会填充父容器,即使设置了自动布局约束



我有一个带有 init 方法的笔尖:

override init() {
    super.init();
    self.view = NSBundle.mainBundle().loadNibNamed("myNib", owner: self, options: nil).first as? UIView;
    self.addSubview(self.view);
}

在 UITableView 单元格中,我像这样加载笔尖:

override func awakeFromNib() {
    self.myInnerNib = myNib();
    self.nibContainerView?.addSubview(self.myInnerNib!);
}

笔尖是任意形状的,其约束设置为填充父视图的容器。但是,当我在更大的设备上加载它时,很明显视图不会填充它的父级。

加载笔尖时,您会收到一个视图数组,并且您通常会采用顶级视图并将其添加为子视图。容器和我的笔尖之间是否有另一个视图阻止笔尖正确调整大小?

编辑

我用框架方法覆盖了我的 init,我强制笔尖中的子视图设置它们的框架,而不是让它们被隐式推断

override init(frame: CGRect) {
    super.init(frame: frame);
    self.view = NSBundle.mainBundle().loadNibNamed("DayLineGraphView", owner: self, options: nil).first as? UIView;
    self.view.frame = frame; <- problem
    self.innerView.frame = frame;  <-problem
    self.addSubview(self.view);
    setupGraph()
}

您已正确识别有问题的行:

self.view.frame = frame; <- problem
self.innerView.frame = frame;  <-problem

您在这里要做的是设置视图框架并将innerView框架设置为相同的内容。这是错误的原因是innerView上的原点很可能不正确(并非总是如此,但通常如此)。如果要填充view innerView必须确保原点为 {0, 0}。执行此操作的一种简单方法是使用视图的bound property

self.view.frame = frame;
self.innerView.frame = self.view.bounds;

这应该可以解决您的问题。

关于约束的另一个说明。在这种情况下,"容器"视图可能在 IB 中具有适当的约束,但您正在向其添加一个子视图,该子视图需要自己的约束。因此,"容器"视图需要为"子视图"建立约束。由于是以编程方式添加子视图的,因此还必须以编程方式设置约束。您可能怀疑这是不正确的原因是因为布尔值translatesAutoresizingMaskIntoConstraints方便。这将允许iOS对它认为约束应该是什么做出有根据的猜测。由于您将大小设置为等效,因此它会设置约束以填充父...但是约束仍在运行时建立(即不在 IB 中)。

最新更新