ios: 带有 Aspect Fill 的 UIImageView 不符合约束条件

ios: UIImageView with Aspect Fill not fitting the constraint

我有如下设计。使用故事板 我尝试了多种方法,但所有的努力都是徒劳的。

1 - 视图控制器的主要默认视图 2 - 包含图像视图和 2 个等宽按钮的视图 3 - 具有纵横比填充的图像视图(需要根据 iPhone 大小占用尽可能多的 space)

除 1 个约束外,我做对的一切。包含 2 个按钮的 ImageView 和 View 之间的约束。 (对按钮使用堆栈视图)

在某些屏幕尺寸下,纵横比填充的图像视图与堆栈视图重叠。 Aspect Fit 留下很多白色 space.

Image View 需要根据大小缩放所有 iPhones! (那个好像是Aspect Fill解决的,不是aspect fit) 如何解决ImageView缩放时保持Image + 2个按钮垂直居中(Rectangle 2垂直和水平居中)的问题?

编辑: 我也试过 "Clip to Bound",但它会在侧面剪裁图像。我想知道完整的设置,每个视图应该做什么,或者每个视图应该如何组织才能达到效果?

也许您的约束设置正确。尝试为图像视图设置 "Clip To Bounds" 标志。

除此之外,您可以向 imageview 添加一个纵横比约束,使其与它包含的图像的纵横比相匹配。

更新

这是您如何以编程方式设置约束(例如在 viewDidLoad 中):

let containerView: UIView = {
    let cv = UIView()
    cv.translatesAutoresizingMaskIntoConstraints = false
    cv.backgroundColor = UIColor.lightGrayColor()
    return cv
}()
let imageView: UIImageView = {
    let iv = UIImageView()
    iv.translatesAutoresizingMaskIntoConstraints = false
    iv.backgroundColor = UIColor.darkGrayColor()
    iv.image = UIImage(named: "Forest") // YOUR IMAGE HERE
    return iv
}()
let leftButton: UIButton = {
    let lb = UIButton(type: .System)
    lb.translatesAutoresizingMaskIntoConstraints = false
    lb.setTitle("Left Button", forState: .Normal)
    return lb
}()
let rightButton: UIButton = {
    let rb = UIButton(type: .System)
    rb.translatesAutoresizingMaskIntoConstraints = false
    rb.setTitle("Right Button", forState: .Normal)
    return rb
}()
let stackView: UIStackView = {
   let sv = UIStackView()
    sv.translatesAutoresizingMaskIntoConstraints = false
    sv.axis = .Horizontal
    sv.distribution = .FillEqually
    return sv
}()

stackView.addArrangedSubview(leftButton)
stackView.addArrangedSubview(rightButton)

view.addSubview(containerView)
NSLayoutConstraint.activateConstraints(NSLayoutConstraint.constraintsWithVisualFormat("|-[cv]-|", options: [], metrics: nil, views: ["cv": containerView]))
containerView.centerYAnchor.constraintEqualToAnchor(view.centerYAnchor).active = true

containerView.addSubview(imageView)
containerView.addSubview(stackView)
NSLayoutConstraint.activateConstraints(NSLayoutConstraint.constraintsWithVisualFormat("|-[iv]-|", options: [], metrics: nil, views: ["iv": imageView]))
NSLayoutConstraint.activateConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|-[iv]-[sv]-|", options: [.AlignAllLeading, .AlignAllTrailing], metrics: nil, views: ["iv": imageView, "sv": stackView]))

let image = imageView.image!
imageView.addConstraint(NSLayoutConstraint(item: imageView, attribute: .Width, relatedBy: .Equal, toItem: imageView, attribute: .Height, multiplier: image.size.width / image.size.height, constant: 0))

这是结果: