- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
这里是这个问题在谷歌驱动器中的项目: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
然后,我贴上标签。应该正好位于红色 View 下方(自定义导航栏,使用 IBDesignable)
如果我在 iPhone 上运行应用程序看起来很棒,不像 iPhone8 那样顶级
但是,如果我在像 iPhone XR 这样的顶级 iPhone 中运行该应用程序,标签现在在红色 View 内,它似乎仍然遵循之前的自动布局到之前 64 的红色 View 高度(在 Storyboard 中我使用的是 iPhone 8)、所以当自定义导航条在iPhone XR上运行时更新为88时,label仍然沿用之前的64高度,然后会定位到红色view里面
这是自定义导航栏的自动布局(红色 View )
这是标签的自动布局
如何解决这个问题?
最佳答案
这里的问题是您在 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
。
自定义导航栏的布局约束示例。
关于ios - 如果我在运行应用程序时使用 IBDesignable 文件,为什么自动布局不会更新?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52814651/
我正在尝试实现一个简单的UIButton子类,它是IBDesignable。我希望能够从Interface Builder为控件的每个状态设置颜色。我知道这可以通过IBInspectable关键字实现
我希望能够在代码中布局我的 View Controller ,但可以看到界面构建器中显示的布局。 我知道我可以创建一个 UIView 子类,使其 IBDesignable,并将其分配给 View Co
我正在尝试在我的 IOS 项目中创建一个自定义按钮。但是,当我使用我的类创建按钮时,背景在 Storyboard中不起作用。但是当我运行该程序时,按钮工作正常。 在这里你可以看到我的类(class)
我在使用 XCode 时遇到了一个非常具体的问题。 设置 目标中同名的颜色不同 我的 XCode 项目中有两个目标,目标 A 和 目标 B。 它们都有一个名为 Colors.xcassets 的单独资
我正在使用 Xcode 的本地化导出功能,并且我有一个带有 IBInspectable 字符串的自定义 IBDesignable UIControl。我想知道是否有办法将此字符串包含到导出的 .xli
我使用此视频 (https://www.youtube.com/watch?v=xGdRCUrSu94&t=2502s) 创建了自定义分段控件。我希望能够在运行时将自定义分段控件 (commaSepe
我有一个 IBDesignable 类。 @IBDesignable class Foobar: UIView { // ignore all init code var foo: C
我创建了一个具有自定义 IBDesignable UIView 的框架。当我在项目中只包含框架时,IBInspectable 属性不会显示在属性检查器中,但我可以以编程方式使用 View 属性。 我检
我正在使用 swift 构建一个新的 iOS 应用程序,并尝试制作一个自定义的 IBDesignable UIButton 类以在设计器中使用。我的代码在运行时似乎在构建器或应用程序本身中都不起作用。
我正在尝试使用我导入到项目中的一些 IB 可设计对象,这些可设计对象可通过 Storyboard访问,但在使用时不执行任何操作。我注意到一个 Designables - Build Failed 在右
我是 Xcode 的新手,我认为有办法做到这一点,但我似乎无法弄清楚。 我通过子类化 UIView 并使用 IBDesignable 制作了一个自定义控件。 但是,我似乎无法弄清楚如何将事件从我的控制
我已经创建了 IBDesignable 和 IBInspectable 自定义类来为 View 提供阴影和角半径 但是当我将 Designable 类分配给 view 时,我得到 Designable
当我编写自己的 UIButton 扩展类并使其成为 @IBDesignable 时,我在 Interface Builder 中收到两个错误,即: Main.storyboard: error: IB
我最近对 Assets.xcassets 做了一些更改这对 XCode 造成了绝对的困惑。我最终遇到了多个此类错误:Failed to render and update auto layout
我已经在 OS X 应用程序中实现了一个运行良好的自定义控件。当绘制控件时,它使用来自非系统框架的代码。控件是用swift编写的,框架是用Objective-C编写的。该框架不是与具有自定义控件的应用
我有一个 xib ( childXib ) 文件链接到其自定义 UIView swift 文件通过其所有者。 这就是我如何初始化我的自定义 UIView : // init for IBDesigna
我正在尝试在我的 Objective-C 项目中使用我在 github 上找到的一个 swift 库。我已按照此处的说明进行操作:How to call Objective-C code from S
我不明白为什么在尝试实现@IBDesignable时 socket 为零。该应用程序不断崩溃。 import UIKit import RxSwift import RxCocoa @IBDesign
我有一个 @IBDesignable 自定义 View 。它包含一个带有两个子类 UILabels 的 UIView。 UILabel 的自定义子类正在设置它的字体。 我想要实现的目标是通过将 Vie
我正在尝试创建自定义 UITextField 并设置自定义边框颜色。我也为 borderColor 创建了一个 IBInspectable 属性,如果我使用它的 set 和 get 方法,我可以使用
我是一名优秀的程序员,十分优秀!