Xib框架大小添加为子视图时不正确

时间:2019-12-21 21:07:32

标签: ios swift xcode swift4 swift5

我有一个类似这样的xib:

enter image description here

这是我的视频容器视图课程:

class VideoContainerView: UIView {

    @IBOutlet var rootView: UIView!
    @IBOutlet weak var videoView: VideoView!
    @IBOutlet weak var playIconContainer: UIView!
    @IBOutlet weak var timeContainer: UIView!
    @IBOutlet weak var timeLabel: UILabel!

    override init(frame: CGRect) {
        super.init(frame: frame)
        initialize()
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        initialize()
    }

    func initialize() {
        Bundle.main.loadNibNamed("VideoContainerView", owner: self, options: nil)
        rootView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
        addSubview(rootView)
    }

}

这是我PostMediaCollectionViewCell的课程:

class PostMediaCollectionViewCell: UICollectionViewCell {

    @IBOutlet weak var container: UIView!
    @IBOutlet weak var imageView: UIImageView!
    @IBOutlet weak var moreView: UIView!
    @IBOutlet weak var moreViewLabel: UILabel!
    @IBOutlet weak var videoContainerView: VideoContainerView!

    override func awakeFromNib() {
        super.awakeFromNib()
    }

    func initialize() {

    }

}

但是当我在模拟器中运行应用程序时,VideoContainerView的宽度/高度是错误的。它似乎并没有尊重我的自动布局值,因为在打印出其边界之后,其宽度和高度分别为661.0和372.0(XIB中的硬编码值,如上图所示)。

我在做错什么,我需要进行哪些更改才能使其正常工作?

3 个答案:

答案 0 :(得分:0)

首先您无法调整视频容器视图的大小:

    Bundle.main.loadNibNamed("VideoContainerView", owner: self, options: nil)
    rootView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
    addSubview(rootView)

您需要添加某种初始尺寸,例如

    rootView.frame = self.view.bounds // or whatever

否则,您的自动调整大小蒙版将以xib文件中的大小开头,这几乎肯定是错误的。

(顺便说一句,您的问题是说“它似乎并不尊重我的自动布局值”,但是在您的代码中,您根本没有自动布局值!如果这是您想要的,则应该具有使用自动版式。autoresizingMask是自动版式的相反。)

答案 1 :(得分:0)

您可以像这样为rootView设置x,y,hight和width参数:

rootView.frame = CGRect(x: 0, y: 0, width: self.view.frame.width, height: self.view.frame.height)

答案 2 :(得分:0)

let view = Bundle.main.loadNibNamed("VideoContainerView", owner: self, options: nil)?.first as! UIView
addSubview(view)
rootView.frame = self.bounds
rootView.autoresizingMask = [.flexibleWidth,.flexibleHeight]