2017-02-01 3 views
1

Я создаю приложение MacOS, и у меня возникли проблемы с стилем шрифта NSSearchField (с именем searchField). Мой код до сих пор выглядит следующим образом:Стиль заполнитель текста NSSearchField и NSTextField?

Заявленный на вершине одного основного класса ViewController:

let normalTextStyle = NSFont(name: "PT Mono", size: 14.0) 

let backgroundColour = NSColor(calibratedHue: 0.6, 
           saturation: 0.5, 
           brightness: 0.2, 
           alpha: 1.0) 

let normalTextColour = NSColor(calibratedHue: 0.5, 
           saturation: 0.1, 
           brightness: 0.9, 
           alpha: 1.0) 

Объявленная в viewDidLoad:

searchField.backgroundColor = backgroundColour 
searchField.textColor = normalTextColour 
searchField.font = normalTextStyle 
searchField.centersPlaceholder = false 
searchField.currentEditor()?.font = normalTextStyle 
let attrStr = NSMutableAttributedString(string: "Search...", 
             attributes: [NSForegroundColorAttributeName: normalTextColour]) 
searchField.placeholderAttributedString = attrStr 

Как правило, это работает только в одном условии: когда поиск поле имеет фокус, но поисковый запрос не введен. В этом случае текст-заполнитель имеет правильный цвет, но шрифт, кажется, возвращается к умолчанию (Helvetica 12 point?). Как только что-то набирается, или поле теряет фокус, тогда правильный шрифт используется еще раз.

Я не пробовал просматривать документы Apple для каких-либо настроек шрифта или цвета, которые в настоящее время не установлены. Я искал все настройки шрифта, которые я мог найти в построителе интерфейса, включая привязки какао и обычные настройки в инспекторе.

Нужно ли установить значение currentEditor? Я предполагаю, что не потому, что шрифт меняется после ввода текста. Я застрял - может ли кто-нибудь помочь?

EDIT: теперь я попытался использовать NSTextField, и результаты совпадают. У кого-нибудь есть идеи?

+0

Вы можете сделать UITextField, который действует как строку поиска и то плесень, как вам нравится. Поиск Бары намного сложнее правильно настроить из моего понимания. – Sethmr

+0

@Sethmr Прочтите этот вопрос или посмотрите на теги. –

ответ

0

В конце концов мне удалось найти ответ. Я создал новый класс TitleTextFormatter типа Formatter, который является «is intended for subclassing. A custom formatter can restrict the input and enhance the display of data in novel ways». Все, что мне нужно сделать, это переопределить некоторые функции по умолчанию, чтобы получить то, что мне было нужно:

import Cocoa 

class TitleTextFormatter: Formatter { 

    override func string(for obj: Any?) -> String? {  
    /* 
    * this function receives the object it is attached to. 
    * in my case it only ever receives an NSConcreteAttributedString 
    * and returns a plain string to be formatted by other functions 
    */ 

    var result: String? = nil 
    if let attrStr = obj as? NSAttributedString { 
     result = attrStr.string 
    } 
    return result 
    } 

    override func getObjectValue(_ obj: AutoreleasingUnsafeMutablePointer<AnyObject?>?, 
           for string: String, 
           errorDescription error: AutoreleasingUnsafeMutablePointer<NSString?>?) -> Bool { 
    /* 
    * this function in general is overridden to provide an object created 
    * from the input string. in this instance, all I want is an attributed string 
    */ 

    let titleParagraphStyle = NSMutableParagraphStyle() 
    titleParagraphStyle.alignment = .center 

    let titleAttributes = [NSAttributedStringKey.foregroundColor: NSColor.mainText, 
          NSAttributedStringKey.font: NSFont.titleText, 
          NSAttributedStringKey.paragraphStyle: titleParagraphStyle] 

    let titleAttrStr = NSMutableAttributedString(string: string, 
               attributes: titleAttributes) 

    obj?.pointee = titleAttrStr 
    return true 
    } 

    override func attributedString(for obj: Any, 
           withDefaultAttributes attrs: [NSAttributedStringKey : Any]? = nil) -> NSAttributedString? { 
    /* 
    * is overridden to show that an attributed string is created from the 
    * formatted object. this happens to duplicate what the previous function 
    * does, only because the object I want to create from string is an 
    * attributed string 
    */ 

    var titleAttrStr: NSMutableAttributedString? 

    if let str = string(for: obj) { 
     let titleParagraphStyle = NSMutableParagraphStyle() 
     titleParagraphStyle.alignment = .center 

     let titleAttributes = [NSAttributedStringKey.foregroundColor: NSColor.mainText, 
           NSAttributedStringKey.font: NSFont.titleText, 
           NSAttributedStringKey.paragraphStyle: titleParagraphStyle] 

     titleAttrStr = NSMutableAttributedString(string: str, 
               attributes: titleAttributes) 
    } 

    return titleAttrStr 

    } 

} 

, а затем в viewDidLoad я добавил следующее:

let titleTextFormatter = TitleTextFormatter() 
titleTextField.formatter = titleTextFormatter 
Смежные вопросы