Swift中如何通过代码创建自定义Xib UIView并在HomeVC调用
纯代码调用Xib自定义UIView的正确实现
原代码存在的问题
- 自定义视图的Xib加载逻辑错误:
commonInit方法中,加载Xib视图后又重新实例化了ReusableContainerview,覆盖了原本的Xib视图,不仅无法正确显示Xib内容,还可能引发循环创建问题。 - 控制器调用逻辑缺失:
HomeVC仅声明了可选变量reuseView,未初始化视图,也未将其添加到控制器的视图层级中,自然无法显示。
修正后的自定义UIView代码
import UIKit class ReusableContainerview: UIView { @IBOutlet weak var containerView: UIView! override init(frame: CGRect) { super.init(frame: frame) commonInit() } required init?(coder: NSCoder) { super.init(coder: coder) commonInit() } private func commonInit(){ // 安全加载Xib文件 let nib = UINib(nibName: "ReusableContainerview", bundle: nil) guard let viewFromXib = nib.instantiate(withOwner: self, options: nil).first as? UIView else { return } // 设置Xib视图跟随父视图自动调整大小 viewFromXib.frame = bounds viewFromXib.autoresizingMask = [.flexibleWidth, .flexibleHeight] addSubview(viewFromXib) } }
控制器中纯代码调用的正确方式
方式1:使用Frame布局
import UIKit class HomeVC: UIViewController { override func viewDidLoad() { super.viewDidLoad() // 初始化自定义视图并设置位置大小 let reuseView = ReusableContainerview(frame: CGRect(x: 0, y: 100, width: view.bounds.width * 0.9, height: 300)) // 水平居中 reuseView.center.x = view.center.x // 将视图添加到控制器视图层级 view.addSubview(reuseView) } }
方式2:使用AutoLayout约束(推荐)
import UIKit class HomeVC: UIViewController { override func viewDidLoad() { super.viewDidLoad() let reuseView = ReusableContainerview() // 关闭自动转换约束,启用手动AutoLayout reuseView.translatesAutoresizingMaskIntoConstraints = false view.addSubview(reuseView) // 设置约束 NSLayoutConstraint.activate([ reuseView.centerXAnchor.constraint(equalTo: view.centerXAnchor), reuseView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 20), reuseView.widthAnchor.constraint(equalTo: view.widthAnchor, multiplier: 0.9), reuseView.heightAnchor.constraint(equalToConstant: 300) ]) } }
内容的提问来源于stack exchange,提问作者Swift
相关产品推荐
相关产品推荐

