如何将关联UIView子类的Xib视图固定在iPhoneX顶部?
如何将Xib创建的UIView固定在iPhoneX及以上机型屏幕顶部
兄弟,看了你这段代码,要把Xib视图牢牢固定在iPhoneX这类带刘海的机型屏幕顶部,得把布局逻辑从基于frame的方式改成Auto Layout,还要注意安全区域的适配问题,具体修改步骤如下:
1. 重构commonInit里的布局代码
你原来用contentView.frame = self.bounds的方式在适配异形屏时容易出问题,换成Auto Layout约束来绑定边缘:
private func commonInit() { Bundle.main.loadNibNamed("SmartRemoteConnectedBanner", owner: self, options: nil) // 必须禁用这个属性,否则Xib视图自带的frame约束会和我们手动加的约束冲突 contentView.translatesAutoresizingMaskIntoConstraints = false addSubview(contentView) // 激活约束:绑定顶部、左右边缘,同时保留你设置的300高度 NSLayoutConstraint.activate([ contentView.topAnchor.constraint(equalTo: self.topAnchor), contentView.leadingAnchor.constraint(equalTo: self.leadingAnchor), contentView.trailingAnchor.constraint(equalTo: self.trailingAnchor), contentView.heightAnchor.constraint(equalToConstant: 300) ]) }
2. 可选:适配安全区域(避免被刘海/状态栏遮挡)
如果你不希望视图内容被刘海或者状态栏挡住,那就把顶部约束改成绑定到安全区域的顶部:
// 替换原来的顶部约束 contentView.topAnchor.constraint(equalTo: self.safeAreaLayoutGuide.topAnchor)
3. 补全初始化方法的逻辑
你现在的required init?(coder aDecoder: NSCoder)里没调用commonInit(),如果是从Storyboard或者Xib里引用这个视图的话,布局逻辑不会执行,得补上这行:
required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) commonInit() // 加上这行,确保初始化时执行布局 }
这样改完之后,你的Xib视图就能稳稳固定在屏幕顶部,完美适配iPhoneX及所有新机型啦。
内容的提问来源于stack exchange,提问作者Blisko
相关产品推荐
相关产品推荐

