gpt4 book ai didi

ios - 如何在方向更改时更新 UIView 子类中的自动布局约束

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:55:51 28 4
gpt4 key购买 nike

我创建了一个 UIView 子类并在其中添加了一些 imageView 和标签。我使用 Visual Format 来创建 constraints。并且 View 布局对于不同的大小类是不同的。我使用以下代码来识别尺寸等级。

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() 中创建的方法。

基于这个实现,我有一些问题。

  1. 在覆盖方法 updateConstraints() 中创建所有 constraint 的方法是否正确?
  2. 如果不是,这是西方基于尺寸类别创建自动布局约束的方法。
  3. 如何在方向更改时更新自动布局约束。(因为我使用视觉格式创建自动布局约束)?

我知道我可以使用 UIViewController 生命周期方法解决我的问题。但我正在使用 @IBDesignable 在 Storyboard上呈现 View 。那么是否有可能在 UIView 子类中实现这些。

请帮我解决这些问题。

最佳答案

小心,一些继续 Obj-C 的链接出现了。

第一步是学习整个 View 生命周期,this should help .下一步是了解什么adaptive layout是。

关注这些覆盖:

viewDidLoad():这是您可以设置约束的地方。确保 subview 已加载,并且 translatesAutoresizingMaskIntoConstraints 对所有内容都为 false。

viewWillLayoutSubviews():我倾向于在此处更改方向,但这只是因为我需要知道整体边界是纵向(高度>宽度)还是横向(宽度>高度)。听起来你有一个更好的地方....

viewWillTransition(到尺寸:带协调器:):这是发生任何 尺寸等级变化的地方——也可能不发生。 iPad 也可以滑出或 Split View。请注意,基本的 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)
}
}
}

这对您的需求来说可能有点矫枉过正,但您应该能够理解它的要点。

关于ios - 如何在方向更改时更新 UIView 子类中的自动布局约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40825824/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com