初始化xib自定义视图传入frame不生效,无法调整视图大小怎么办
问题原因
- 仅将xib加载得到的
contentView添加到了自定义视图上,没有配置contentView的尺寸跟随自定义视图的bounds动态变化,因此contentView会一直保留xib文件设置的freeform默认尺寸,你传入的frame只会作用在自定义视图本身,内部的contentView不会同步适配。 - 你给
contentView设置了translatesAutoresizingMaskIntoConstraints = true,但没有对应的autoresizing掩码或者手动约束来绑定父子视图的边距,无法触发适配逻辑。
解决方案
你可以任选以下任意一种方式实现适配:
方案1:使用autoresizing快速适配
修改commonInit方法,给contentView配置和父视图绑定的autoresizing规则即可,代码示例如下:
private func commonInit(){ Bundle.main.loadNibNamed("xibView", owner: self, options: nil) // 初始化时将contentView的frame设置为和当前自定义视图一致 contentView.frame = self.bounds // 设置autoresizing掩码,让contentView的宽高跟随父视图同步变化 contentView.autoresizingMask = [.flexibleWidth, .flexibleHeight] addSubview(contentView) }
该方案代码量少,适合不需要复杂适配的静态页面场景。
方案2:使用Auto Layout约束适配(更稳定)
关闭contentView的自动约束翻译,添加上下左右贴紧父视图的约束,横竖屏切换等动态尺寸变化场景下适配更稳定,代码示例如下:
private func commonInit(){ Bundle.main.loadNibNamed("xibView", owner: self, options: nil) addSubview(contentView) // 开启自动约束 contentView.translatesAutoresizingMaskIntoConstraints = false // 绑定contentView四边和自定义视图四边完全重合 NSLayoutConstraint.activate([ contentView.topAnchor.constraint(equalTo: self.topAnchor), contentView.leadingAnchor.constraint(equalTo: self.leadingAnchor), contentView.trailingAnchor.constraint(equalTo: self.trailingAnchor), contentView.bottomAnchor.constraint(equalTo: self.bottomAnchor) ]) }
补充说明
如果需要内部stackView跟随视图尺寸自动适配,还需要在xib中给stackView添加绑定contentView四边的约束,确保stackView的布局范围和contentView同步变化。
内容的提问来源于stack exchange,提问作者dper
相关产品推荐
相关产品推荐

