Как установить собственный размер встроенного содержимого в Swift?
Фон
Я делаю вертикальную метку для использования с традиционным монгольским script. Прежде чем я только вращал UILabel
, но были проблемы с производительностью и другие сложности с этим. Теперь я работаю над созданием ярлыка с нуля. Тем не менее, мне нужна вертикальная метка, чтобы сообщить авто макет, когда его высота настраивается (на основе длины строки).
Что я прочитал
Я прочитал Внутренний размер содержимого и Представления с внутренним размером содержимого документация. Это было больше о том, как его использовать, но не о том, как определить его в пользовательском представлении.
Поиск "внутреннего содержимого содержимого ios для пользовательского представления" дает мне
в переполнении стека. Этот конкретный вопрос даже не нуждался в собственном размере содержимого, поскольку их представление представляло собой просто сборку стандартных представлений.
Что я пытаюсь
То, что я пытаюсь, это мой ответ ниже. Я добавляю эту пару Q &, чтобы она не принимала других людей так долго, чтобы найти ответ, поскольку он взял меня с ключевыми словами поиска, которые я использовал.
Ответы
Ответ 1
Установка собственного размера содержимого пользовательского представления позволяет авторазметке знать, насколько большим должно быть это представление. Чтобы установить его, вам нужно переопределить intrinsicContentSize
.
override var intrinsicContentSize: CGSize {
return CGSize(width: x, height: y)
}
Тогда позвони
invalidateIntrinsicContentSize()
Всякий раз, когда ваш собственный вид изменяется, размер внутреннего содержимого изменяется, и фрейм следует обновлять.
Примечания
Ответ 2
Пример "вида с внутренней высотой"...
@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
}
override func prepareForInterfaceBuilder() {
invalidateIntrinsicContentSize()
}
}
![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)
Обратите внимание, что в...
важный частный случай представления стека:
- Вы устанавливаете только ОДИН якорь (для вертикального стека, высота; для горизонтальной ширины)
Итак, установка внутренней высоты работает отлично, так как:
- Внутренняя высота действительно означает, что привязка высоты определенно будет установлена автоматически при необходимости.
Помня, что во всех обычных случаях подпредставления, много других якорей необходимы.