NSTouchBarItem

Panther·2021년 8월 9일
0
post-custom-banner

https://developer.apple.com/documentation/appkit/nstouchbaritem

"A UI control shown in the Touch Bar on supported models of MacBook Pro."

맥북 프로 중 터치 바가 지원되는 모델에서 터치 바에 보이는 UI 컨트롤입니다.

Declaration

@MainActor class NSTouchBarItem : NSObject

Overview

NSTouchBarItem 클래스의 인스턴스는 아이템이라고 부릅니다. 이 아이템은 바라고 부르는 NSTouchBar 객체에 대한 뷰의 보이지 않는 bounds 내부에서 터치 바에 다른 아이템과 함께 나타납니다.

앱의 아키텍처 및 지원하고자 하는 사용자 커스터마이징에 따라 바의 배열에 아이템 혹은 아이템 아이덴티파이어를 추가해서 사용할 수 있습니다. 바와 아이템 사이의 가까운 상호작용 때문에 아이템에 대한 더 많은 내용을 알아가기 전 NSTouchBar 클래스 오버뷰를 읽어보시기 바랍니다.

NSTouchBar
https://developer.apple.com/documentation/appkit/nstouchbar
https://velog.io/@panther222128/NSTouchBar

AppKitNSTouchBarItem 서브클래스의 풍부한 집합을 제공합니다. 각각은 상응하는 클래스 레퍼런스 문서에 설명되어 있습니다.

  • NSCandidateListTouchBarItem(후보 리스트 아이템)은 자신의 딜리게이트와 함게 현재 텍스트 뷰에 대한 텍스트 제안의 리스트를 제공합니다.
  • NSColorPickerTouchBarItem 객체(컬러 picker 아이템)는 시스템이 정의한 컬러 picker를 제공합니다.
  • NSCustomTouchBarItem 객체(커스텀 아이템)는 뷰, 버튼, 스크러버(NSScrubber 클래스의 인스턴스)와 같은 개발자가 선택한 리스폰더를 포함합니다.
  • NSGroupTouchBarItem 객체(그룹 아이템)는 다른 아이템을 포함하는 바를 제공합니다.
  • NSPopoverTouchBarItem 객체(팝오버 아이템)는 터치 혹은 누르기 상태일 때 두 번째 상태로 확장하는 두 상태를 갖는 컨트롤을 제공합니다. 이는 바가 가지고 있는 컨텐츠를 보여주고 있습니다.
  • NsSharingServicePicerkTouchBarItem 객체(공유 서비스 picker 아이템)는 자신의 딜리게이트와 함께 공유 가능한 객체의 리스트를 제공합니다.
  • NSSliderTouchBarItem 객체(슬라이더 아이템)는 범위에서 값을 선택하기 위한 슬라이더 컨트롤을 제공합니다.

가장 흔하게 사용되는 아이템 클래스는 NSCustomTouchBarItemNSPopoverTouchBarItem입니다.

NSTouchBarItem 및 관련 클래스를 사용하는 방법을 설명하는 아래 샘플 코드 프로젝트를 참고하시기 바랍니다.

  • NSTouchBar Catalog—터치 바에서 사용하기 위한 바 및 아이템 생성 방법을 보여줍니다.
  • ToolBar Sample—전형적인 맥 앱에 터치 바 지원을 추가하는 방법을 보여줍니다.

NSTouchBar Catalog
https://developer.apple.com/documentation/appkit/touch_bar/creating_and_customizing_the_touch_bar

ToolBar Sample
https://developer.apple.com/documentation/appkit/touch_bar/integrating_a_toolbar_and_touch_bar_into_your_app

아이템에 추가 할 수 있는, 버튼 혹은 다른 컨트롤에서 사용 가능한 템플릿 이미지의 리스트를 위해 Using Template Images를 살펴보시기 바랍니다.

Using Template Images는 이 글과 같은 링크로 연결됩니다.

Custom Items

뷰를 쥐기 위해서 보통 커스텀 아이템(NSCustomTouchBarItem 클래스의 인스턴스)을 사용하게 될 것입니다. 예를 들어 터치 바에 버튼을 놓으려면 아래처럼 과정을 수행합니다.

  1. 버튼 생성 및 설정을 위해 init(title:image:target:action:)과 같은 NSButton 편의 이니셜라이저를 사용하시기 바랍니다.
  2. 새 버튼을 가리킬 수 있도록 커스텀 아이템에 뷰 속성을 설정하시기 바랍니다.

Note
커스텀 아이템을 생성하는 경우 NSButton, NSSegmentedControl, NSSlider에 대해, macOS 10.12에서부터 사용하기 시작한 편의 이니셜라이저 사용은 중요합니다. 이니셜라이저는 터치 바에 대해서 컨트롤 크기를 정확하게 만들어지도록 관리하고, 터치 바에 대한 모양을 적합하게 설정합니다. 이에 대한 더 많은 정보는 NSTouchBarItem Fonts, Images, and Colors를 살펴보시기 바랍니다.

편의 이니셜라이저를 사용하지 않는 경우 정확한 크기 및 모양을 확실하게 만드는 것은 앱의 책임입니다.

Popover Items

팝오버 아이템(NSpopoverTouchBarItem 클래스의 인스턴스)는 두 번째로 흔하게 사용되는 타입으로써, 사용자가 축소된 팝오버 아이템을 탭 하거나 누르고 있을 때 새 바(NSTouchBar 객체)를 제공합니다.

확장된 상태에서 팝오버는 터치 바에 있는 다른 아이템 위로 덮어지면서 나타납니다.

사용자가 팝오버 아이템을 탭할 때 바를 보여주려면, 아이템의 popoverTouchBar 속성에서 바를 구체화해야 합니다. pressAndHoldTouchBar 속성에서 바를 구체화하는 것을 통해 누르고 있는 것을 활성화합니다. 누르고 있기 기능은 하나의 세그멘티드 컨트롤(NSSegmentedControl 클래스의 인스턴스) 혹은 슬라이더(NSSliderTouchBarItem 클래스의 인스턴스)를 포함하고 있는 경우처럼 간단한 팝오버에만 적합합니다.

Note
만약 팝오버 바가 많은 사용자 상호작용을 요구하고 있고 많은 아이템을 포함하거나 많은 스크롤 뷰를 포함하고 있다면, 누르고 있기 기능을 활성화하지 않아야 합니다. 이렇게 하지 않으면 끔찍한 사용자 경험 결과를 나타낼 수 있습니다.

시스템은 자동으로 팝오버 아이템에 아래 조건 하에서 갈매기 모양을 보여줍니다. pressAndHoldTouchBar, popoverTouchBar 속성 모두에 같은 NSTouchBar 객체를 구체화하고, 팝오버 아이템의 collapsedRepresentation 속성에 기본값을 사용하는 경우입니다.

스크러버(NSScrubber 인스터스)를 포함하는 팝오버 아이템을 제공하는 경우 사용자가 스커러버에서 선택을 한 이후 스크러버와 팝오버 모두를 해제하길 원할 것입니다. 이러한 사용자 상호작용을 달성할 수 있는 좋은 접근방법은 서브클래스의 인스턴스를 스크러버의 딜리게이트로써 사용해 NSPopoverTouchBarItem을 서브클래싱 하는 것입니다. 그러면 이 객체 내부의 didFinishInteracting(with:) 메소드에서 딜리게이트 객체를 설정할 수 있고, 그렇게 함으로써 팝오버의 dismissPopover(_:) 메소드를 호출할 수 있습니다.

팝오버 아이템을 위해 바에서 세그멘티드 컨트롤을 위치시키면, NSSegmentedControl.SwitchTracking 열거형의 NSSegmentedControl.SwitchTracking.momentary 옵션을 사용하지 않아야 함을 신경써야 합니다. 왜냐하면 사용하는 경우 사용자의 컨트롤 작동을 방해하기 때문입니다.

Other Common NSTouchBarItem Types

슬라이더 아이템을 제공하려면 항상 표준 슬라이더를 사용하고 터치 바에 사용자 상호작용을 최적화하는 NSSliderTouchBarItem 클래스를 사용하시기 바랍니다. (즉 커스텀 아이템에 직접 NSSlider 객체를 추가하지 않아야 합니다.)

그룹 아이템(NSGroupTouchBarItem 클래스의 인스턴스)는 바를 제공하는 컨테이너이며, groupTouchBar 속성에서 아이템의 고유한 배열을 갖고 있습니다. 고수준 바 내부에서 직접 아이템에 대해서 했던 것처럼, 그룹의 포함된 바에서 아이템에 대한 커스터마이징을 가능하게 할 수 있습니다. 그룹 아이템을 사용하는 것은 Group Item, Popover Item, Composed Bar Customization에서 설명하는 것처럼, 터치 바의 타른 부분들에 대해 다른 사용자 커스터마이징을 제공할 수 있도록 해줍니다. 또한, 그룹 아이템을 사용하는 것은 “Principal Items”에서 설명하는 것처럼, 터치 바 내부에서 그룹의 센터링을 가능하게 해줍니다.

공간 아이템은 바에서 아이템 사이에 커스텀 공간을 추가할 수 있도록 해줍니다. fixedSpaceSmall, fixedSpaceLarge, flexibleSpace 아이덴티파이어를 아이템에 할당함으로써 바에 대해 공간 아이템을 구체화할 수 있으며, 해당 아이템을 바의 아이템 배열에 추가합니다. 시스템은 구체화한 아이덴티파이어에 기반해 공간 아이템을 인스턴스화 하고 설정합니다.

NSTouchBarItem Configuration

각 아이템에 대해 고유한 아이덴티파이어로 설정해야 하며, principal 아이템처럼 선택적으로 시각화 우선순위 혹은 태그를 할당해야 합니다.

NSTouchBarItem identification. 바에 있는 각 아이템에 고유한 아이덴티파이어를 제공해야 하며, 공간 항목은 제외합니다. 초기화 시 NSTouchBarItem.Identifier(아이템 아이덴티파이어라고 부르는) 타입으로 각 아이템에 대한 아이덴티파이어를 구체화해야 합니다. 아이템 아이덴티파이어는 아이템에 유지 가능한 약한 참조로써 제공됩니다.

아이템 아이덴티파이어 구체화와 관련한 더 자세한 내용은 Using NSTouchBarItem Objects와 NSTouchBar Customization을 살펴보시기 바랍니다.

Using NSTouchBarItem Objects
https://developer.apple.com/documentation/appkit/nstouchbar#2587638
https://velog.io/@panther222128/NSTouchBar

NSTouchBar Customization
https://developer.apple.com/documentation/appkit/nstouchbar#2587638
https://velog.io/@panther222128/NSTouchBar

시스템은 바를 채우고 사용자 커스터마이징에 대한 변경사항을 추적 및 기록하기 위해 아이템 아이덴티파이어를 사용합니다.

NSTouchBarItem priority for visibility. 만약 시스템이 터치 바에서 바를 보여주고 있지만 수평 공간이 제약되고 바가 크기에 맞출 수 있는 것보다 더 많은 아이템을 정의하고 있다면, 시스템은 몇 가지 아이템을 숨깁니다. 각 아이템에 대해 visibilityPriority 속성에 대한 값을 설정함으로써 이와 같은 hide/show 동작을 조작할 수 있습니다.

낮은 시각화 우선순위 아이템은 높은 시각화 우선순위 아이템이 숨겨지기 전에, 필요한 경우 시스템에 의해 숨겨집니다.

시각화 우선순위를 설정하려면 NSTouchBarItem.Priority 열거형에 있는 상수를 사용하거나 인티저 값을 할당해야 합니다. 0 값은 "normal" 시각화 우선순위를 나타냅니다. 시각화 우선순위는 증가하는 숫자 값에 따라 증가합니다. 낮은 상수는 -1000의 값을 제공합니다. 높은 값은 +1000입니다. 필요하다면 이 범위 바깥의 인티저를 사용할 수도 있습니다.

시스템은 동일 우선순위 아이템(단일 바에 내부에서 정의된)의 그룹을 함께 숨기거나 함께 보여줍니다. 이 규칙에 대한 한 가지 예외는 시각화 우선순위 normal을 갖는 아이템에 대한 것입니다. 이 아이템은 하나씩 차례대로 숨겨지며, 가장 오른쪽에 있는 아이템이 먼저 숨겨집니다. 만약 수평 공간이 터치 바에서 커지는 경우, 그리고 숨겨진 normal 우선순위 아이템이 나타날 수 있는 상태가 되면, 시스템은 우선 가장 최근에 숨거진 아이템을 먼저 보여줍니다.

Principal Items. 바 내부에서 선택적으로 특별한 의미를 지닌 아이템을 구체화할 수 있으며, principalItemIdentifier 속성을 사용해서 구체화할 수 있습니다. 시스템은 터치 바 내부에서 principal 아이템을 가운데에 위치하도록 시도합니다. 만약 아이템의 그룹이 터치 바에서 중앙에 나타나도록 하길 원한다면, 그룹 아이템(NSTouchBarItem 타입인)을 principal 아이템으로 지정해야 합니다.

만약 리스폰더 체인 내에서 하나 이상의 바가 터치 바에서 시각화될 수 있고, 한 가지 이상이 principal 아이템이라면, 시스템은 터치 바에서 중앙에 위치시킬 한 가지를 결정합니다.

NSTouchBarItem Fonts, Images, and Colors

커스텀 아이템에서 버튼을 사용하는 경우 버튼 제목의 폰트를 설정하지 않아야 합니다. 터치 바에서 시스템은 표준 컨트롤에 대한 폰트를 구체화합니다.

커스텀 드로잉처럼 폰트를 구체화해야 한다면, NSFont 클래스의 systemFont(ofSize:) 클래스 메소드(혹은 관련 메소드)를 사용하시기 바랍니다. 터치 바에 대해 적합한 크기조정을 자동으로 가져올 수 있도록 폰트 크기를 0으로 사용하시기 바랍니다.

터치 바에 있는 버튼 혹은 다른 컨트롤에 이미지를 사용하는 경우, 템플릿 이미지를 사용하도록 주의해야 합니다. 터치 바에 있는 템플릿 이미지는 시스템 화이트 포인트 변경에 자동으로 응답하며, 사용자 상호작용에 자동으로 반응합니다. 이 문서에서 오버뷰는 내장된 터치 바 템플릿 이미지를 목록으로 보여주고 있습니다.

가지고 있는 이미지 에셋을 사용하려면, 에셋 카탈로그에서 @2x로 선언된 레티나 레졸루션 이미지를 사용해야 하며, 30 포인트(60 픽셀에 상응하는)의 최대 높이로 사용해야 합니다.

NSTouchBarItem 객체 내부에 있는 객체에 색상을 설정하려면, AppKit 네임드 컬러를 사용해야 하고, 베젤 컬러 속성(macOS 10.12.1에서 사용 가능하기 시작한)을 사용해야 합니다. 네임드 컬러는 터치 바에 정확하게 나타나고, 생동감 있는 모양을 지원합니다. 그리고 시스템 화이트 포인트 변경사항에 응답합니다. 버튼 혹은 세그멘티드 컨트롤의 경우 터치 바에서 적합한 모양을 보장할 수 있도록 베젤 컬러 속성을 사용하시기 바랍니다.

커스텀 아이템에 있는 버튼에 배경 색상을 설정하려면 아래 코드처럼 사용해야 합니다.

myButton.bezelColor = NSColor.controlColor

터치 바에 있는 텍스트 및 글리프에 색상을 설정하려면, NSColor 클래스로부터 아래에 있는 컬러를 사용하시기 바랍니다.

  • labelColor
  • secondaryLabelColor
  • tertiaryLabelColor
  • quaternaryLabelColor

시스템은 이러한 색상의 상대적 밝기와 화이트 포인트를 자동으로 변경시킵니다. 이는 주변 조명에 따라 달라지며, 키보드 백라이트 수준과 같은 다른 요소에 따라 달라지기도 합니다. 터치 바에 있는 컨트롤 배경 색상, 텍스트, 아이폰, 글리프에 대해 항상 이러한 색상 혹은 이러한 색상으로부터 동적으로 기인하는 색상을 사용해야 합니다.

Handling Touch Events in NSTouchBarItem Objects

아이템에서 터치 이벤트를 처리하는 가장 쉬운 방벙븐 버튼, 세그멘티트 컨트롤, 혹은 아이템에 스커러버를 추가하는 것처럼 AppKit 컨트롤을 사용하는 것입니다. 표준 AppKit 컨트롤은 구체화한 타깃으로 터치 이벤트를 전달하므로, 앱에서 가능할 때마다 표준 컨트롤을 사용하시기 바랍니다.

만약 표준 컨트롤이 충분하지 않다면, 표준 컨트롤, 커스텀 뷰, 커스텀 뷰에 수동으로 추가한 제스쳐 리코그나이저의 조합으로 컴포지트 뷰를 생성할 수 있습니다.

만약 터치 이벤트 처리에 있어 컨트롤의 가장 낮은 수준을 요구한다면, NSTouch 클래스를 직접 사용할 수 있습니다. 예를 들어 스크롤 뷰 내에 위치한 컨트롤의 경우에서 좋은 사용자 피드백을 제공하기 위해 이 경로를 사용할 수 있습니다. 터치 메소드의 직접 사용은 상호작용에서 fine-grained 컨트롤을 가능하게 해줍니다. 예를 들어 사용자가 컨트롤을 터치했을 때 즉시 컨트롤을 강조할 수 있고, 사용자가 손가락을 떼지 않은 채로 스크롤 제스쳐를 수행하면 강조를 지울 수 있습니다.

NSTouch 클래스를 직접 사용하는 경우 touchesCancelled(with:) 리스폰더 메소드를 구현해야 합니다. 사용자가 취소될 수 있는 터치 상호작용을 수행할 수도 있기 때문입니다.

macOS 10.12.1는 제스쳐 리코그나이저에 대한 개선사항과 함께 터치 바를 지원합니다. 이는 AppKit Support for the Touch Bar의 “Gesture recognizer support”에서 설명하고 있습니다. 제스쳐 리코그나이저에 대한 소개는 Event Handling Guide for UIKit Apps에 있는 “Gesture Recognizers”를 살펴보시기 바랍니다. 대부분의 가이드가 macOS에도 해당합니다. 그리고 What’s New with Gestures 역시 살펴보시길 권합니다.

Gesture recognizer support
https://developer.apple.com/documentation/appkit/nstouchbar#2587738
https://velog.io/@panther222128/NSTouchBar

Gesture Recognizers
https://developer.apple.com/documentation/uikit/#//apple_ref/doc/uid/TP40009541

What’s New with Gestures
https://developer.apple.com/videos/play/wwdc2012/231/

또한, macOS 10.12.1은 터치 객체에 대한 개선사항도 지원합니다. AppKit Support for the Touch Bar에 있는 ”Touch changes”에서 설명하고 있습니다.

Touch changes
https://developer.apple.com/documentation/appkit/nstouchbar#2587738
https://velog.io/@panther222128/NSTouchBar

See Also


Touch Bar Items

NSCandidateListTouchBarItem

가지고 있는 딜리게이트와 함께 현재 텍스트 뷰에서 텍스트 제안의 리스트를 제공하는 바 아이템입니다.

https://developer.apple.com/documentation/appkit/nscandidatelisttouchbaritem
https://velog.io/@panther222128/NSCandidateListTouchBarItem

NSColorPickerTouchBarItem

시스템이 정의한 컬러 picker를 제공하는 바 아이템입니다.

https://developer.apple.com/documentation/appkit/nscolorpickertouchbaritem
https://velog.io/@panther222128/NSColorPickerTouchBarItem

NSCustomTouchBarItem

뷰, 버튼, 혹은 스크러버(NSScrubber 클래스의 인스턴스)와 같은 선택한 리스폰더를 포함하는 바 아이템입니다.

https://developer.apple.com/documentation/appkit/nscustomtouchbaritem
https://velog.io/@panther222128/NSCustomTouchBarItem

NSGroupTouchBarItem

다른 아이템을 포함할 수 있는 바를 제공하는 바 아이템입니다.

https://developer.apple.com/documentation/appkit/nsgrouptouchbaritem
https://velog.io/@panther222128/NSGroupTouchBarItem

NSPopoverTouchBarItem

두 번째 상태로 확장할 수 있는 두 상태 컨트롤을 제공하는 바 아이템입니다. 가지고 있는 바의 컨텐츠를 보여줍니다.

https://developer.apple.com/documentation/appkit/nspopovertouchbaritem
https://velog.io/@panther222128/NSPopoverTouchBarItem

NSSharingServicePickerTouchBarItem

가지고 있는 딜리게이트와 함께 공유 가능한 객체의 리스트를 제공하는 바 아이템입니다.

https://developer.apple.com/documentation/appkit/nssharingservicepickertouchbaritem
https://velog.io/@panther222128/NSSharingServicePickerTouchBarItem

NSSliderTouchBarItem

범위에서 값을 선택하기 위한 슬라이더 컨트롤을 제공하는 바 아이템입니다.

https://developer.apple.com/documentation/appkit/nsslidertouchbaritem
https://velog.io/@panther222128/NSSliderTouchBarItem

NSUserInterfaceCompressionOptions

공간이 제약될 때 어떻게 UI 요소가 스스로 크기조정되는지를 구체화하는 객체입니다.

https://developer.apple.com/documentation/appkit/nsuserinterfacecompressionoptions
https://velog.io/@panther222128/NSUserInterfaceCompressionOptions

NSButtonTouchBarItem

오버뷰 사용이 불가능합니다.

https://developer.apple.com/documentation/appkit/nsbuttontouchbaritem
https://velog.io/@panther222128/NSButtonTouchBarItem

NSPickerTouchBarItem

오버뷰 사용이 불가능합니다.

https://developer.apple.com/documentation/appkit/nspickertouchbaritem
https://velog.io/@panther222128/NSPickerTouchBarItem

NSStepperTouchBarItem

오버뷰 사용이 불가능합니다.

https://developer.apple.com/documentation/appkit/nssteppertouchbaritem
https://velog.io/@panther222128/NSStepperTouchBarItem


post-custom-banner

0개의 댓글