我创建了一个UIView
子类,并在其中添加了一些imageView和标签。我使用Visual Format来创建constraints
。并且视图布局对于不同大小的类是不同的。我使用下面的代码来识别大小等级。
let rule = UITraitCollection(horizontalSizeClass: .regular)
let isHorizontalRegular = self.traitCollection.containsTraits(in: rule)
if isHorizontalRegular {
// constraints for Horizontal Regular size class
} else {
// constraints for other size class
}
由于我没有在init
方法中获取尺寸等级信息,因此我创建的所有自动版面constraints
都是在updateConstraints()
方法中创建的。
基于此实施,我有一些问题。
constraint
中创建所有updateConstraints()
是否正确?constraints
的西方方式。constraints
。(因为我使用可视格式创建自动布局constraints
)?我知道我可以使用UIViewController
生命周期方法解决我的问题。但我正在使用@IBDesignable
在故事板上呈现视图。那么可以在UIView
子类中实现这些。
请帮我解决这些问题。
答案 0 :(得分:0)
小心,一些链接继续Obj-C即将到来。
第一步是学习整个视图生命周期this should help。下一步是了解adaptive layout是什么。
专注于这些覆盖:
<强> viewDidLoad中():强> 您可以在此处设置约束。确保子视图已加载,并且对于所有内容,translatesAutoresizingMaskIntoConstraints都为false。
<强> viewWillLayoutSubviews():强> 我倾向于在这里进行方向更改,但仅仅因为我需要知道整体边界是纵向(高度&gt;宽度)还是横向(宽度&gt;高度)。你听起来好像有一个更好的地方....
viewWillTransition(to size:with coordinator :): 这是任何大小类更改将发生的地方 - 或不是。 iPad也可以滑出或拆分视图。请注意,基本的iPad方向改变不会意味着大小等级的变化,因为它们是常规/常规的。不过,此功能将被ping。
这是我通常做的模板:
var p = [NSLayoutConstraint]()
var l = [NSLayoutConstraint]()
var initialOrientation = true
var isInPortrait = false
override func viewDidLoad() {
super.viewDidLoad()
setUpConstraints()
}
override func viewWillLayoutSubviews() {
super.viewDidLayoutSubviews()
if initialOrientation {
initialOrientation = false
if view.frame.width > view.frame.height {
isInPortrait = false
} else {
isInPortrait = true
}
orientationChanged()
} else {
if view.orientationHasChanged(&isInPortrait) {
orientationChanged()
}
}
}
func setUpConstraints() {
view.turnOffAutoResizing()
// append your portrait (p) and landscape (l) constraint arrays here
}
extension UIView {
public func turnOffAutoResizing() {
self.translatesAutoresizingMaskIntoConstraints = false
for view in self.subviews as [UIView] {
view.translatesAutoresizingMaskIntoConstraints = false
}
}
public func orientationHasChanged(_ isInPortrait:inout Bool) -> Bool {
if self.frame.width > self.frame.height {
if isInPortrait {
isInPortrait = false
return true
}
} else {
if !isInPortrait {
isInPortrait = true
return true
}
}
return false
}
public func setOrientation(_ p:[NSLayoutConstraint], _ l:[NSLayoutConstraint]) {
NSLayoutConstraint.deactivate(l)
NSLayoutConstraint.deactivate(p)
if self.bounds.width > self.bounds.height {
NSLayoutConstraint.activate(l)
} else {
NSLayoutConstraint.activate(p)
}
}
}
这可能对您的需求有点过分,但您应该能够掌握它的要点。