Недавно Apple представила миру новую линейку MacBook Pro. И одной из особенностей свежей версии стало то, что верхний ряд системных кнопок в ней удален – вернее, заменен на мультитач экран. Разработчикам это нововведение должно быть интересно в первую очередь, ведь на панели выделена область, которую можно использовать в собственных приложениях. Компания Apple даже предоставила API для ее использования. В этой статье мы расскажем и покажем, как осваивали возможности NSTouchBar. Полученные знания мы впоследствии применили в апдейте MaCleaner.
Для начала давайте разберемся, что вообще представляет собой NSTouchBar.
Application Region – это, собственно, та самая часть, которая отводится под нужды приложения. Именно здесь будет отображаться все, что необходимо для корректной его работы.
Control Strip – системная панель. Сюда разработчику вход закрыт – ни помещать свои объекты, ни как-то еще ее модифицировать мы не можем. Здесь находятся кнопки, которые раньше были на месте NSTouchBar – изменение яркости, громкости и другие.
System Button – системная кнопка
Для того чтобы внедрять поддержку NSTouchBar в свои проекты, необязательно иметь новенький MacBookPro с тачбаром. В Xcode есть его симулятор, который вызывается через Window > Show Touch Bar. Однако воспользоваться им вы сможете только при условии, что у вашего Xcode версия минимум 8.1, а у системы – 10.12.1, причем с билдом не ниже 16B2657.
Итак, вы усердно трудились и написали чудесное приложение – оно висит в статус баре, показывает во всплывающем окне системное оформление рабочего стола и меняет его на тот прикид, который выберет пользователь. Выглядит все это так:
Если вы загорелись этим чудесным приложением – можете скачать версию без NSTouchBar здесь и работать над ним вместе с нами.
Теперь введем в наш проект поддержку NSTouchBar. Для начала подключим NSTouchBar и выведем в нем “Hello World!”. Добавим в наш MainPopoverController следущее расширение:
@available(OSX 10.12.1, *)
extension MainPopoverController : NSTouchBarDelegate {
override open func makeTouchBar() -> NSTouchBar? {
let touchBar = NSTouchBar()
touchBar.delegate = self
touchBar.customizationIdentifier = NSTouchBarCustomizationIdentifier("My First TouchBar")
touchBar.defaultItemIdentifiers = [NSTouchBarItemIdentifier("HelloWorld")]
touchBar.customizationAllowedItemIdentifiers = [NSTouchBarItemIdentifier("HelloWorld")]
return touchBar
}
}
func touchBar(_ touchBar: NSTouchBar, makeItemForIdentifier identifier: NSTouchBarItemIdentifier) -> NSTouchBarItem? {
switch identifier {
case NSTouchBarItemIdentifier("HelloWorld"):
let customViewItem = NSCustomTouchBarItem(identifier: identifier)
customViewItem.view = NSTextField(labelWithString: "Hello World!")
return customViewItem
default:
return nil
}
}
class MainPopoverView: NSView {
override var acceptsFirstResponder: Bool {
get {
return true
}
}
}
func touchBar(_ touchBar: NSTouchBar, makeItemForIdentifier identifier: NSTouchBarItemIdentifier) -> NSTouchBarItem? {
switch identifier {
case NSTouchBarItemIdentifier("HelloWorld"):
let scrubberItem = NSCustomTouchBarItem(identifier: identifier)
let scrubber = NSScrubber()
scrubber.scrubberLayout = NSScrubberFlowLayout()
scrubber.register(NSScrubberImageItemView.self, forItemIdentifier: "ScrubberItemIdentifier")
scrubber.mode = .free
scrubber.selectionBackgroundStyle = .roundedBackground
scrubber.delegate = self
scrubber.dataSource = self
scrubberItem.view = scrubber
return scrubberItem
default:
return nil
}
}
@available(OSX 10.12.1, *)
extension MainPopoverController: NSScrubberDataSource, NSScrubberDelegate, NSScrubberFlowLayoutDelegate {
func numberOfItems(for scrubber: NSScrubber) -> Int {
return wardrobe.wallpapers.count
}
func scrubber(_ scrubber: NSScrubber, viewForItemAt index: Int) -> NSScrubberItemView {
let itemView = scrubber.makeItem(withIdentifier: "ScrubberItemIdentifier", owner: nil) as! NSScrubberImageItemView
itemView.image = wardrobe.wallpapers[index].picture
return itemView
}
func scrubber(_ scrubber: NSScrubber, didSelectItemAt index: Int) {
scrubber.selectedIndex = -1
if let screen = NSScreen.main() {
do {
try NSWorkspace.shared().setDesktopImageURL( wardrobe.wallpapers[index].url, for: screen, options: [:])
} catch {
print(error)
}
}
}
func scrubber(_ scrubber: NSScrubber, layout: NSScrubberFlowLayout, sizeForItemAt itemIndex: Int) -> NSSize {
return NSSize(width: 60, height: 30)
}
}
К сожалению, не доступен сервер mySQL