Подтвердить что ты не робот

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

Фон

Я делаю вертикальную метку для использования с традиционным монгольским script. Прежде чем я только вращал UILabel, но были проблемы с производительностью и другие сложности с этим. Теперь я работаю над созданием ярлыка с нуля. Тем не менее, мне нужна вертикальная метка, чтобы сообщить авто макет, когда его высота настраивается (на основе длины строки).

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

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

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

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

Что я пытаюсь

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

4b9b3361

Ответ 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)

Обратите внимание, что в...

важный частный случай представления стека:

  • Вы устанавливаете только ОДИН якорь (для вертикального стека, высота; для горизонтальной ширины)

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

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

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