Обновите фрейм UIView с меткой в ​​нем после изменения содержимого метки - PullRequest
0 голосов
/ 23 декабря 2018

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

Однако возникает проблема.Когда я создаю экземпляр let customView = CustomView(), а затем назначаю новый текст метке, такой как customView.textLabel.text "New text", рамка пользовательского представления по-прежнему равна нулю.Я думаю, это потому, что я не установил кадр в начале.

Если я решу установить начальный кадр во время инициализации (let customView = CustomView(CGFrame(...))), а затем обновить содержимое метки, кадр не изменитсяего width.Зачем?Как я могу иметь динамическое представление, которое адаптирует его фрейм к его содержанию?Вызов sizeToFit на метке или в представлении не меняет фрейм.

Ответы [ 3 ]

0 голосов
/ 23 декабря 2018

Сначала нам нужно взглянуть на ваш код вашего пользовательского класса, но, насколько я помню, вам нужно установить ограничения для определения размера вашего представления.Самый простой способ - создать представление cutom с помощью xcode. учебник здесь но я предполагаю, что вы уже знакомы с этим.Поэтому иногда вам нужно сказать стрижам uikit восстановить / обновить ограничения.

0 голосов
/ 23 декабря 2018

Как получить динамическое представление, адаптирующее его фрейм к его содержимому?

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

Обратите внимание, что размер внутреннего содержимого магическим образом не знает своих собственных зависимостей;каждый раз, когда вы изменяете зависимость (например, текст метки), вам нужно вызывать invalidateIntrinsicContentSize, чтобы снова вызывать intrinsicContentSize для пересчета высоты и ширины.

В этом примере CustomViewкрасный вид и метка внутри него на белом фоне - это textLabel.Обратите внимание, что красный вид автоматически расширяется и сжимается синхронно с автоматическим расширением и сжатием метки при изменении текста метки.

enter image description here

Этоочень простой пример для иллюстрации, поэтому моя реализация CustomView очень проста:

class CustomView : UIView {
    @IBOutlet var textLabel : UILabel!
    override var intrinsicContentSize: CGSize {
        let w = self.textLabel.intrinsicContentSize.width + 40
        let h = self.textLabel.intrinsicContentSize.height + 40
        return CGSize(width: w, height: h)
    }
}

А теперь кнопки просто говорят такие вещи:

    self.customView.textLabel.text = // whatever
    self.customView.invalidateIntrinsicContentSize()
0 голосов
/ 23 декабря 2018

Вы можете попробовать

let customView = CustomView(frame:CGRect.zero)
customView.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(customView)
NSLayoutConstraint.activate([ 
    customView.topAnchor.constraint(equalTo: self.view.topAnchor,constant: 50),
    customView.leadingAnchor.constraint(equalTo: self.view.leadingAnchor,constant: 20)
])

customView.lbl.text = "fjdfjdfkjkdfjkdfjjfkdjfkdjkdfjkdfjkdfjfkdjdfkjdfkjkffkj"

class CustomView: UIView {
  var lbl:UILabel!
    override init(frame: CGRect) {
        super.init(frame: frame)
        createSubviews()
    }
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        createSubviews()
    }
    func createSubviews() {
     // craete the label and pin it to all anchors with .lines = 0
      lbl = UILabel()
      lbl.translatesAutoresizingMaskIntoConstraints = false
      lbl.lines = 0
      self.addSubview(lbl)
      NSLayoutConstraint.activate([ 
        lbl.topAnchor.constraint(equalTo: self.topAnchor),
        lbl.leadingAnchor.constraint(equalTo: self.leadingAnchor),
        lbl.trailingAnchor.constraint(equalTo: self.trailingAnchor),
        lbl.bottomAnchor.constraint(equalTo: self.bottomAnchor)
      ])

    }
}

Примечание: метка для переноса, она / родитель должны иметь ширину

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