Как создать пользовательский тематический NSButton без подкласса NSButtonCell?
В настоящее время я работаю над пользовательским тегом NSButton
. Каждый учебник или руководство, которое я нашел, требуют подкласса NSButtonCell
, даже руководство от Apple.
Все они выглядят устаревшими, потому что все клеточные методы в NSControl
устарели в Yosemite. Я не нашел рекомендаций или руководств, которые следует использовать в качестве замены.
Это единственное утверждение, которое я могу найти:
Постепенное отклонение NSCell
Mac OS X 10.10 делает еще один шаг к окончательному клетки. Прямой доступ к ячейке элемента управления обескуражен и методы, которые допускают его, будут формально устаревать в последующем выпуск. Разнообразные API-интерфейсы на уровне клеток были Контрольные подклассы, чтобы обеспечить свободный доступ к важным функциональность. NSLevelIndicator, NSTextField, NSSearchField, NSSlider, и NSPathControl имеют новые свойства для этой цели. Клеточная NSTableViews теперь устарели, а NSTableViews на основе представлений должны быть используется вместо этого. Матричные NSBrowsers также устарели в пользу интерфейс на основе элементов.
Отрывок из: Заметки о выпуске AppKit для OS X v10.10
Нет слов на NSButton
, хотя.
NSTextField
поддерживает просмотры с поддержкой слоев; из-за этого я пробовал такой же подход на моем NSButton
, но это не имеет никакого эффекта.
var btn = NSButton(NSMakeRect(0, 0, 50, 20))
btn.wantsLayer = true
btn.bordered = false
btn.layer?.backgroundColor = NSColor(calibratedWhite: 0.99, alpha: 1).CGColor
btn.layer?.borderWidth = 1
btn.layer?.borderColor = NSColor(calibratedWhite: 0.81, alpha: 1).CGColor
Ответы
Ответ 1
Я бы определенно потратил больше времени на поиск подхода layer-backed view
. Я не уверен, почему это не сработало для вас, потому что нет причин для того, чтобы слои не работали над NSButton
(фактически производной NSView
).
Кроме того, взвешивание при взгляде на слои является вашим упоминанием об анимации.
Некоторый код, извлеченный из проекта, над которым я работаю (custom NSButton
):
Из init()...
self.wantsLayer = true
self.layerContentsRedrawPolicy = NSViewLayerContentsRedrawPolicy.OnSetNeedsDisplay
self.layer?.borderColor = NSColor.gridColor().CGColor
self.layer?.borderWidth = 0.5
self.layer?.backgroundColor = NSColor.whiteColor().CGColor
Затем вы можете получить мелкозернистый контроль в цикле отображения, специфичном для слоев, с помощью:
override var wantsUpdateLayer:Bool{
return true
}
override func updateLayer() {
// your code here
super.updateLayer()
}
Если ваша пользовательская кнопка нуждается в форме, вы можете даже использовать CAShapeLayer ниже, чтобы сделать ваш фоновый слой специальной формой... подробнее для изучения.
override func makeBackingLayer() -> CALayer {
return CAShapeLayer()
}