Изображение неправильно отображается в NSTextField

Я хочу использовать объект - NSTextField для отображения изображения. Но результат не правильный.

размер изображения 32х32.

мой код такой:

class ViewController: NSViewController {

var text: NSTextField!

override func viewDidLoad() {
    super.viewDidLoad()

    text = NSTextField(frame: NSRect(origin: CGPoint(x: 200, y: 200), size: CGSize(width: 32, height: 32)))
    text.backgroundColor = .clear
    text.isBordered = true
    text.isEditable = false

    let attachment = NSTextAttachment()
    attachment.image = NSImage(named: NSImage.Name(rawValue: "Group_8"))
    attachment.bounds = NSRect(origin: .zero, size: (attachment.image?.size)!)

    let string = NSAttributedString(attachment: attachment)

    text.attributedStringValue = string

    view.addSubview(text)


    // Do any additional setup after loading the view.
}

Финал отображается так:

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

Почему появляются белые пустые области?


person Henry    schedule 30.03.2018    source источник
comment
Было бы странно, если бы текст касался границы. NSImageView больше подходит для отображения изображений.   -  person Willeke    schedule 30.03.2018


Ответы (2)


Хотя я согласен с @Willeke в том, что вы должны использовать NSImageView, вы видите «рамку» NSTextField.

Вы можете отключить его, добавив

text.isBezeled = false

к вашему коду.

person smee    schedule 31.03.2018
comment
NSTextView или NSTextField? Будет ли граница все еще видна? - person Willeke; 01.04.2018
comment
NSTextField: developer.apple.com/documentation/appkit/nstextfield/ . Да, граница по-прежнему будет видна, хотя по цвету она очень близка к фону вашего изображения, поэтому ее будет трудно увидеть. - person smee; 01.04.2018
comment
В документации isBezeled сказано, что если НЕТ, получатель не рисует границу. isBezeled должно быть установлено перед isBordered. - person Willeke; 01.04.2018
comment
Вы правы. Нет границы, если рамка отключена - артефакт изображения, которое я использовал. - person smee; 01.04.2018
comment
Я нашел ответ на stackoverflow.com/a/14038008/1039703, спасибо вам обоим - person Henry; 02.04.2018

Вы можете установить свойство: lineFragmentPadding = 0. белая прокладка исчезнет.

Потому что причина в том, что:

Отступ появляется в начале и конце прямоугольников фрагмента строки. Менеджер компоновки использует это значение для определения ширины компоновки. Значение этого свойства по умолчанию — 5,0.

person Henry    schedule 06.05.2018