Программно создаем представление тегов в Cocoa Swift Macos

#macos #cocoa #tags #swift4.2

#macos #cocoa #Теги #swift4.2

Вопрос:

Мне нужно скопировать всплывающее окно просмотра тегов, которое есть в Finder.[Просмотр тегов Finder]https://i.stack.imgur.com/QCufn.png, но с той разницей, что представление тегов должно находиться внутри scrollview с целью разрешения только 5 видимых строк тегов

Я начал с NSTextView, но когда я добавляю кнопку внутри TextView, текст всегда находится за тегами, то есть теги закрывают написанный текст. https://i.stack.imgur.com/eeJWy.png

Как я могу сделать что-то похожее на finder?

Спасибо

Редактировать

Я пытаюсь использовать NSTokenField, но что-то пошло не так, потому что scrollview не прокручивается:https://i.stack.imgur.com/sweDN.png

Это мой код:

 class SearchTagView:NSScrollView {


lazy var tokenizer: NSTokenField = {
    let tokenizer = NSTokenField(string: "")
    tokenizer.isEnabled = true
    tokenizer.isSelectable = true
    tokenizer.isEditable = true
    tokenizer.tokenStyle = NSTokenField.TokenStyle.squared
    tokenizer.font = NSFont(name: FontList.montserrat(weight: .medium).value, size: 13)
    tokenizer.textColor = .red
    tokenizer.cell?.image = nil
    tokenizer.cell?.wraps = true
    tokenizer.cell?.isScrollable = false
    tokenizer.usesSingleLineMode = false
    tokenizer.autoresizingMask = [.width, .height]
    return tokenizer
}()



override init(frame frameRect: NSRect) {
    super.init(frame: frameRect)
    translatesAutoresizingMaskIntoConstraints = false
    addSubview(tokenizer)
    tokenizer.translatesAutoresizingMaskIntoConstraints = false
    tokenizer.pinToSuperView()
}


override func viewDidMoveToSuperview() {
    super.viewDidMoveToSuperview()
    documentView = tokenizer
}


required init?(coder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}
  

}

Замечание:

Scrollview привязан к superview в начале, конце и сверху, и его высота составляет от 35 до 75 дюймов с ограничениями:

  NSLayoutConstraint.activate([
   searchTagView.topAnchor.constraint(equalTo: contentView.topAnchor),
            searchTagView.leadingAnchor.constraint(equalTo: contentView.leadingAnchor, constant: 16),
            searchTagView.trailingAnchor.constraint(equalTo: contentView.trailingAnchor, constant: -16),
            searchTagView.heightAnchor.constraint(greaterThanOrEqualToConstant:35),
            searchTagView.heightAnchor.constraint(lessThanOrEqualToConstant:70),
    ])
  

Комментарии:

1. Вы смотрели на NSTokenField?

2. @Marek H Как я могу изменить цвет токенов?. Спасибо

3. // Этот метод позволяет изменять стиль для отдельных токенов, а также создавать смешанный текст и токены. — (NSTokenStyle)tokenField:(NSTokenField *)tokenField styleForRepresentedObject:(id)Представленный объект;

4. @MarekH Не могли бы вы привести мне пример, пожалуйста?

5. 1. Не создавайте подкласс scrollview. Создаем подкласс NSView и устанавливаем его как documentView из scrollview. 2. Подкласс NSTokenField и переопределяющий его tokenField: styleForRepresentedObject: 3. Если вам нужно NSTokenField большого размера, найдите ключевые слова «nstextfield с гибкой высотой» — NSTokenField является подклассом NSTextField.