我有一个UIImageView内部UIView位于水平UIStackView内部(带有.fillequality选项)。HorizontalUIStackView始终有两个视图。HorizontalUIStackView从其最高的subUIView获取其高度。
我想实现的是:在示例屏幕截图中,当考虑多行视图时,UIImageView的图像大小会更大。但是,我希望图像视图缩小到适合左(多行标签)视图的大小。这在第二张截图中显示。图片应该有一个高度,我显示通过红色椭圆线在右侧。
标签类为的UIImageView:

@IBDesignable class LabelWithImage: UIView {

var topMargin: CGFloat = 0.0
var verticalSpacing: CGFloat = 10.0
var bottomMargin: CGFloat = 0.0

@IBInspectable var labelText: String = "" { didSet { updateView() } }
@IBInspectable var image: UIImage = UIImage(named: "harcamagrafik")! { didSet { updateView() } }

fileprivate var label: UILabel!
fileprivate var imageView: UIImageView!

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

required public init?(coder: NSCoder) {
    super.init(coder:coder)
    setUpView()
}

override func prepareForInterfaceBuilder() {
    super.prepareForInterfaceBuilder()
    setUpView()
}

func setUpView() {

    label = UILabel()
    label.font = UIFont.init(name: "Metropolis-Medium", size: 12)
    label.numberOfLines = 1
    label.lineBreakMode = NSLineBreakMode.byWordWrapping
    label.textColor = UIColor.init(rgb: 0x9B9B9B)

    imageView = UIImageView(image: image)
    imageView.contentMode = .scaleAspectFill
    imageView.clipsToBounds = true

    addSubview(label)
    addSubview(imageView)

    label .translatesAutoresizingMaskIntoConstraints = false
    imageView.translatesAutoresizingMaskIntoConstraints = false
    setContentHuggingPriority(.init(rawValue: 1000.0), for: .vertical)
    setContentCompressionResistancePriority(.init(rawValue: 10.0), for: .vertical)

    label.leftAnchor.constraint(equalTo: leftAnchor, constant: 0.0).isActive = true
   // imageView.leftAnchor.constraint(equalTo: leftAnchor, constant: 0.0).isActive = true

    label.rightAnchor.constraint(equalTo: rightAnchor, constant: 0.0).isActive = true
   // imageView.rightAnchor.constraint(equalTo: rightAnchor, constant: 0.0).isActive = true

    imageView.centerXAnchor.constraint(equalTo: centerXAnchor).isActive = true
    label.topAnchor.constraint(equalTo: topAnchor, constant: topMargin).isActive = true
    imageView.topAnchor.constraint(equalTo: label.bottomAnchor, constant: verticalSpacing).isActive = true
    bottomAnchor.constraint(equalTo: imageView.bottomAnchor, constant: bottomMargin).isActive = true

    // call common "refresh" func
    updateView()
}

func updateView() {
    label.text = labelText
    accessibilityIdentifier = labelText
    imageView.image = image
    label.sizeToFit()
}
}

水平堆叠视图:
private let topHorizontalStackView: UIStackView = {
let s = UIStackView()
s.distribution = .fillEqually
s.spacing = 10
s.axis = .horizontal
s.alignment = .fill
s.translatesAutoresizingMaskIntoConstraints = false
return s
}()

编辑我试图设置我的LabelWithImageView的高度限制。现在,它看起来没问题,但是当我打开调试器时,它说视图的高度不明确。
leftView.layoutIfNeeded() //It is the view with multilineLabel.
view.heightAnchor.constraint(equalToConstant: leftView.bounds.height).isActive = true

ios - 在UIStackView中更改UIImageView的高度优先级-LMLPHP
我想在截图中显示的内容:
ios - 在UIStackView中更改UIImageView的高度优先级-LMLPHP
编辑2在我将标签设置为@Don said优先级并将图像视图的压缩设置为low之后,我得到了下面的结果。下面的代码仍然有效
leftView.layoutIfNeeded() //It is the view with multilineLabel. view.heightAnchor.constraint(equalToConstant: leftView.bounds.height).isActive = true
如果我给labelWithImageView指定常量为(40是UIStackView的顶部和底部插入);
view.heightAnchor.constraint(equalToConstant: leftView.bounds.height - 40).isActive = true

顶部垂直UIStackView内的视图显示了雄心勃勃的布局。(你在截图中看不到这些视图,因为我猜它们是不相关的。)
ios - 在UIStackView中更改UIImageView的高度优先级-LMLPHP

最佳答案

好吧,看起来你的约束是错误的,这里我做了一个附加屏幕的例子,这样你可以重新创建我的约束
这里有一个解释:在左视图中设置自己的约束来填充视图(检查是否有歧义,因为右视图应该从左视图获取大小),将其内部的所有标签的垂直内容拥抱优先级设置为1000
在右边的一个你只需要设置标题垂直内容拥抱优先权为1000(+基本需要的限制,如前导,尾随和顶部填充视图)和中提琴,图像将变形成任何大小需要匹配左视图的大小。
ios - 在UIStackView中更改UIImageView的高度优先级-LMLPHP

关于ios - 在UIStackView中更改UIImageView的高度优先级,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58799892/

10-11 09:19
查看更多