Touch Bar on Catalyst #potatotip

249b3122eee454c0a818bfe7851418e4?s=47 fromkk
April 27, 2020

Touch Bar on Catalyst #potatotip

4/27(月)の20時からオンラインで開催された[Online] potatotips #69 iOS/Android開発Tips共有会で登壇した資料です。
Catalyst自体はWWDC 2018で発表されたmacOS MojaveでApple製のアプリケーションの一部にUIKitが利用され、Apple社内でテスト的に利用が開始されました。それらのアプリケーションとはNews、株価、ボイスメモ、ホームの4です。開発者向けには2019年のリリースとなることがアナウンスされました。そして翌年のWWDC 2019にてProject Catalystが発表され、macO向けのアプリケーションの開発にUIKitが利用できることが発表されました。もちろんiOSとmacOSには様々な違いがあるのですがそれらも吸収されています。(メニューバーで動作するアプリケーションなど非対応の機能もまだまだあります)それでも同じコードベースのアプリケーションがiPhone、iPad、Macで動作させることが可能になりました。その中でも今回はTouch Barの実装方法について調べたので発表します。

249b3122eee454c0a818bfe7851418e4?s=128

fromkk

April 27, 2020
Tweet

Transcript

  1. 5PVDI#BSPO$BUBMZTU QPUBUPUJQTJ04"OESPJE։ൃ5JQTڞ༗ձ

  2. 1SPpMF struct Profile { let name = "Kazuya Ueoka" let

    twitter = "@fromkk" let github = "fromkk" let qiita = "fromkk" let note = "fromkk" } • 2
  3. None
  4. IUUQTEFWFMPQFSBQQMFDPNWJEFPTQMBZXXED

  5. IUUQTEFWFMPQFSBQQMFDPNWJEFPTQMBZXXED

  6. IUUQTEFWFMPQFSBQQMFDPNWJEFPTQMBZXXED

  7. None
  8. IUUQTEFWFMPQFSBQQMFDPNWJEFPTQMBZXXED

  9. IUUQTEFWFMPQFSBQQMFDPNWJEFPTQMBZXXED

  10. IUUQTEFWFMPQFSBQQMFDPNWJEFPTQMBZXXED

  11. None
  12. 5PVDI#BSͱ͸ w ೥ʹൃച͞Εͨ.BDCPPL1SP͔Β౥ࡌ͞ΕͨΩʔϘʔ υͷԞଆʹ഑ஔ͞ΕΔσΟεϓϨΠ͖ͭͷίϯτϩʔϧόʔ w ൃച౰͔࣌Β&TDΩʔͱϑΝϯΫγϣϯΩʔ͕5PVDI#BSʹ ಺แ͞Εͯ͠·͍ࢍ൱྆࿦ w ೥݄ʹൃച͞Εͨ.BDCPPL1SPΠϯνͰ͸&TD Ωʔ͕෮ؼͨ͜͠ͱͰ଴ͪ๬ΜͰ͍ͨਓ͸େ׻ت

    12
  13. $BUBMZTUͰར༻ՄೳͳϘλϯͷछྨ 13

  14. ࣮૷ํ๏

  15. ࣮૷ํ๏ • NSTouchBar.CustomizationIdentifierΛఆٛ͢Δ • Touch BarͷछྨΛࣝผ͢Δ 15 extension NSTouchBar.CustomizationIdentifier {

    static let myTouchBar = NSTouchBar.CustomizationIdentifier( "me.fromkk.CatalystSampler.MyTouchBar" ) }
  16. ࣮૷ํ๏ 16 extension NSTouchBarItem.Identifier { static let prev = NSTouchBarItem.Identifier(

    "me.fromkk.CatalystSampler.prev" ) static let next = NSTouchBarItem.Identifier( "me.fromkk.CatalystSampler.next" ) } • NSTouchBarItem.IdentifierΛఆٛ͢Δ • Touch Barʹදࣔ͢Δ߲໨ͷछྨΛࣝผ͢Δ
  17. ࣮૷ํ๏ w $BUBMZTUͷ৔߹ʹ6*3FTQPOEFSʹ૿͍͑ͯΔNBLF5PVDI#BSϝιουΛ࣮૷͢Δ 17 #if targetEnvironment(macCatalyst) override func makeTouchBar() ->

    NSTouchBar? { let touchBar = NSTouchBar() touchBar.customizationIdentifier = .myTouchBar touchBar.defaultItemIdentifiers = [.prev, .next, .otherItemsProxy] touchBar.customizationAllowedItemIdentifiers = [.prev, .next] touchBar.delegate = self return touchBar } #endif
  18. NSTouchBarͷϓϩύςΟ • customizationIdentifier:Touch BarΛࣝผ͢ΔͨΊͷ஋ • customizationAllowedItemIdentifiers:ΧελϚΠζΛڐՄ͢Δࣝผࢠ • customizationRequiredItemIdentifiers:ΧελϚΠζ࣌ʹ࡟আͰ͖ͳ͍ࣝผࢠ • defaultItemIdentifiers:ΧελϚΠζ͢Δલʹදࣔ͢Δࣝผࢠ

    • itemIdentifiers:ొ࿥ࡁΈͷࣝผࢠ • principalItemIdentifier:தԝʹදࣔ͞ΕΔॏཁͳࣝผࢠ • escapeKeyReplacementItemIdentifier:Esc ΩʔΛࠩ͠ସ͑Δ৔߹ͷࣝผࢠ • templateItems:ࣝผࢠ͔ΒΠϯελϯεԽ͞Ε߲ͨ໨Λอ࣋͢ΔϓϩύςΟ • delegate: ࣝผࢠ͔ΒΠϯελϯεΛੜ੒͢ΔॲཧΛҠৡ 18
  19. ΧελϚΠζ w ʮදࣔʯϝχϡʔ͔Βʮ5PVDI#BSΛΧελϚΠζʜʯΛબ୒ ͢Δ͜ͱͰදࣔ͢Δ߲໨΍ฒͼॱͷઃఆ͕Մೳ w DVTUPNJ[BUJPO"MMPXFE*UFN*EFOUJpFST΍ DVTUPNJ[BUJPO3FRVJSFE*UFN*EFOUJpFSTΛࢦఆ 19

  20. ࣮૷ํ๏ • NSTouchBarDelegateΛ࣮૷͢Δ • func touchBar(_ touchBar: NSTouchBar, makeItemForIdentifier identifier:

    NSTouchBarItem.Identifier) -> NSTouchBarItem? • identifierʹࣄલʹఆٛͨ͠஋͕౉͞ΕΔͷͰNSTouchBarItem ͷαϒΫϥεΛੜ੒ͯ͠ฦ͢ • NSTouchBarItemʹ͸customizationLabelΛઃఆ͓ͯ͘͠ͱΧ ελϚΠζ࣌ʹϥϕϧ͕දࣔ͞ΕΔ 20
  21. ݕࡧॱং IUUQTEFWFMPQFSBQQMFDPNEPDVNFOUBUJPOBQQLJUOTUPVDICBS 10. App delegate 9. App object 8. Main

    window’s controller 7. Main window’s delegate 6. Main window 5. Main window’s first responder 4. Key window’s controller 3. Key window’s delegate 2. Key window 1. Key window’s first responder 5PVDI#BSΛݕࡧ͢ΔॱংʢԼ͔Β্ʹʣ 6*3FTQPOEFSͷαϒΫϥεΛൃݟ͢Δͱߋʹݕࡧ 9. App delegate 8. App object 7. Key window’s controller 6. Key window 5. View controller that is closest to root of window 4. View that is closest to root of window 3. Intermediate view controllers and views 2. View controller of key window’s first responder 1. Key window’s first responder
  22. ஫ҙ఺ w 6*3FTQPOEFSΛܧঝͯ͠Ε͹දࣔ͞ΕΔ͔ͱࢥ͕ͬͨ4XJGU6* ʢ6*7JFX$POUSPMMFS3FQSFTFOUBCMF 6*7JFX3FQSFTFOUBCMFͰϥοϓͨ͠΋ͷʣͰ͸ දࣔ͞Εͳ͍ w XJOEPX4DFOFͷUPVDI#BSϓϩύςΟʹແཧ΍Γ/45PVDI#BSͷΠϯελϯεΛ౉ ͙͢Β͍͔͠ͳͦ͞͏ w

    4XJGU6*Λར༻͍ͨ͠৔߹͸$BUBMZTUͰ͸ແ͘NBD04ωΠςΟϒͷΞϓϦΛ։ൃ͠ ͨํ͕ྑ͍͔΋ w εϥΠμʔΛදݱ͢Δ/44MJEFS5PVDI#BS*UFN͔Β஋Λऔಘ͢ΔϓϩύςΟ͕ແ͍ w TMJEFS*UFNWBMVF GPS,FZlEPVCMF7BMVF ͰऔಘՄೳ 22
  23. ·ͱΊ w 5PVDI#BS͸/45PVDI#BSͰදݱ w ରԠࡁΈͷ/45PVDI#BS*UFNͷछྨ΋·ͩগͳ͍ͪ͠ΌΜͱ஋ ͕औΕͳ͔ͬͨΓ͢ΔͷͰࠓޙʹظ଴ w 5PVDI#BS͸NBD04ͳΒͰ͸ͷཁૉͷҰͭͳͷͰ$BUBMZTUର Ԡ͢Δ࣌͸ੋඇ࣮૷͠·͠ΐ͏ 23

  24. αϯϓϧίʔυ IUUQTHJUIVCDPNGSPNLL$BUBMZTU4BNQMFS

  25. 13

  26. ʲిࢠॻ੶ʳNBD04$BUBMZTU%FFQ%JWF 26 IUUQTGSPNLLCPPUIQNJUFNT

  27. IUUQTGSFFUJNFQJDLFSpSFCBTFBQQDPN

  28. IUUQTUZQFNBSLEPXOBQQ

  29. ͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠ 29