Вопрос:

NSTextField, который становится выше, используя Swift и Auto Layout

cocoa autolayout nstextfield

406 просмотра

1 ответ

5681 Репутация автора

Xcode 9.1, Swift 4

Я пытаюсь создать NSTextFieldтекст, который растет по мере того, как пользователь вводит текст. Так же, как в iMessage на Mac. Вот пример видео: http://d.pr/v/zWRA6w

Я настроил NSViewsэто так, чтобы я мог поместить собственный дизайн вокруг NSTextFieldи просто оставить его границы по умолчанию и фон:

введите описание изображения здесь

Вот мои ограничения. Чат беседа прокручивается под окном чата. введите описание изображения здесь введите описание изображения здесь введите описание изображения здесь

Я попытался следовать этому ответу и создал следующую версию Swift:

class ResizingTextField: NSTextField{
  var isEditing = false
  override func textDidBeginEditing(_ notification: Notification) {
    super.textDidBeginEditing(notification)
    isEditing = true
  }
  override func textDidEndEditing(_ notification: Notification) {
    super.textDidEndEditing(notification)
    isEditing = false
  }
  override func textDidChange(_ notification: Notification) {
    super.textDidChange(notification)
    self.invalidateIntrinsicContentSize()
  }
  override public var intrinsicContentSize: CGSize {
    if isEditing{
      let fieldEditor = self.window?.fieldEditor(false, for: self)
      if fieldEditor != nil{
        if let cellCopy = self.cell?.copy() as? NSTextFieldCell{
          cellCopy.stringValue = fieldEditor!.string
          return cellCopy.cellSize
        }
      }
    }
    return self.cell!.cellSize
  }
}

Но должно быть что-то не так с моими ограничениями и / или кодом, так как ничего не происходит, когда я печатаю в поле.

Какие-либо предложения?

Автор: Clifton Labrum Источник Размещён: 08.11.2017 11:00

Ответы (1)


3 плюса

5681 Репутация автора

Решение

Я сталкивался с этим, который работал: https://gist.github.com/entotsu/ddc136832a87a0fd2f9a0a6d4cf754ea

Мне пришлось немного обновить код для работы со Swift 4 :

class AutoGrowingTextField: NSTextField {

  var minHeight: CGFloat? = 22
  let bottomSpace: CGFloat = 7
  // magic number! (the field editor TextView is offset within the NSTextField. It’s easy to get the space above (it’s origin), but it’s difficult to get the default spacing for the bottom, as we may be changing the height

  var heightLimit: CGFloat?
  var lastSize: NSSize?
  var isEditing = false

  override func textDidBeginEditing(_ notification: Notification) {
    super.textDidBeginEditing(notification)
    isEditing = true
  }
  override func textDidEndEditing(_ notification: Notification) {
    super.textDidEndEditing(notification)
    isEditing = false
  }
  override func textDidChange(_ notification: Notification) {
    super.textDidChange(notification)
    self.invalidateIntrinsicContentSize()
  }

  override var intrinsicContentSize: NSSize {
    var minSize: NSSize {
      var size = super.intrinsicContentSize
      size.height = minHeight ?? 0
      return size
    }
    // Only update the size if we’re editing the text, or if we’ve not set it yet
    // If we try and update it while another text field is selected, it may shrink back down to only the size of one line (for some reason?)
    if isEditing || lastSize == nil {

      //If we’re being edited, get the shared NSTextView field editor, so we can get more info
      guard let textView = self.window?.fieldEditor(false, for: self) as? NSTextView, let container = textView.textContainer, let newHeight = container.layoutManager?.usedRect(for: container).height
      else {
          return lastSize ?? minSize
      }
      var newSize = super.intrinsicContentSize
      newSize.height = newHeight + bottomSpace

      if let heightLimit = heightLimit, let lastSize = lastSize, newSize.height > heightLimit {
        newSize = lastSize
      }

      if let minHeight = minHeight, newSize.height < minHeight {
        newSize.height = minHeight
      }

      lastSize = newSize
      return newSize
    }
    else {
      return lastSize ?? minSize
    }
  }
}
Автор: Clifton Labrum Размещён: 11.11.2017 04:26
Вопросы из категории :
32x32