Úvod do 3D Touch v Xamarin.iOS

Tento článek popisuje použití nových gest i Telefon 6s a i Telefon 6s Plus 3D Touch v aplikaci.

Příklady aplikací s podporou 3D Touch

V tomto článku se dozvíte, jak pomocí nových rozhraní API 3D Touch přidat do aplikací Xamarin.iOS, která běží na nových zařízeních s i Telefon 6s a i Telefon 6s Plus.

Díky 3D Touch je teď aplikace i Telefon schopná nejen říct, že se uživatel dotkne obrazovky zařízení, ale dokáže zjistit, kolik tlaku uživatel vyvíjí a reaguje na různé úrovně tlaku.

3D Touch poskytuje vaší aplikaci následující funkce:

  • Citlivost tlaku – Aplikace teď můžou měřit, jak tvrdě nebo světlo uživatel dotkne obrazovky, a využívat tyto informace. Například aplikace pro malování může ztužovat nebo ztužovat čáru na základě toho, jak těžké je, že se uživatel dotkne obrazovky.
  • Náhled a Pop – Aplikace teď může uživateli umožnit interakci s jeho daty, aniž by musel přejít z aktuálního kontextu. Stisknutím pevného tlačítka na obrazovce si můžou prohlédnout položku, o kterou se zajímá (například zobrazení náhledu zprávy). Když stisknete těžší, můžou se do položky vyskočovat.
  • Rychlé akce – můžete si představit rychlé akce , jako jsou kontextové nabídky, které se dají rozbalit, když uživatel klikne pravým tlačítkem myši na položku v desktopové aplikaci. Pomocí rychlých akcí můžete do funkcí v aplikaci přidávat klávesové zkratky přímo z ikony aplikace na domovské obrazovce.
  • Testování 3D Touch v simulátoru – se správným hardwarem pro Mac můžete otestovat aplikace s podporou 3D Touch v simulátoru iOS.

Citlivost tlaku

Jak je uvedeno výše, pomocí nových vlastností třídy UITouch můžete měřit množství tlaku, který uživatel použije na obrazovku zařízení s iOSem, a použít tyto informace v uživatelském rozhraní. Například vytvoření tahu štětce více průsvitné nebo neprůsvitné na základě množství tlaku.

Tah štětce vykreslený jako průsvitnější nebo neprůzný na základě množství tlaku

Pokud je vaše aplikace spuštěná v iOSu 9 (nebo novějším) a zařízení s iOSem je schopné podporovat 3D Touch, změny tlaku způsobí TouchesMoved vyvolání události.

Například při monitorování TouchesMoved události UIView můžete pomocí následujícího kódu získat aktuální tlak, který uživatel používá na obrazovku:

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

Tato MaximumPossibleForce vlastnost vrátí nejvyšší možnou hodnotu vlastnosti ForceUITouch na základě zařízení s iOSem, na kterém je aplikace spuštěná.

Důležité

Změny tlaku způsobí TouchesMoved vyvolání události, i když se souřadnice X/Y nezměnily. Vzhledem k této změně chování by vaše aplikace pro iOS měly být připravené na TouchesMoved vyvolání události častěji a aby souřadnice X/Y byly stejné jako poslední TouchesMoved volání.

Další informace najdete v aplikaci TouchCanvas společnosti Apple : Efektivní a efektivní použití UITouch a reference ke třídě UITouch.

Náhled a pop

3D Touch nabízí uživatelům nové způsoby, jak rychleji pracovat s informacemi v aplikaci, aniž by museli přecházet z aktuálního umístění.

Pokud například vaše aplikace zobrazuje tabulku zpráv, může uživatel na položce stisknout pevný náhled obsahu v překryvném zobrazení (které Apple označuje jako náhled).

Příklad náhledu obsahu

Pokud uživatel stiskne těžší, zadá do zobrazení běžné zprávy (což se do zobrazení označuje jako pop-ping).

Kontrola dostupnosti 3D touch

Při práci s aplikací UIViewController můžete pomocí následujícího kódu zjistit, jestli zařízení s iOSem, na kterém aplikace běží, podporuje 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);
        ...

Tato metoda může být volána před nebo poViewDidLoad().

Zpracování náhledu a popu

Na zařízení s iOSem, které dokáže zpracovat 3D Touch, můžeme použít instanci UIViewControllerPreviewingDelegate třídy ke zpracování zobrazení podrobností položky Náhled a Pop . Pokud bychom například měli kontroler zobrazení tabulky, který se nazývá MasterViewController , mohli bychom k podpoře náhledu a pop použít následující kód:

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

Metoda GetViewControllerForPreview se používá k provedení operace Náhled . Získá přístup k buňce tabulky a záložním datům a pak načte DetailViewController z aktuální scénáře. PreferredContentSize Nastavením hodnoty (0,0) žádáme o výchozí velikost zobrazení náhledu. Nakonec rozostřeme všechno kromě buňky, se previewingContext.SourceRect = cell.Frame kterými se zobrazujeme, a vrátíme nové zobrazení pro zobrazení.

Znovu CommitViewController použije zobrazení, které jsme vytvořili v náhledupro zobrazení Pop , když uživatel stiskne obtížnější.

Registrace k náhledu a popu

Z kontroleru zobrazení, ze kterého chceme uživateli povolit zobrazit položky Náhled a Pop , musíme se zaregistrovat pro tuto službu. V příkladu uvedeném výše kontroleru zobrazení tabulky (MasterViewController) bychom použili následující kód:

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

}

Tady voláme metodu RegisterForPreviewingWithDelegate s instancí výše vytvořené instance PreviewingDelegate . Na zařízeních s iOSem, která podporují 3D Touch, může uživatel stisknout na položce pevný náhled. Pokud stisknou ještě těžší, zobrazí se položka do standardního zobrazení zobrazení.

Další informace naleznete v souboru ViewControllerPreviews společnosti Apple : Použití ukázkové aplikace API UIViewController preview, reference třídy UIPreviewAction, UIPreviewActionGroup Třídy Reference a UIPreviewActionItem Protocol Reference.

Rychlé akce

Pomocí 3D dotykového ovládání a rychlých akcí můžete v zařízení s iOSem přidávat běžné, rychlé a snadné přístupové zkratky k funkcím v aplikaci z ikony domovské obrazovky.

Jak je uvedeno výše, můžete si rychlé akce představit jako kontextové nabídky, které se dají rozbalit, když uživatel klikne pravým tlačítkem na položku v desktopové aplikaci. Rychlé akce byste měli použít k poskytování zástupců nejběžnějších funkcí nebo funkcí aplikace.

Příklad nabídky Rychlé akce

Definování statických rychlých akcí

Pokud jsou některé rychlé akce vyžadované vaší aplikací statické a nemusí se měnit, můžete je definovat v souboru aplikace Info.plist . Upravte tento soubor v externím editoru a přidejte následující klíče:

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

Tady definujeme dvě statické položky rychlé akce s následujícími klíči:

  • UIApplicationShortcutItemIconType - Definuje ikonu, která se zobrazí položkou Rychlá akce jako jedna z následujících hodnot:

    • 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 - Definuje podnadpis položky.

  • UIApplicationShortcutItemTitle – Definuje název položky.

  • UIApplicationShortcutItemType – Je řetězcová hodnota, kterou použijeme k identifikaci položky v naší aplikaci. Další informace naleznete v následující části.

Důležité

Klávesové zkratky rychlé akce, které jsou nastaveny v Info.plist souboru, nelze získat přístup pomocí Application.ShortcutItems vlastnosti. Předávají se pouze obslužné rutině HandleShortcutItem události.

Identifikace položek rychlých akcí

Jak jste viděli výše, když jste definovali položky rychlé akce v aplikaci Info.plist, přiřadili jste řetězcové hodnotě UIApplicationShortcutItemType ke klíči, abyste je identifikovali.

Pokud chcete usnadnit práci s těmito identifikátory v kódu, přidejte do projektu vaší aplikace třídu volanou ShortcutIdentifier a udělejte ji takto:

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

Zpracování rychlé akce

Dále je potřeba upravit soubor aplikace AppDelegate.cs tak, aby uživatel vybral položku Rychlé akce z ikony aplikace na domovské obrazovce.

Proveďte následující úpravy:

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

Nejprve definujeme veřejnou LaunchedShortcutItem vlastnost, která bude sledovat poslední vybranou položku rychlé akce uživatelem. Pak přepíšeme metodu FinishedLaunching a zjistíme, jestli launchOptions byla předána a jestli obsahuje položku Rychlé akce. Pokud ano, uložíme rychlou akci do LaunchedShortcutItem vlastnosti.

Dále přepíšeme metodu OnActivated a předáme všechny vybrané položky HandleShortcutItem Snadné spuštění metodě, se kterou se má jednat. V současné době do konzoly píšeme jenom zprávu. Ve skutečné aplikaci byste zvládli, co se kdy vyžadovalo. Po provedení LaunchedShortcutItem akce se vlastnost vymaže.

A konečně, pokud je vaše aplikace již spuštěná, volá se metoda pro zpracování položky Rychlé akce, PerformActionForShortcutItem takže ji musíme přepsat a volat tuto HandleShortcutItem metodu také zde.

Vytváření dynamických položek rychlých akcí

Kromě definování statických položek rychlé akce v souboru aplikace Info.plist můžete vytvořit dynamické rychlé akce za běhu. Pokud chcete definovat dvě nové dynamické rychlé akce, upravte soubor znovu a upravte AppDelegate.cs metodu FinishedLaunching tak, aby vypadala takto:

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

Teď kontrolujeme, jestli application již obsahuje sadu dynamicky vytvořených ShortcutItemsobjektů , pokud nevytvoříme dva nové UIMutableApplicationShortcutItem objekty, abychom definovali nové položky a přidali je do ShortcutItems pole.

Kód, který jsme už přidali v části Zpracování rychlé akce výše, zpracuje tyto dynamické rychlé akce stejně jako statické akce.

Je třeba poznamenat, že můžete vytvořit kombinaci statických i dynamických položek rychlé akce (jak tady děláme), nejste omezeni na jednu nebo druhou.

Další informace naleznete v AppShortcuts společnosti Apple: Použití ukázkové aplikace UIApplicationShortcutItem, UIApplicationShortcutItem – referenční dokumentace třídy, UIMutableApplicationShortcutItem – referenční dokumentace třídy a reference třídy UIApplicationShortcutIcon.

Testování 3D touch v simulátoru

Pokud používáte nejnovější verzi Xcode a simulátor iOS na kompatibilním Macu s funkcí Force Touch enable trackpad, můžete otestovat funkce 3D Touch v simulátoru.

Pokud chcete tuto funkci povolit, spusťte libovolnou aplikaci v simulovaném i Telefon hardwaru, který podporuje 3D Touch (i Telefon 6s a vyšší). Dále vyberte nabídku Hardware v simulátoru iOS a povolte položku nabídky Použít trackpad Force pro 3D dotykovou nabídku:

Vyberte nabídku Hardware v simulátoru iOS a povolte položku nabídky Použít trackpad Force pro 3D dotykovou nabídku.

Díky této funkci aktivní můžete na trackpadu Mac stisknout těžší, abyste povolili 3D Touch stejně jako na skutečném hardwaru i Telefon.

Shrnutí

Tento článek představil nová rozhraní API 3D Touch, která jsou dostupná v iOSu 9 pro i Telefon 6s a i Telefon 6s Plus. Zahrnoval přidání citlivosti tlaku do aplikace; Pomocí funkce Náhled a Pop můžete rychle zobrazit informace v aplikaci z aktuálního kontextu bez navigace; a použití rychlých akcí k poskytování zástupců nejčastěji používaných funkcí vaší aplikace.