У меня есть UIImageView
внутри UIView
внутри горизонтальной UIStackView
(с опцией .fillEqually). Горизонтальная UIStackView
всегда имеет два вида. Горизонтальный UIStackView
получает свою высоту от своего самого высокого сабвуфера UIView
.
Чего я хочу добиться: На снимке экрана с примером UIImageView имеет больший размер, если рассматривать его с многострочными представлениями из-за его размера изображения. Однако я хочу, чтобы представление изображения уменьшалось до размера, соответствующего левому (многострочное обозначение). Это показано на втором скриншоте. Изображение должно иметь высоту, которую я показываю через красную овальную линию с правой стороны.
UIImageView с меткой Class:
@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()
}
}
Горизонтальный StackView:
private let topHorizontalStackView: UIStackView = {
let s = UIStackView()
s.distribution = .fillEqually
s.spacing = 10
s.axis = .horizontal
s.alignment = .fill
s.translatesAutoresizingMaskIntoConstraints = false
return s
}()
РЕДАКТИРОВАТЬ Я попытался установить ограничение высоты для моего представления LabelWithImage. Теперь это выглядит нормально, но когда я открываю отладчик, он говорит, что высота неоднозначна для вида.
leftView.layoutIfNeeded() //It is the view with multilineLabel.
view.heightAnchor.constraint(equalToConstant: leftView.bounds.height).isActive = true
ЧтоЯ хочу показать на скриншоте:
РЕДАКТИРОВАТЬ 2 После того, как я отдаю приоритет метке, как сказал @Don и установилСжатие до низкого при просмотре изображения, я получил ниже результат. Приведенный ниже код все еще активен, например:
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 показывает амбициозный макет. (Вы не можете видеть эти виды на скриншотах, потому что я думаю, что они не связаны.)