我在xib文件中创建了一个自定义视图,我在其中将所有模拟指标设置为“推断”
在我的视图中,我通过固定左侧和顶侧将左侧的一个堆栈视图x向左浮动,并通过固定右侧和顶部将堆栈视图向右移动。不知何故这样(=符号表示屏幕边框)
==========
=x y=
= =
= =
= =
= =
==========
我视图的相应类很简单:
class MyView: UIView {
var view:UIView!
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
view = UIView.loadFromNibNamed("MyView")
addSubview(view)
}
}
extension UIView {
class func loadFromNibNamed(nibNamed: String, bundle : NSBundle? = nil) -> UIView? {
return UINib(
nibName: nibNamed,
bundle: bundle
).instantiateWithOwner(nil, options: nil)[0] as? UIView
}
}
问题是视图是从nib加载的,但宽度在某种程度上不是动态的。我希望视图根据父级的大小自行调整大小。但是,即使我已经设置了约束,右侧堆栈视图的大约1/3也会被裁剪掉并且在屏幕上不可见。
我该怎么做才能解决这个问题?
答案 0 :(得分:1)
我们需要确定问题是什么,所以让我们首先确认堆栈视图正在设置它们的框架。在视图控制器中,堆栈视图是我们可以覆盖following methods并检查堆栈视图的帧。
viewWillLayoyutSubviews()
viewDidLayoutSubviews()
确认框架已设置,我们现在可以查看故事板中设置的约束。您提供的信息如何将堆栈视图布局放在一起,是不是在另一个视图之上?它们应该是并排的吗?
您需要检查约束是否对您想要的布局有效。
3.确认您的视图的大小类已正确配置。 Apple在这里有一个名为“Size Classes Design Help”的文档。我相信这是你的问题。您的自定义类被设置为具有Any / Any的大小类,并且自定义视图的超级视图具有不同的大小类集,例如Compact / Regular。因此,自定义视图不根据大小类调整其大小,因为对于任何大小类组合,它都设置为相同。尝试为自定义类配置不同大小的类组合,以查看是否存在任何差异 - 例如Compact / Regular。
答案 1 :(得分:1)
如果您希望它具有动态帧大小,则需要为从XIB加载的任何视图将translatesAutoresizingMaskIntoConstraints
属性设置为false
。否则,系统将自动创建布局约束,如固定宽度和固定高度,以防止视图调整大小。
此外,在将视图添加到视图层次结构中之后,需要在代码中添加一些约束,该视图层次结构将其顶部,底部,左侧和右侧边缘固定到其超级视图的相应边缘。毕竟,您将XIB的内容作为子视图添加到自定义视图MyView
,即两个视图不同,您需要告诉系统它应如何定位子视图(您在故事板中添加的约束仅与您的MyView
实例有关,而与其子视图无关。这些对代码的补充应该可以解决问题:
class MyView: UIView {
var view:UIView!
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
view = UIView.loadFromNibNamed("MyView")
view.translatesAutoresizingMaskIntoConstraints = false
addSubview(view)
// Pin view to all four edges of its superview
self.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|[view]|", options: [], metrics: nil, views: ["view": view]))
self.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|[view]|", options: [], metrics: nil, views: ["view": view]))
}
}
附注:
translatesAutoresizingMaskIntoConstraints
属性的更详细说明