Pengantar Sentuhan 3D di Xamarin.iOS

Artikel ini membahas penggunaan gerakan i Telepon 6s dan i Telepon 6s Plus 3D Touch baru di aplikasi Anda.

Examples of 3D Touch enabled apps

Artikel ini akan menyediakan dan memperkenalkan penggunaan 3D Touch API baru untuk menambahkan gerakan sensitif tekanan ke aplikasi Xamarin.iOS Anda yang berjalan pada perangkat i Telepon 6s dan i Telepon 6s Plus baru.

Dengan 3D Touch, aplikasi i Telepon sekarang dapat tidak hanya memberi tahu bahwa pengguna menyentuh layar perangkat, tetapi dapat merasakan berapa banyak tekanan yang dilakukan pengguna dan merespons tingkat tekanan yang berbeda.

3D Touch menyediakan fitur berikut untuk aplikasi Anda:

  • Sensitivitas Tekanan - Aplikasi sekarang dapat mengukur seberapa keras atau ringan pengguna menyentuh layar dan memanfaatkan informasi tersebut. Misalnya, aplikasi lukisan dapat membuat garis lebih tebal atau lebih tipis berdasarkan seberapa keras pengguna menyentuh layar.
  • Intip dan Pop - Aplikasi Anda sekarang dapat memungkinkan pengguna berinteraksi dengan datanya tanpa harus menavigasi keluar dari konteks mereka saat ini. Dengan menekan keras layar layar, mereka dapat mengintip item yang mereka minati (seperti mempratinjau pesan). Dengan menekan lebih keras, mereka dapat muncul ke dalam item.
  • Tindakan Cepat - Pikirkan Tindakan Cepat seperti menu kontekstual yang dapat dimunculkan saat pengguna mengklik kanan item di aplikasi desktop. Dengan menggunakan Tindakan Cepat, Anda dapat menambahkan pintasan ke fungsi di aplikasi langsung dari ikon aplikasi di layar Beranda.
  • Menguji 3D Touch di Simulator - Dengan perangkat keras Mac yang benar, Anda dapat menguji aplikasi yang diaktifkan 3D Touch di Simulator iOS.

Sensitivitas Tekanan

Seperti yang dinyatakan di atas, dengan menggunakan properti baru kelas UITouch , Anda dapat mengukur jumlah tekanan yang diterapkan pengguna ke layar perangkat iOS dan menggunakan informasi ini di antarmuka pengguna Anda. Misalnya, membuat goresan kuas lebih tembus atau buram berdasarkan jumlah tekanan.

A brush stroke rendered as more translucent or opaque based on the amount of pressure

Sebagai hasil dari 3D Touch, jika aplikasi Anda berjalan di iOS 9 (atau lebih besar) dan perangkat iOS mampu mendukung 3D Touch, perubahan tekanan akan menyebabkan TouchesMoved peristiwa dinaikkan.

Misalnya, saat memantau TouchesMoved peristiwa UIView, Anda dapat menggunakan kode berikut untuk mendapatkan tekanan saat ini yang diterapkan pengguna ke layar:

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
        ...
    }
}

Properti MaximumPossibleForce mengembalikan nilai setingkat mungkin untuk Force properti UITouch berdasarkan perangkat iOS tempat aplikasi berjalan.

Penting

Perubahan tekanan akan menyebabkan TouchesMoved peristiwa dinaikkan, bahkan jika koordinat X/Y tidak berubah. Karena perubahan perilaku ini, aplikasi iOS Anda harus disiapkan agar TouchesMoved peristiwa dipanggil lebih sering dan agar koordinat X/Y sama dengan panggilan terakhir TouchesMoved .

Untuk informasi selengkapnya, silakan lihat TouchCanvas Apple : Menggunakan UITouch secara efisien dan efektif sampel aplikasi dan Referensi Kelas UITouch.

Intip dan Pop

3D Touch menyediakan cara baru bagi pengguna untuk berinteraksi dengan informasi dalam aplikasi Anda lebih cepat dari sebelumnya, tanpa harus menavigasi dari lokasi mereka saat ini.

Misalnya, jika aplikasi Anda menampilkan tabel pesan, pengguna dapat menekan keras item untuk mempratinjau kontennya dalam tampilan overlay (yang disebut Apple sebagai Intip).

An example of Peeking at content

Jika pengguna menekan lebih keras, mereka akan memasukkan tampilan pesan reguler (yang disebut sebagai Pop-ping ke dalam tampilan).

Memeriksa Ketersediaan Sentuh 3D

Saat bekerja dengan Anda UIViewController dapat menggunakan kode berikut untuk melihat apakah perangkat iOS yang dijalankan aplikasi mendukung 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);
        ...

Metode ini dapat dipanggil sebelum atau sesudahnyaViewDidLoad().

Menangani Intip dan Pop

Pada perangkat iOS yang dapat menangani 3D Touch, kita dapat menggunakan instans UIViewControllerPreviewingDelegate kelas untuk menangani tampilan detail item Intip dan Pop . Misalnya, jika kita memiliki Pengontrol Tampilan Tabel yang disebut MasterViewController , kita dapat menggunakan kode berikut untuk mendukung Intip dan 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
    }
}

Metode GetViewControllerForPreview ini digunakan untuk melakukan operasi Intip . Ini mendapatkan akses ke sel tabel dan data cadangan lalu memuat DetailViewController dari Storyboard saat ini. Dengan mengatur PreferredContentSize ke (0,0) kami meminta ukuran tampilan Intip default. Akhirnya, kami mengaburkan semuanya tetapi sel yang ditampilkan dengan previewingContext.SourceRect = cell.Frame dan kami mengembalikan tampilan baru untuk ditampilkan.

Menggunakan CommitViewController kembali tampilan yang kami buat di tampilan Intip untuk Pop saat pengguna menekan lebih keras.

Mendaftar untuk Mengintip dan Pop

Dari Pengontrol Tampilan yang ingin kami izinkan pengguna untuk mengintip dan Memunculkan item dari, kita perlu mendaftar untuk layanan ini. Dalam contoh yang diberikan di atas Pengontrol Tampilan Tabel (MasterViewController), kita akan menggunakan kode berikut:

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);
    }
    ...

}

Di sini kita memanggil RegisterForPreviewingWithDelegate metode dengan instans yang kita buat di PreviewingDelegate atas. Di perangkat iOS yang mendukung 3D Touch, pengguna dapat menekan keras item untuk Mengintipnya. Jika mereka menekan lebih keras, item akan Muncul ke dalam tampilan tampilan standar.

Untuk informasi selengkapnya, silakan lihat Sampel ApplicationShortcuts iOS 9 dan ViewControllerPreviews Apple: Menggunakan aplikasi sampel API pratinjau UIViewController, Referensi Kelas UIPreviewAction, Referensi Kelas UIPreviewActionGroup, dan Referensi Protokol UIPreviewActionItem.

Tindakan Cepat

Dengan menggunakan 3D Touch and Quick Actions, Anda dapat menambahkan pintasan umum, cepat, dan mudah diakses ke fungsi di aplikasi Anda dari ikon layar Utama di perangkat iOS.

Seperti yang dinyatakan di atas, Anda dapat memikirkan Tindakan Cepat seperti menu kontekstual yang dapat dimunculkan saat pengguna mengklik kanan item di aplikasi desktop. Anda harus menggunakan Tindakan Cepat untuk menyediakan pintasan ke fungsi atau fitur paling umum dari aplikasi Anda.

An example of a Quick Actions menu

Menentukan Tindakan Cepat Statis

Jika satu atau beberapa Tindakan Cepat yang diperlukan oleh aplikasi Anda statis dan tidak perlu diubah, Anda dapat menentukannya dalam file aplikasi Info.plist . Edit file ini di editor eksternal dan tambahkan kunci berikut:

<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>

Di sini kita menentukan dua item Tindakan Cepat statis dengan kunci berikut:

  • UIApplicationShortcutItemIconType - Menentukan ikon yang akan ditampilkan oleh item Tindakan Cepat sebagai salah satu nilai berikut:

    • 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

    UIApplicationShortcutIconType imagery

  • UIApplicationShortcutItemSubtitle - Mendefinisikan subtitel untuk item.

  • UIApplicationShortcutItemTitle - Mendefinisikan judul untuk item.

  • UIApplicationShortcutItemType - Adalah nilai string yang akan kita gunakan untuk mengidentifikasi item di aplikasi kita. Lihat bagian berikut untuk informasi selengkapnya.

Penting

Item pintasan Tindakan Cepat yang diatur dalam Info.plist file tidak dapat diakses dengan Application.ShortcutItems properti . Mereka hanya diteruskan ke penanganan HandleShortcutItem aktivitas.

Mengidentifikasi Item Tindakan Cepat

Seperti yang Anda lihat di atas, saat menentukan item Tindakan Cepat di aplikasi Info.plist, Anda menetapkan nilai string ke UIApplicationShortcutItemType kunci untuk mengidentifikasinya.

Untuk membuat pengidentifikasi tersebut lebih mudah dikerjakan dalam kode, tambahkan kelas yang dipanggil ShortcutIdentifier ke proyek aplikasi Anda dan buat terlihat seperti berikut:

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";
    }
}

Menangani Tindakan Cepat

Selanjutnya, Anda perlu mengubah file aplikasi AppDelegate.cs untuk menangani pengguna yang memilih item Tindakan Cepat dari ikon aplikasi Anda di layar Beranda.

Lakukan pengeditan berikut:

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));
}

Pertama, kami menentukan properti publik LaunchedShortcutItem untuk melacak item Tindakan Cepat terakhir yang dipilih oleh pengguna. Kemudian, kita mengambil alih FinishedLaunching metode dan melihat apakah launchOptions telah diteruskan dan apakah mereka berisi item Tindakan Cepat. Jika mereka melakukannya, kami menyimpan Tindakan Cepat di LaunchedShortcutItem properti .

Selanjutnya, kita mengambil alih OnActivated metode dan meneruskan item Luncur Cepat yang dipilih ke metode yang HandleShortcutItem akan ditindaklanjuti. Saat ini kami hanya menulis pesan ke Konsol. Dalam aplikasi nyata, Anda akan menangani tindakan apa pun yang diperlukan. Setelah tindakan diambil, LaunchedShortcutItem properti dibersihkan.

Terakhir, jika aplikasi Anda sudah berjalan, PerformActionForShortcutItem metode akan dipanggil untuk menangani item Tindakan Cepat sehingga kita perlu mengambil alihnya dan memanggil metode kami HandleShortcutItem di sini juga.

Membuat Item Tindakan Cepat Dinamis

Selain menentukan item Tindakan Cepat statis dalam file aplikasi Info.plist , Anda dapat membuat Tindakan Cepat dinamis saat terbang. Untuk menentukan dua Tindakan Cepat dinamis baru, edit file Anda AppDelegate.cs lagi dan ubah FinishedLaunching metode agar terlihat seperti berikut ini:

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;
}

Sekarang kita sedang memeriksa untuk melihat apakah application sudah berisi sekumpulan yang dibuat ShortcutItemssecara dinamis , jika tidak kita akan membuat dua objek baru UIMutableApplicationShortcutItem untuk menentukan item baru dan menambahkannya ke ShortcutItems array.

Kode yang sudah kami tambahkan di bagian Menangani Tindakan Cepat di atas akan menangani Tindakan Cepat dinamis ini seperti yang statis.

Perlu dicatat bahwa Anda dapat membuat campuran item Tindakan Cepat statis dan dinamis (seperti yang kami lakukan di sini), Anda tidak terbatas pada satu atau yang lain.

Untuk informasi selengkapnya, silakan lihat Sampel iOS 9 ViewControllerPreview dan lihat ApplicationShortcuts Apple: Menggunakan aplikasi sampel UIApplicationShortcutItem, Referensi Kelas UIApplicationShortcutItem, Referensi Kelas UIMutableApplicationShortcutItem dan Referensi Kelas UIApplicationShortcutIcon.

Menguji Sentuhan 3D di Simulator

Saat menggunakan versi terbaru Xcode dan iOS Simulator pada Mac yang kompatibel dengan trackpad yang diaktifkan Force Touch, Anda dapat menguji fungsionalitas 3D Touch di Simulator.

Untuk mengaktifkan fungsionalitas ini, jalankan aplikasi apa pun di perangkat keras i Telepon simulasi yang mendukung 3D Touch (i Telepon 6s dan yang lebih besar). Selanjutnya, pilih menu Perangkat Keras di Simulator iOS dan aktifkan item menu Gunakan Gaya Trackpad untuk sentuhan 3D:

Select the Hardware menu in the iOS Simulator and enable the Use Trackpad Force for 3D touch menu item

Dengan fitur ini aktif, Anda dapat menekan lebih keras pada trackpad Mac untuk mengaktifkan 3D Touch seperti yang Anda lakukan pada perangkat keras i Telepon nyata.

Ringkasan

Artikel ini telah memperkenalkan 3D Touch API baru yang tersedia di iOS 9 untuk i Telepon 6s dan i Telepon 6s Plus. Ini mencakup penambahan Sensitivitas Tekanan ke aplikasi; menggunakan Intip dan Pop untuk menampilkan informasi dalam aplikasi dengan cepat dari konteks saat ini tanpa navigasi; dan menggunakan Tindakan Cepat untuk menyediakan pintasan ke fitur aplikasi anda yang paling umum digunakan.