Как установить внутренний размер содержимого пользовательского представления в Swift?

фон

Я делаю вертикальную метку для использования с традиционным монгольским шрифтом. Раньше я просто вращал UILabel но были и некоторые проблемы с производительностью и другие осложнения с этим. Сейчас я работаю над созданием этикетки с нуля. Однако мне нужна вертикальная метка, чтобы сообщить автоматический макет, когда его высота регулируется (на основе длины строки).

что я прочитал

прочитал Внутренние Содержание Размер и представления с внутренним размером контента документация. Это было больше о том, как использовать его, а не как определить его в пользовательском представлении.

поиск "внутреннего размера содержимого ios для пользовательского представления" дает мне только

в переполнении стека. Этот вопрос даже не нужно внутренний размер контента, потому что их представление было просто сборкой стандартных представлений.

Я

то, что я пытаюсь, - это мой ответ ниже. Я добавляю эту пару Q&A, чтобы другим людям не потребовалось столько времени, чтобы найти ответ, сколько потребовалось мне с ключевыми словами поиска, которые я использовал.

2 ответов


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

override var intrinsicContentSize: CGSize {
   return CGSize(width: x, height: y)
}
вызов
invalidateIntrinsicContentSize()

всякий раз, когда внутренний размер содержимого пользовательского представления изменяется, и кадр должен быть обновлен.

Примечания


основываясь на отличном ответе выше,

пример "вид с внутренней высоте" ...

@IBDesignable
class HView: UIView {
    @IBInspectable var height: CGFloat = 100.0
    override var intrinsicContentSize: CGSize {
        return CGSize(width: 99, height: height)
        // if using in, say, a vertical stack view, the width is ignored
    }
}

enter image description here

, который вы можете установить как проверяемый

enter image description here

поскольку он имеет внутреннюю высоту, его можно (например) немедленно вставить в представление стека в коде:

stack?.insertArrangedSubview(HView(), at: 3)

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

let v:UIView = HView()
v.heightAnchor.constraint(equalToConstant: 100).isActive = true
stack?.insertArrangedSubview(v, at: 3)

обратите внимание, что в частном случае представления стека:

  • вы только должны потревожиться о одном только Анкере (для вертикального взгляда стога, высота; для горизонтальной ширины)

Итак, установка внутренней высоты работает отлично; так как

  • внутреннеприсущая высота действительно значит что анкер высоты специфически будет установлен автоматически если нужно.

вспоминая что во всех нормальных случаях подвида требуется много других якорей.