3D Touch 入門

 

iPhone 6s と iPhone 6s Plus のプレッシャー ベースのジェスチャー

本ガイドでは、iOS アプリで新しい iPhone 6s と iPhone 6s Plus の 3D Touch ジェスチャーを使用する方法を紹介します。

注意! iOS Simulator は、現時点では、Xcode 7 GM または Xcode 7.1 Beta の iPhone 6s または iPhone 6s Plus のシミュレーションのいずれかで、3D Touch をサポートしていません。

本ガイドでは、新しい 3D Touch の API を使用して、プレッシャー センシティブ ジェスチャーを新しい iPhone 6s と iPhone 6s Plus デバイスで起動する Xamarin.iOS アプリに追加する方法を紹介します。

3D Touch で、iPhone アプリは、ユーザーがデバイスの画面をタッチしているのを感知するだけでなく、ユーザーがどのくらいの圧力で画面をタッチしているか、異なるプレッシャー レベルを感知することができます。

3D Touch は iOS アプリに以下の機能を追加します:

  • 圧力感知 - ユーザーがどのくらい強くまたは弱くタッチしているかを感知して、情報を活用します。たとえば、描画アプリでは、ユーザーが画面をタッチする強さで、線を細く描くか、太く描くか調整します。
  • Peek と Pop - コンテンツを実際に開かなくても、ユーザーはデータを操作することができます。画面を強く押すことで、見たいアイテムを Peek できます (メッセージをプレビュー表示できます)。さらに強く押すと、アイテムがポップアップします。
  • クイック アクション - クイック アクションの機能は、デスクトップ アプリでアイテムを右クリックして表示するコンテキスト メニューに似ています。クイック アクションを使用して、ホーム画面のアプリ アイコンから直接アプリの機能を操作するショートカットを追加します。

 

圧力感知

上記の記載のとおり、UITouch クラスの新しいプロパティを使用して、ユーザーが iOS デバイスの画面をどのくらいの圧力で押しているか確認でき、UI にこの情報を使うことができます。たとえば、圧力の強さに応じて、ブラッシュ ストロークを透明にしたり、半透明にしたりできます。

3D Touch の結果として、iOS 9 (またはそれ以降で) で起動するアプリで、3D Touch をサポートする iOS デバイスの場合、圧力の変化で TouchesMoved イベントが発生します。

たとえば、UIViewTouchesMoved イベントをモニタリングする際、以下のコードを使用して、ユーザーが画面を押している現在の圧力を取得できます:

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 デバイスで、UITouchForce の最大値を返します。

注意: X/Y 座標を変更していなくても、圧力の変更で TouchesMoved イベントが発生します。この動作の変更のため、TouchesMoved イベントがより頻繁に呼び出されるように iOS アプリで対応し、また最後の TouchesMoved の呼び出しで X/Y 座標が同じなるように iOS アプリで対応します。

詳細は、Apple の TouchCanvas: Using UITouch efficiently and effectively サンプル アプリと UITouch Class Reference を参照してください。

 

Peek と Pop

3D Touch は、今まで以上に高速に、ユーザーがアプリ内の情報とインタラクティブにやり取りする新しい方法を提供します (現在の場所からのナビゲーション無しで)。

たとえば、アプリがメッセージ テーブルを表示する場合、ユーザーはアイテムを強く押して、オーバーレイ ビューでコンテンツをプレビューできます (Apple では、これを Peek と呼んでいます)。

ユーザーがより強く押すと、通常のメッセージ ビューを表示します (Apple では、これをビューの Pop-ping と呼んでいます)。

 

3D Touch 対応の確認

UIViewController を使用する場合、以下のコードを使用して、アプリが起動する iOS デバイスが 3D Touch をサポートしているか確認できます:

public override void ViewDidLoad ()
{
    base.ViewDidLoad ();

    // Check to see if 3D Touch is available
    if (TraitCollection.ForceTouchCapability == UIForceTouchCapability.Available) {
        // Do something with the 3D Touch availability
        ...
    }
}

 

Peek と Pop の処理

3D Touch をサポートする iOS デバイスでは、UIViewControllerPreviewingDelegate クラスのインスタンスを使用して、PeekPop アイテムの詳細の表示を処理できます。たとえば、MasterViewController と呼ばれる Table View Controller がある場合、以下のコードを使用して、PeekPop をサポートできます:

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 をロードします。PreferredContentSize を (0,0) に設定することで、デフォルトの Peek ビュー サイズを確認します。最後に、背景全体をぼやけさせる一方で、previewingContext.SourceRect = cell.Frame で表示するセルがあり、表示する新しいビューを返します。

ユーザーが画面をより強く押すと、CommitViewController は、Pop ビュー用の Peek で作成したビューを再利用します。

 

Peek と Pop の登録

ユーザーがアイテムを PeekPop できるようにする View Controller から、本サービスを登録する必要があります。上記で紹介した Table View Controller (MasterViewController) サンプルでは、以下のコードを使用します:

public override void ViewDidLoad ()
{
    base.ViewDidLoad ();

    // Check to see if 3D Touch is available
    if (TraitCollection.ForceTouchCapability == UIForceTouchCapability.Available) {
        // Regiser for Peek and Pop
        RegisterForPreviewingWithDelegate(new PreviewingDelegate(this), View);
    } 
    ...

}

ここでは、上記で作成した PreviewingDelegate のインスタンスで RegisterForPreviewingWithDelegate メソッドを呼び出しています。3D Touch をサポートする iOS デバイスでは、ユーザーは Peek するアイテムを強く押すことができます。さらに強く押すと、アイテムは通常のディスプレイ ビューで Pop します。

詳細は、Apple の ViewControllerPreviews: Using the UIViewController previewing APIs サンプル アプリ、UIPreviewAction Class ReferenceUIPreviewActionGroup Class ReferenceUIPreviewActionItem Protocol Reference を参照してください。

 

クイック アクション

3D Touch とクイック アクションを使用して、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 - 以下の値の一つとしてクイック アクションのアイテムで表示するアイコンを定義します:
    • UIApplicationShortcutIconTypeCompose
    • UIApplicationShortcutIconTypePlay
    • UIApplicationShortcutIconTypePause
    • UIApplicationShortcutIconTypeAdd
    • UIApplicationShortcutIconTypeLocation
    • UIApplicationShortcutIconTypeSearch
    • UIApplicationShortcutIconTypeShare
  • UIApplicationShortcutItemSubtitle - アイテムのサブタイトルを定義します。
  • UIApplicationShortcutItemTitle - アイテムのタイトルを定義します。
  • UIApplicationShortcutItemType - アプリでアイテムを識別するのに使用する String の値です。詳細は以下のセクションを参照してください。

 

クイック アクションのアイテムを識別

上記のように、対象のアプリの Info.plist でクイック アクションのアイテムを定義した場合、String の値を 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));
}

最初に、public LaunchedShortcutItem プロパティを定義して、ユーザーが最後に選択したクイック アクションをトラックします。そして、FinishedLaunching メソッドをオーバーライドし、launchOptions が渡されたか、クイック アクションのアイテムが含まれているか確認します。その場合、LaunchedShortcutItem プロパティにクイック アクションを保存します。

次に、OnActivated メソッドをオーバーライドし、選択したクイック アクションのアイテムを HandleShortcutItem メソッドへ渡し実行します。現在、メッセージを Console へ書き込んでいるだけです。実際のアプリでは、何らかの必要なアクションを処理します。アクションの実行後、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;
}

これで、application が、既に動的に作成した ShortcutItems のセットを含んでいるか確認します。含んでいない場合、二つの新しい UIMutableApplicationShortcutItem オブジェクトを作成して新しいアイテムを作成し、それらを ShortcutItems 配列へ追加します。

上記のクイック アクションの処理のセクションで既に追加したコードは、静的なクイック アクションのように、これらの動的なクイック アクションを処理します。

静的と動的の両方のクイック アクションのアイテムを作成できることに注目してください (本記事で紹介していとおり)。どちらか一つに制限されません。

詳細は、Apple のApplicationShortcuts: Using UIApplicationShortcutItem サンプル アプリ、UIApplicationShortcutItem Class ReferenceUIMutableApplicationShortcutItem Class Reference および UIApplicationShortcutIcon Class Reference を参照してください。

 

まとめ

本記事は、iPhone 6s と iPhone 6s Plus の iOS 9 で利用可能な新しい 3D Touch API を紹介しました。圧力感知をアプリに追加し、Peek と Pop を使用してナビゲーションせずにコンテキストのアプリの情報を表示し、クイック アクションを使用して対象のアプリでよく使う機能へのショートカットを作成する方法を紹介しました。

 

 


Infragistics Infragistics
エンタープライズ向け統合 UI 開発コンポーネント。WinForms、モバイル、Web 用の UI コントロール。
CData ドライバー CData ドライバー
50 以上のデータ ソースへのアクセスをプログラミングなしで可能にするデータベース ドライバー。
SmartBear Software SmartBear
GUI テスト / プロファイラー / 負荷テスト / API テスト: ソフトウェア テストの自動化/工数削減/品質向上。
/n software IP*Works! /n software IP*Works!
クロスプラットフォーム対応のインターネット アプリケーション開発向けコンポーネント スイート。
UXDivers Grial UI Kit
Xamarin Forms 対応の XAML ベースの UI、UX テンプレートを提供
XFINIUM.PDF XFINIUM.PDF
Xamarin 対応のクロスプラットフォーム PDF 開発ツール
Aspose Aspose
.NET/Java で Word、Excel、PowerPoint、PDF などの Office ファイルを操作できる API ライブラリ。
Visual Studio Microsoft Visual Studio
最新の統合開発環境!アプリケーションの迅速かつ高品質な構築を支援する開発環境を提供。