Изменить приоритет высоты UIImageView внутри UIStackView - PullRequest
1 голос
/ 11 ноября 2019

У меня есть 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

Example View

ЧтоЯ хочу показать на скриншоте:

ss2

РЕДАКТИРОВАТЬ 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 показывает амбициозный макет. (Вы не можете видеть эти виды на скриншотах, потому что я думаю, что они не связаны.) ss3

1 Ответ

0 голосов
/ 12 ноября 2019

Ну, похоже, ваши ограничения неверны, здесь я сделал пример с прикрепленным экраном, чтобы вы могли воссоздать мои ограничения

Вот объяснение: в левом представлении установите свои собственные ограничения, чтобы заполнитьпредставление (проверьте на неоднозначность, так как правый вид должен получить размер от левого), установите все метки внутри него с приоритетом вертикального содержимого, равным 1000

на правом, вам просто нужно установить заголовок вертикального содержимогопри увеличении приоритета до 1000 (+ основные необходимые ограничения, такие как ведущий, конечный и верхний, чтобы заполнить вид) и альта, изображение превратится в любой размер, необходимый для соответствия размеру левого вида.

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...