gpt4 book ai didi

ios - 如果我在运行应用程序时使用 IBDesignable 文件,为什么自动布局不会更新?

转载 作者:可可西里 更新时间:2023-11-01 01:56:40 25 4
gpt4 key购买 nike

这里是这个问题在谷歌驱动器中的项目:https://drive.google.com/file/d/1Js0t-stoerWy8O8uIOJl_bDw-bnWAZPr/view?usp=sharing

我使用下面的 IBDesignable 代码制作了一个自定义导航栏(下图中的红色 View )。我想,如果 iPhone 像 iPhone X、iPhone XR 这样的顶级手机,那么自定义导航栏的高度是 88,否则高度是 64。我制作了一个 IBDesignable 代码,所以我可以重用这个代码

import UIKit

@IBDesignable
class CustomParentNavigationBarView: UIView {

override func awakeFromNib() {
super.awakeFromNib()
self.setHeight()
}

override func layoutSubviews() {
super.layoutSubviews()
self.setHeight()
}

func setHeight() {
let deviceHasTopNotch = checkHasTopNotchOrNot()
layer.frame.size.height = deviceHasTopNotch ? 88 : 64
}

func checkHasTopNotchOrNot() -> Bool {
if #available(iOS 11.0, tvOS 11.0, *) {
// with notch: 44.0 on iPhone X, XS, XS Max, XR.
// without notch: 20.0 on iPhone 8 on iOS 12+.
return UIApplication.shared.delegate?.window??.safeAreaInsets.top ?? 0 > 20
}
return false
}

}

我将这个 CustomParentNavigationBarView 分配给红色 View

enter image description here

然后,我贴上标签。应该正好位于红色 View 下方(自定义导航栏,使用 IBDesignable)

如果我在 iPhone 上运行应用程序看起来很棒,不像 iPhone8 那样顶级 enter image description here

但是,如果我在像 iPhone XR 这样的顶级 iPhone 中运行该应用程序,标签现在在红色 View 内,它似乎仍然遵循之前的自动布局到之前 64 的红色 View 高度(在 Storyboard 中我使用的是 iPhone 8)、所以当自定义导航条在iPhone XR上运行时更新为88时,label仍然沿用之前的64高度,然后会定位到红色view里面

enter image description here

这是自定义导航栏的自动布局(红色 View )

enter image description here

这是标签的自动布局

enter image description here

如何解决这个问题?

最佳答案

这里的问题是您在 setHeight() 中指定了框架高度,但也在 Storyboard 中使用布局约束指定了高度。解决此问题的一种方法是为您的 View 指定一个 intrinsicContentSize,而不是将高度指定为 Storyboard 中的布局约束。 (I.o.w. 类似于你依靠标签的宽度为你计算的方式)

@IBDesignable
class CustomParentNavigationBarView: UIView {

lazy var deviceHasTopNotch: Bool = {
if #available(iOS 11.0, tvOS 11.0, *) {
// with notch: 44.0 on iPhone X, XS, XS Max, XR.
// without notch: 20.0 on iPhone 8 on iOS 12+.
return UIApplication.shared.delegate?.window??.safeAreaInsets.top ?? 0 > 20
}
return false
}()

override var intrinsicContentSize: CGSize {
let height:CGFloat = deviceHasTopNotch ? 88 : 64
let width = super.intrinsicContentSize.width //Use whatever you prefer here. Ex.UIScreen.main.bounds.size.width
return CGSize(width: width, height: height)
}
}

在 Storyboard中

删除自定义 View 的当前高度限制。将 Intrinsic Size 属性设置为 Placeholder

自定义导航栏的布局约束示例。

enter image description here

关于ios - 如果我在运行应用程序时使用 IBDesignable 文件,为什么自动布局不会更新?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52814651/

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