Xamarin.iOS의 3D Touch 소개
이 문서에서는 앱에서 새로운 iPhone 6s 및 iPhone 6s Plus 3D Touch 제스처를 사용하는 방법에 대해 설명합니다.
이 문서에서는 새로운 3D 터치 API를 사용하여 새로운 iPhone 6s 및 iPhone 6s Plus 장치에서 실행되는 Xamarin.iOS 앱에 압력 민감 제스처를 추가하는 방법을 소개합니다.
3D Touch를 사용하면 iPhone 앱이 사용자가 장치의 화면을 터치하고 있음을 알 수 있을 뿐만 아니라 사용자가 얼마나 많은 압력을 가하고 있는지 감지하고 다양한 압력 수준에 대응할 수 있습니다.
3D Touch는 앱에 다음과 같은 기능을 제공합니다.
- 압력 민감 도 - 이제 앱은 사용자가 화면을 터치하는 데 얼마나 힘들거나 가벼우는지 측정하고 해당 정보를 활용할 수 있습니다. 예를 들어 그리기 앱은 사용자가 화면을 터치하는 정도에 따라 선을 더 두껍거나 얇게 만들 수 있습니다.
- 피킹 앤 팝 - 이제 앱에서 사용자가 현재 컨텍스트를 벗어나지 않고도 데이터와 상호 작용할 수 있습니다. 화면에서 열심히 눌러 관심 있는 항목(예: 메시지 미리 보기)을 피킹할 수 있습니다. 더 세게 누르면 항목에 팝업할 수 있습니다.
- 빠른 작업 - 사용자가 데스크톱 앱에서 항목을 마우스 오른쪽 단추로 클릭할 때 팝업될 수 있는 상황에 맞는 메뉴와 같은 빠른 작업을 생각해 보세요. 빠른 작업을 사용하면 홈 화면의 앱 아이콘에서 직접 앱의 함수에 바로 가기를 추가할 수 있습니다.
- 시뮬레이터 에서 3D 터치 테스트 - 올바른 Mac 하드웨어를 사용하여 iOS 시뮬레이터에서 3D Touch 지원 앱을 테스트할 수 있습니다.
압력 민감도
위에서 설명한 대로 UITouch 클래스의 새 속성을 사용하여 사용자가 iOS 디바이스의 화면에 적용하는 압력의 양을 측정하고 사용자 인터페이스에서 이 정보를 사용할 수 있습니다. 예를 들어 압력의 양에 따라 브러시 스트로크를 반투명하거나 불투명하게 만듭니다.
3D Touch의 결과로 앱이 iOS 9 이상에서 실행되고 iOS 디바이스가 3D Touch를 지원할 수 있는 경우 압력의 변화로 인해 TouchesMoved
이벤트가 발생합니다.
예를 들어 UIView의 이벤트를 모니터링할 TouchesMoved
때 다음 코드를 사용하여 사용자가 화면에 적용하는 현재 압력을 가져올 수 있습니다.
public override void TouchesMoved (NSSet touches, UIEvent evt)
{
base.TouchesMoved (touches, evt);
UITouch touch = touches.AnyObject as UITouch;
if (touch != null)
{
// Get the pressure
var force = touch.Force;
var maxForce = touch.MaximumPossibleForce;
// Do something with the touch and the pressure
...
}
}
이 속성은 MaximumPossibleForce
앱이 실행 중인 iOS 디바이스를 기반으로 UITouch의 속성에 대해 가능한 가장 높은 값을 Force
반환합니다.
Important
압력의 변경으로 인해 TouchesMoved
X/Y 좌표가 변경되지 않은 경우에도 이벤트가 발생합니다. 이러한 동작 변경으로 인해 이벤트가 더 자주 호출되고 X/Y 좌표가 마지막 TouchesMoved
호출과 동일하도록 iOS 앱을 준비 TouchesMoved
해야 합니다.
자세한 내용은 Apple의 TouchCanvas: UITouch를 효율적이고 효과적으로 샘플 앱 및 UITouch 클래스 참조를 참조하세요.
피킹 및 팝
3D Touch는 사용자가 현재 위치에서 탐색하지 않고도 앱 내에서 정보를 보다 빠르게 조작할 수 있는 새로운 방법을 제공합니다.
예를 들어 앱에서 메시지 테이블을 표시하는 경우 사용자는 항목을 열심히 눌러 오버레이 보기에서 콘텐츠를 미리 볼 수 있습니다(Apple이 피킹(Peek)으로 참조).
사용자가 더 세게 누르면 일반 메시지 보기(보기에 팝핑이라고 함)가 입력됩니다.
3D 터치 가용성 확인
작업 UIViewController
할 때 다음 코드를 사용하여 앱이 실행 중인 iOS 디바이스가 3D Touch를 지원하는지 확인할 수 있습니다.
public override void TraitCollectionDidChange(UITraitCollection previousTraitCollection)
{
//Important: call the base function
base.TraitCollectionDidChange(previousTraitCollection);
//See if the new TraitCollection value includes force touch
if (TraitCollection.ForceTouchCapability == UIForceTouchCapability.Available) {
//Do something with 3D touch, for instance...
RegisterForPreviewingWithDelegate (this, View);
...
이 메서드는 이전 또는 이후에 ViewDidLoad()
호출할 수 있습니다.
피킹 및 팝 처리
3D Touch를 처리할 수 있는 iOS 디바이스에서는 클래스 인스턴스 UIViewControllerPreviewingDelegate
를 사용하여 피킹 및 팝 항목 세부 정보의 표시를 처리할 수 있습니다. 예를 들어 테이블 뷰 컨트롤러가 호출 MasterViewController
된 경우 다음 코드를 사용하여 Peek 및 Pop을 지원할 수 있습니다.
using System;
using System.Collections.Generic;
using UIKit;
using Foundation;
using CoreGraphics;
namespace DTouch
{
public class PreviewingDelegate : UIViewControllerPreviewingDelegate
{
#region Computed Properties
public MasterViewController MasterController { get; set; }
#endregion
#region Constructors
public PreviewingDelegate (MasterViewController masterController)
{
// Initialize
this.MasterController = masterController;
}
public PreviewingDelegate (NSObjectFlag t) : base(t)
{
}
public PreviewingDelegate (IntPtr handle) : base (handle)
{
}
#endregion
#region Override Methods
/// Present the view controller for the "Pop" action.
public override void CommitViewController (IUIViewControllerPreviewing previewingContext, UIViewController viewControllerToCommit)
{
// Reuse Peek view controller for details presentation
MasterController.ShowViewController(viewControllerToCommit,this);
}
/// Create a previewing view controller to be shown at "Peek".
public override UIViewController GetViewControllerForPreview (IUIViewControllerPreviewing previewingContext, CGPoint location)
{
// Grab the item to preview
var indexPath = MasterController.TableView.IndexPathForRowAtPoint (location);
var cell = MasterController.TableView.CellAt (indexPath);
var item = MasterController.dataSource.Objects [indexPath.Row];
// Grab a controller and set it to the default sizes
var detailViewController = MasterController.Storyboard.InstantiateViewController ("DetailViewController") as DetailViewController;
detailViewController.PreferredContentSize = new CGSize (0, 0);
// Set the data for the display
detailViewController.SetDetailItem (item);
detailViewController.NavigationItem.LeftBarButtonItem = MasterController.SplitViewController.DisplayModeButtonItem;
detailViewController.NavigationItem.LeftItemsSupplementBackButton = true;
// Set the source rect to the cell frame, so everything else is blurred.
previewingContext.SourceRect = cell.Frame;
return detailViewController;
}
#endregion
}
}
이 GetViewControllerForPreview
메서드는 피킹(Peek) 작업을 수행하는 데 사용됩니다. 테이블 셀 및 백업 데이터에 대한 액세스 권한을 얻은 다음 현재 Storyboard에서 로드합니다 DetailViewController
. (0,0)으로 설정 PreferredContentSize
하여 기본 피킹 보기 크기를 요청합니다. 마지막으로 표시 previewingContext.SourceRect = cell.Frame
할 셀을 제외한 모든 항목을 흐리게 표시하고 표시할 새 보기를 반환합니다.
CommitViewController
사용자가 더 세게 누를 때 Pop 보기에 대한 피킹에서 만든 보기를 다시 사용합니다.
피킹 및 팝 등록
사용자가 항목을 피킹 및 팝할 수 있도록 허용하려는 뷰 컨트롤러에서 이 서비스에 등록해야 합니다. 테이블 뷰 컨트롤러()MasterViewController
의 위에 제공된 예제에서는 다음 코드를 사용합니다.
public override void ViewDidLoad ()
{
base.ViewDidLoad ();
// Check to see if 3D Touch is available
if (TraitCollection.ForceTouchCapability == UIForceTouchCapability.Available) {
// Register for Peek and Pop
RegisterForPreviewingWithDelegate(new PreviewingDelegate(this), View);
}
...
}
여기서는 위에서 만든 인스턴스를 사용하여 메서드를 호출 RegisterForPreviewingWithDelegate
합니다 PreviewingDelegate
. 3D Touch를 지원하는 iOS 디바이스에서 사용자는 항목을 열심히 눌러 피킹할 수 있습니다. 더 세게 누르면 항목이 표준 표시 보기로 표시됩니다.
자세한 내용은 Apple의 ViewControllerPreviews: API 샘플 앱, UIPreviewAction 클래스 참조, UIPreviewActionGroup 클래스 참조 및 UIPreviewActionItem 프로토콜 참조를 사용하여 UIViewController 미리 보기를 참조하세요.
빠른 작업
3D 터치 및 빠른 작업을 사용하면 iOS 디바이스의 홈 화면 아이콘에서 앱의 함수에 대한 일반적이고 빠르고 쉽게 액세스할 수 있는 바로 가기를 추가할 수 있습니다.
위에서 설명한 대로 빠른 작업은 사용자가 데스크톱 앱에서 항목을 마우스 오른쪽 단추로 클릭할 때 팝업될 수 있는 상황에 맞는 메뉴와 비슷하다고 생각할 수 있습니다. 빠른 작업을 사용하여 앱의 가장 일반적인 함수 또는 기능에 대한 바로 가기를 제공해야 합니다.
정적 빠른 작업 정의
앱에 필요한 빠른 작업 중 하나 이상이 정적이며 변경할 필요가 없는 경우 앱 파일 Info.plist
에서 정의할 수 있습니다. 외부 편집기에서 이 파일을 편집하고 다음 키를 추가합니다.
<key>UIApplicationShortcutItems</key>
<array>
<dict>
<key>UIApplicationShortcutItemIconType</key>
<string>UIApplicationShortcutIconTypeSearch</string>
<key>UIApplicationShortcutItemSubtitle</key>
<string>Will search for an item</string>
<key>UIApplicationShortcutItemTitle</key>
<string>Search</string>
<key>UIApplicationShortcutItemType</key>
<string>com.company.appname.000</string>
</dict>
<dict>
<key>UIApplicationShortcutItemIconType</key>
<string>UIApplicationShortcutIconTypeShare</string>
<key>UIApplicationShortcutItemSubtitle</key>
<string>Will share an item</string>
<key>UIApplicationShortcutItemTitle</key>
<string>Share</string>
<key>UIApplicationShortcutItemType</key>
<string>com.company.appname.001</string>
</dict>
</array>
여기서는 다음 키를 사용하여 두 개의 정적 빠른 작업 항목을 정의합니다.
UIApplicationShortcutItemIconType
- 빠른 작업 항목에서 다음 값 중 하나로 표시할 아이콘을 정의합니다.UIApplicationShortcutIconTypeAdd
UIApplicationShortcutIconTypeAlarm
UIApplicationShortcutIconTypeAudio
UIApplicationShortcutIconTypeBookmark
UIApplicationShortcutIconTypeCapturePhoto
UIApplicationShortcutIconTypeCaptureVideo
UIApplicationShortcutIconTypeCloud
UIApplicationShortcutIconTypeCompose
UIApplicationShortcutIconTypeConfirmation
UIApplicationShortcutIconTypeContact
UIApplicationShortcutIconTypeDate
UIApplicationShortcutIconTypeFavorite
UIApplicationShortcutIconTypeHome
UIApplicationShortcutIconTypeInvitation
UIApplicationShortcutIconTypeLocation
UIApplicationShortcutIconTypeLove
UIApplicationShortcutIconTypeMail
UIApplicationShortcutIconTypeMarkLocation
UIApplicationShortcutIconTypeMessage
UIApplicationShortcutIconTypePause
UIApplicationShortcutIconTypePlay
UIApplicationShortcutIconTypeProhibit
UIApplicationShortcutIconTypeSearch
UIApplicationShortcutIconTypeShare
UIApplicationShortcutIconTypeShuffle
UIApplicationShortcutIconTypeTask
UIApplicationShortcutIconTypeTaskCompleted
UIApplicationShortcutIconTypeTime
UIApplicationShortcutIconTypeUpdate
UIApplicationShortcutItemSubtitle
- 항목의 부제목을 정의합니다.UIApplicationShortcutItemTitle
- 항목의 제목을 정의합니다.UIApplicationShortcutItemType
- 앱에서 항목을 식별하는 데 사용할 문자열 값입니다. 자세한 내용은 다음 섹션을 참조하십시오.
Important
파일에 설정된 Info.plist
빠른 작업 바로 가기 항목은 속성으로 Application.ShortcutItems
액세스할 수 없습니다. 이벤트 처리기에만 전달 HandleShortcutItem
됩니다.
빠른 작업 항목 식별
위에서 본 것처럼 앱 Info.plist
에서 빠른 작업 항목을 정의할 때 이를 식별하기 위해 키에 UIApplicationShortcutItemType
문자열 값을 할당했습니다.
이러한 식별자를 코드에서 더 쉽게 작업할 수 있도록 앱 프로젝트에 호출된 ShortcutIdentifier
클래스를 추가하고 다음과 같이 표시합니다.
using System;
namespace AppSearch
{
public static class ShortcutIdentifier
{
public const string First = "com.company.appname.000";
public const string Second = "com.company.appname.001";
public const string Third = "com.company.appname.002";
public const string Fourth = "com.company.appname.003";
}
}
빠른 작업 처리
다음으로, 홈 화면의 AppDelegate.cs
앱 아이콘에서 빠른 작업 항목을 선택하는 사용자를 처리하도록 앱의 파일을 수정해야 합니다.
다음과 같이 편집합니다.
using System;
...
public UIApplicationShortcutItem LaunchedShortcutItem { get; set; }
public bool HandleShortcutItem(UIApplicationShortcutItem shortcutItem) {
var handled = false;
// Anything to process?
if (shortcutItem == null) return false;
// Take action based on the shortcut type
switch (shortcutItem.Type) {
case ShortcutIdentifier.First:
Console.WriteLine ("First shortcut selected");
handled = true;
break;
case ShortcutIdentifier.Second:
Console.WriteLine ("Second shortcut selected");
handled = true;
break;
case ShortcutIdentifier.Third:
Console.WriteLine ("Third shortcut selected");
handled = true;
break;
case ShortcutIdentifier.Fourth:
Console.WriteLine ("Forth shortcut selected");
handled = true;
break;
}
// Return results
return handled;
}
public override bool FinishedLaunching (UIApplication application, NSDictionary launchOptions)
{
var shouldPerformAdditionalDelegateHandling = true;
// Get possible shortcut item
if (launchOptions != null) {
LaunchedShortcutItem = launchOptions [UIApplication.LaunchOptionsShortcutItemKey] as UIApplicationShortcutItem;
shouldPerformAdditionalDelegateHandling = (LaunchedShortcutItem == null);
}
return shouldPerformAdditionalDelegateHandling;
}
public override void OnActivated (UIApplication application)
{
// Handle any shortcut item being selected
HandleShortcutItem(LaunchedShortcutItem);
// Clear shortcut after it's been handled
LaunchedShortcutItem = null;
}
public override void PerformActionForShortcutItem (UIApplication application, UIApplicationShortcutItem shortcutItem, UIOperationHandler completionHandler)
{
// Perform action
completionHandler(HandleShortcutItem(shortcutItem));
}
먼저 사용자가 마지막으로 선택한 빠른 작업 항목을 추적하는 공용 LaunchedShortcutItem
속성을 정의합니다. 그런 다음 메서드를 재정의 FinishedLaunching
하고 전달되었는지와 빠른 작업 항목이 포함되어 있는지 launchOptions
확인합니다. 이 경우 속성에 빠른 작업을 저장합니다 LaunchedShortcutItem
.
다음으로, 메서드를 재정의 OnActivated
하고 선택한 빠른 실행 항목을 HandleShortcutItem
수행할 메서드에 전달합니다. 현재 콘솔에만 메시지를 쓰고 있습니다. 실제 앱에서는 필요한 작업을 처리합니다. 작업이 수행되면 속성이 LaunchedShortcutItem
지워집니다.
마지막으로 앱이 이미 실행 중 PerformActionForShortcutItem
이면 빠른 작업 항목을 처리하기 위해 메서드가 호출되므로 이를 재정의하고 여기에서 메서드를 호출 HandleShortcutItem
해야 합니다.
동적 빠른 작업 항목 만들기
앱 Info.plist
의 파일에서 정적 빠른 작업 항목을 정의하는 것 외에도 동적 즉석 빠른 작업을 만들 수 있습니다. 두 개의 새 동적 빠른 작업을 정의하려면 파일을 다시 편집 AppDelegate.cs
하고 다음과 같이 메서드를 FinishedLaunching
수정합니다.
public override bool FinishedLaunching (UIApplication application, NSDictionary launchOptions)
{
var shouldPerformAdditionalDelegateHandling = true;
// Get possible shortcut item
if (launchOptions != null) {
LaunchedShortcutItem = launchOptions [UIApplication.LaunchOptionsShortcutItemKey] as UIApplicationShortcutItem;
shouldPerformAdditionalDelegateHandling = (LaunchedShortcutItem == null);
}
// Add dynamic shortcut items
if (application.ShortcutItems.Length == 0) {
var shortcut3 = new UIMutableApplicationShortcutItem (ShortcutIdentifier.Third, "Play") {
LocalizedSubtitle = "Will play an item",
Icon = UIApplicationShortcutIcon.FromType(UIApplicationShortcutIconType.Play)
};
var shortcut4 = new UIMutableApplicationShortcutItem (ShortcutIdentifier.Fourth, "Pause") {
LocalizedSubtitle = "Will pause an item",
Icon = UIApplicationShortcutIcon.FromType(UIApplicationShortcutIconType.Pause)
};
// Update the application providing the initial 'dynamic' shortcut items.
application.ShortcutItems = new UIApplicationShortcutItem[]{shortcut3, shortcut4};
}
return shouldPerformAdditionalDelegateHandling;
}
이제 새 항목을 정의하고 배열에 추가하는 ShortcutItems
두 개의 새 UIMutableApplicationShortcutItem
개체를 만들지 않으면 이미 동적으로 만든 ShortcutItems
집합이 포함되어 있는지 application
확인합니다.
위의 빠른 작업 처리 섹션에서 이미 추가한 코드는 정적 작업과 마찬가지로 이러한 동적 빠른 작업을 처리합니다.
정적 및 동적 빠른 작업 항목(여기서 수행하는 것처럼)을 혼합하여 만들 수 있다는 점에 유의해야 합니다. 하나 또는 다른 항목으로 제한되지 않습니다.
자세한 내용은 Apple의 ApplicationShortcuts: UIApplicationShortcutItem 샘플 앱, UIApplicationShortcutItem 클래스 참조, UIMutableApplicationShortcutItem 클래스 참조 및 UIApplicationShortcutIcon 클래스 참조를 참조하세요.
시뮬레이터에서 3D 터치 테스트
Power Touch 사용 트랙 패드와 호환되는 Mac에서 최신 버전의 Xcode 및 iOS 시뮬레이터를 사용하는 경우 시뮬레이터에서 3D 터치 기능을 테스트할 수 있습니다.
이 기능을 사용하려면 3D Touch(iPhone 6s 이상)를 지원하는 시뮬레이션된 iPhone 하드웨어에서 앱을 실행합니다. 다음으로, iOS 시뮬레이터에서 하드웨어 메뉴를 선택하고 3D 터치 메뉴 항목에 대해 트랙 패드 힘 사용을 사용하도록 설정합니다.
이 기능이 활성 상태이면 실제 iPhone 하드웨어에서와 마찬가지로 Mac의 트랙 패드를 더 세게 눌러 3D Touch를 사용하도록 설정할 수 있습니다.
요약
이 문서는 아이폰 6s와 아이폰 6s 플러스에 대 한 iOS 9에서 사용할 수 있는 새로운 3D 터치 API를 소개 했다. 앱에 압력 민감도 추가를 다루었습니다. Peek 및 Pop을 사용하여 탐색 없이 현재 컨텍스트에서 앱 내 정보를 빠르게 표시합니다. 빠른 작업을 사용하여 앱에서 가장 일반적으로 사용되는 기능에 대한 바로 가기를 제공합니다.