Подтвердить что ты не робот

Как создать пользовательский тематический 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
4b9b3361

Ответ 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()
}