【问题标题】:Frame size of UIView when loaded from Nib?从 Nib 加载时 UIView 的帧大小?
【发布时间】:2017-10-31 08:35:39
【问题描述】:

我正在从 .xib 文件中加载 UIView,如下所示:

static func loadFromNib() -> CardView {
    let nib = UINib(nibName: "CardView", bundle: nil)
    return nib.instantiate(withOwner: self, options: nil).first as! CardView
}

加载后,视图具有在界面生成器中大小检查器的“框架矩形”中设置的确切框架大小。

这是有保证的吗?我需要这个大小是准确的,因为子视图约束是特定的,如果视图的大小错误 [*] 将不适合,但我在 Apple 的文档中没有找到任何提及。

[*] = 原因:我将视图渲染到 UIImage,以便稍后在 UIImageView 中显示它。它显示会员卡的图像,名称和会员编号需要在所有设备上以正确的字体大小显示在正确的位置。..

【问题讨论】:

    标签: ios swift uiview interface-builder xib


    【解决方案1】:

    为你的 UIView 创建一个自定义类:

    class CardView: UIView {
    
    override init(frame: CGrect) {
        super.init(frame: frame)
        let xibView = UINib(nibName: "CardView", bundle: nil).instantiate(withOwner: nil, options:nil)[0] as! UIView
        self.addSubview(xibView)
        }   
    
    require init?(coder: aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        }  
    }
    

    然后调用 if 从类中你将使用你需要的帧大小来实现它,否则它将默认为你的界面构建器中设置的大小:

    // MyViewController
    
    var cardView: CardView?
    
    override func viewDidLoad() {
        super.viewDidLoad()
    
        self.cardView = CardView()
        self.cardView.frame.size = CGSize(size here)
        self.cardView.frame.origin = CGPoint(point here)
        self.view.addSubview(self.cardView!)
    
    }
    

    【讨论】:

    • 所以基本上你也手动设置框架。好吧,我想在代码中设置框架并没有什么坏处,只是为了确保不能保证 xib-size。
    【解决方案2】:

    将任何 UIView 子类设置为 xib 的所有者,然后将 xib 作为该视图的子视图加载并设置自动调整掩码。

    我就是这样使用它的:

    extension UIView {
        func loadXibView(with xibFrame: CGRect) -> UIView {
            let className = String(describing: type(of: self))
            let bundle = Bundle(for: type(of: self))
            let nib = UINib(nibName: className, bundle: bundle)
            guard let xibView = nib.instantiate(withOwner: self, options: nil)[0] as? UIView else {
                return UIView()
            }
            xibView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
            xibView.frame = xibFrame
            return xibView
        }
    }
    

    xibView.autoresizingMask = [.flexibleWidth, .flexibleHeight] 正确设置视图大小。

    然后在初始化时使用它的任何 UIView 子类:

    override init(frame: CGRect) {
        super.init(frame: frame)
        addSubview(loadXibView(with: bounds))
    }
    
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        addSubview(loadXibView(with: bounds))
    }
    

    【讨论】:

    • 谢谢瓦西里。我只是想知道我在 Interface Builder 中设置的框架是否在运行时得到保证,但是您也明确设置了 xibView.frame,所以我猜您也不使用它或信任它。 ;) 干杯
    猜你喜欢
    • 1970-01-01
    • 2011-03-22
    • 2011-02-08
    • 1970-01-01
    • 2011-05-05
    • 2014-09-11
    • 2013-04-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多