具有动态宽度的 XIB,在中心固定高度 - 编程约束似乎不起作用

XIB with dynamic width, fix height in center - programmatically constraints seems not to work

我创建了一个自由形式的 .xib 并像这样实现它

if let alertView = Bundle.main.loadNibNamed(Constants.XIB.titleImageLabelThreeButtonsAlertView, owner: self, options: nil)?.first as? TitleImageLabelThreeButtonsAlertView {

        view.addSubview(alertView)

        alertView.center = CGPoint(x: view.bounds.midX, y: view.bounds.midY)

        view.addConstraint(NSLayoutConstraint(item: alertView, attribute: .trailing, relatedBy: .equal, toItem: view, attribute: .trailing, multiplier: 1, constant: 20))
        view.addConstraint(NSLayoutConstraint(item: alertView, attribute: .leading, relatedBy: .equal, toItem: view, attribute: .leading, multiplier: 1, constant: 20))

        alertView.autoresizingMask = [UIViewAutoresizing.flexibleLeftMargin, UIViewAutoresizing.flexibleRightMargin, UIViewAutoresizing.flexibleTopMargin, UIViewAutoresizing.flexibleBottomMargin]
        self.view.layoutIfNeeded()

  }

我在viewDidAppear中调用了这段代码。中心的东西似乎有效,但 trailingleading 似乎没有任何效果。我希望它们的距离为 20,我的 alertView 应该有一个固定的高度并出现在中心。

xib 的大小始终相同(见屏幕截图)

我最初的目标是获得一个可以在每个设备的每个视图中实现的 xib。那么获得这个的最好方法是什么?

我的 xib 文件 模拟器 iphone 7 模拟器 iphone 4

您混淆了自动布局和固定位置(使用自动调整大小蒙版)。您要做的是完全使用自动布局,以便视图自动调整其布局。你说你想要一个 20 的水平距离,一个固定的高度并且居中,所以我会这样做:

if let alertView = Bundle.main.loadNibNamed(Constants.XIB.titleImageLabelThreeButtonsAlertView, owner: self, options: nil)?.first as? TitleImageLabelThreeButtonsAlertView {

    view.addSubview(alertView)

    // Start using auto layout
    alertView.translatesAutoresizingMaskIntoConstraints = false

    // Set the leading and trailing constraints for horizontal placement
    view.addConstraint(NSLayoutConstraint(item: alertView, attribute: .trailing, relatedBy: .equal, toItem: view, attribute: .trailing, multiplier: 1, constant: -20))
    view.addConstraint(NSLayoutConstraint(item: alertView, attribute: .leading, relatedBy: .equal, toItem: view, attribute: .leading, multiplier: 1, constant: 20))

    // Centre it vertically
    view.addConstraint(NSLayoutConstraint(item: alertView, attribute: .centerY, relatedBy: .equal, toItem: view, attribute: .centerY, multiplier: 1, constant: 0))

    // Set the fixed height constraint
    let fixedHeight: CGFloat = 100
    view.addConstraint(NSLayoutConstraint(item: alertView, attribute: .height, relatedBy: .equal, toItem: nil, attribute: .height, multiplier: 0, constant: fixedHeight))
}

无论设备、超级视图、方向等如何变化,这都会让你得到你想要的。