我有一个带有 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 中)。