Wprowadzenie do funkcji 3D Touch na platformie Xamarin.iOS

W tym artykule omówiono używanie nowych gestów i Telefon 6 i i Telefon 6s Plus 3D Touch w aplikacji.

Examples of 3D Touch enabled apps

Ten artykuł zawiera wprowadzenie do korzystania z nowych interfejsów API 3D Touch w celu dodania gestów wrażliwych na nacisk do aplikacji platformy Xamarin.iOS działających na nowych urządzeniach i Telefon 6s i i Telefon 6s Plus.

Dzięki funkcji 3D Touch aplikacja i Telefon jest teraz w stanie nie tylko powiedzieć, że użytkownik dotyka ekranu urządzenia, ale jest w stanie zrozumieć, ile nacisku wywiera użytkownik i reaguje na różne poziomy ciśnienia.

Funkcja 3D Touch udostępnia następujące funkcje aplikacji:

  • Czułość nacisku — aplikacje mogą teraz mierzyć, jak ciężko lub lekko użytkownik dotyka ekranu i korzysta z tych informacji. Na przykład aplikacja do malowania może sprawić, że linia jest grubsza lub cieńsza w zależności od tego, jak ciężko użytkownik dotyka ekranu.
  • Zobacz i pop — Aplikacja może teraz zezwolić użytkownikowi na interakcję z danymi bez konieczności przechodzenia z bieżącego kontekstu. Naciskając mocno na ekranie na ekranie, mogą zajrzeć do interesującego go elementu (na przykład podgląd wiadomości). Naciskając mocniej, mogą pojawić się w elemencie.
  • Szybkie akcje — szybkie akcje , takie jak menu kontekstowe, które można pojawić, gdy użytkownik kliknie prawym przyciskiem myszy element w aplikacji klasycznej. Za pomocą szybkich akcji można dodawać skróty do funkcji w aplikacji bezpośrednio z poziomu ikony aplikacji na ekranie głównym.
  • Testowanie funkcji 3D Touch w symulatorze — przy użyciu odpowiedniego sprzętu dla komputerów Mac można przetestować aplikacje z obsługą funkcji 3D Touch w symulatorze systemu iOS.

Czułość ciśnienia

Jak wspomniano powyżej, przy użyciu nowych właściwości klasy UITouch można zmierzyć ilość ciśnienia, jaką użytkownik stosuje do ekranu urządzenia z systemem iOS i używać tych informacji w interfejsie użytkownika. Na przykład zwiększenie przezroczystego lub nieprzezroczystego pociągnięcia pędzla na podstawie ilości ciśnienia.

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

W wyniku funkcji 3D Touch, jeśli aplikacja jest uruchomiona w systemie iOS 9 (lub nowszym), a urządzenie z systemem iOS może obsługiwać funkcję 3D Touch, zmiany ciśnienia spowodują TouchesMoved podniesienie zdarzenia.

Na przykład podczas monitorowania zdarzenia interfejsu TouchesMovedużytkownikaView można użyć następującego kodu, aby uzyskać bieżące ciśnienie, które użytkownik stosuje do ekranu:

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

Właściwość MaximumPossibleForce zwraca najwyższą możliwą wartość właściwości Force interfejsu użytkownikaTouch na podstawie urządzenia z systemem iOS, na którym działa aplikacja.

Ważne

Zmiany ciśnienia spowodują TouchesMoved podniesienie zdarzenia, nawet jeśli współrzędne X/Y nie uległy zmianie. Ze względu na tę zmianę zachowania aplikacje systemu iOS powinny być przygotowane do częstszego TouchesMoved wywoływania zdarzenia, a współrzędne X/Y powinny być takie same jak ostatnie TouchesMoved wywołanie.

Aby uzyskać więcej informacji, zobacz TouchCanvas firmy Apple: wydajne i efektywne przykładowe aplikacje oraz dokumentacja klas UITouch firmy Apple.

Zaglądaj i Pop

Funkcja 3D Touch oferuje nowe sposoby interakcji użytkownika z informacjami w aplikacji szybciej niż kiedykolwiek, bez konieczności przechodzenia z bieżącej lokalizacji.

Jeśli na przykład aplikacja wyświetla tabelę komunikatów, użytkownik może nacisnąć ciężko na elemencie, aby wyświetlić podgląd jego zawartości w widoku nakładki (który apple nazywa podglądem).

An example of Peeking at content

Jeśli użytkownik naciska ciężej, wprowadzi zwykły widok komunikatu (określany jako Pop-ping w widoku).

Sprawdzanie dostępności funkcji 3D Touch

Podczas pracy z programem UIViewController możesz użyć następującego kodu, aby sprawdzić, czy urządzenie z systemem iOS, na którym działa aplikacja, obsługuje funkcję 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);
        ...

Tę metodę można wywołać przed lub poViewDidLoad().

Obsługa podglądu i wyskakującego okienka

Na urządzeniu z systemem iOS, które może obsługiwać 3D Touch, możemy użyć wystąpienia UIViewControllerPreviewingDelegate klasy do obsługi wyświetlania szczegółów podglądu i pop elementu. Jeśli na przykład mieliśmy kontroler widoku tabeli o nazwie MasterViewController , możemy użyć następującego kodu do obsługi podglądu i 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
    }
}

Metoda GetViewControllerForPreview służy do wykonywania operacji Podgląd . Uzyskuje on dostęp do komórki tabeli i danych zapasowych, a następnie ładuje je DetailViewController z bieżącego scenorysu. Ustawiając wartość PreferredContentSize na (0,0) prosimy o domyślny rozmiar widoku Podgląd . Na koniec rozmywamy wszystko, ale komórkę, z której się wyświetlamy previewingContext.SourceRect = cell.Frame , i zwracamy nowy widok do wyświetlenia.

Ponownie CommitViewController użyje widoku utworzonego w widoku Podgląd okna podręcznego, gdy użytkownik naciska ciężej.

Rejestrowanie w poszukiwaniu podglądu i wyskakującego okienka

Z poziomu kontrolera widoku, z którego chcemy zezwolić użytkownikowi na przeglądanie i wyświetlanie elementów pop , musimy zarejestrować się w tej usłudze. W przykładzie podanym powyżej kontrolera widoku tabeli (MasterViewController) użyjemy następującego kodu:

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

}

W tym miejscu wywołujemy metodę RegisterForPreviewingWithDelegate z wystąpieniem utworzonego PreviewingDelegate powyżej elementu . Na urządzeniach z systemem iOS, które obsługują dotyk 3D, użytkownik może naciskać ciężko na elemencie, aby zajrzeć do niego. Jeśli naciskają jeszcze mocniej, element pojawi się w standardowym widoku wyświetlania.

Aby uzyskać więcej informacji, zobacz przykładowe aplikacje dla systemu iOS 9 ApplicationShortcuts i ViewControllerPreviews firmy Apple: korzystanie z przykładowej aplikacji interfejsów API podglądu interfejsów API interfejsu UŻYTKOWNIKAIViewAction, dokumentacja klas UIPreviewActionGroup i Dokumentacja protokołu UIPreviewActionItem.

Szybkie akcje

Za pomocą funkcji 3D Touch i Quick Actions można dodawać typowe, szybkie i łatwe w dostępie skróty do funkcji w aplikacji z poziomu ikony ekranu głównego na urządzeniu z systemem iOS.

Jak wspomniano powyżej, możesz traktować szybkie akcje, takie jak menu kontekstowe, które można wyświetlać, gdy użytkownik kliknie prawym przyciskiem myszy element w aplikacji klasycznej. Użyj funkcji Szybkich akcji, aby udostępnić skróty do najbardziej typowych funkcji lub funkcji aplikacji.

An example of a Quick Actions menu

Definiowanie statycznych szybkich akcji

Jeśli co najmniej jedna szybka akcja wymagana przez aplikację jest statyczna i nie trzeba jej zmieniać, możesz je zdefiniować w pliku aplikacji Info.plist . Edytuj ten plik w edytorze zewnętrznym i dodaj następujące klucze:

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

W tym miejscu definiujemy dwa statyczne elementy szybkiej akcji z następującymi kluczami:

  • UIApplicationShortcutItemIconType - Definiuje ikonę, która będzie wyświetlana przez element Szybkie działanie jako jedną z następujących wartości:

    • 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 - Definiuje podtytuł elementu.

  • UIApplicationShortcutItemTitle - Definiuje tytuł elementu.

  • UIApplicationShortcutItemType — Jest wartością ciągu, która będzie używana do identyfikowania elementu w naszej aplikacji. Aby uzyskać więcej informacji, zobacz następną sekcję.

Ważne

Nie można uzyskać dostępu do elementów skrótów szybkiej akcji ustawionych w Info.plist pliku za Application.ShortcutItems pomocą właściwości . Są one przekazywane tylko do programu obsługi zdarzeń HandleShortcutItem .

Identyfikowanie elementów szybkiej akcji

Jak pokazano powyżej, po zdefiniowaniu elementów szybkiej akcji w aplikacji Info.plistprzypisano wartość ciągu do UIApplicationShortcutItemType klucza w celu ich zidentyfikowania.

Aby ułatwić pracę z tymi identyfikatorami w kodzie, dodaj klasę o nazwie ShortcutIdentifier do projektu aplikacji i ustaw ją tak:

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

Obsługa szybkiej akcji

Następnie należy zmodyfikować plik aplikacji, aby obsłużyć użytkownika wybranie elementu Szybkie działanie z ikony aplikacji AppDelegate.cs na ekranie głównym.

Wprowadź następujące zmiany:

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

Najpierw definiujemy właściwość publiczną LaunchedShortcutItem , aby śledzić ostatni wybrany element Szybkie działanie przez użytkownika. Następnie zastąpimy metodę FinishedLaunching i sprawdzimy, czy launchOptions została przekazana, oraz czy zawiera element Szybkie działanie. Jeśli tak, przechowujemy szybką akcję we LaunchedShortcutItem właściwości .

Następnie zastąpimy metodę OnActivated i przekażemy dowolny wybrany element Szybkiego uruchamiania do HandleShortcutItem metody, która ma być uruchamiana. Obecnie zapisujemy tylko komunikat w konsoli. W prawdziwej aplikacji obsłużysz, jakie kiedykolwiek działania były wymagane. Po wykonaniu LaunchedShortcutItem akcji właściwość zostanie wyczyszczone.

Na koniec, jeśli aplikacja była już uruchomiona, metoda zostanie wywołana w celu obsługi elementu szybkiej akcji, PerformActionForShortcutItem więc musimy ją zastąpić i wywołać tutaj również naszą HandleShortcutItem metodę.

Tworzenie dynamicznych elementów szybkiej akcji

Oprócz definiowania statycznych elementów szybkiej akcji w pliku aplikacji Info.plist można utworzyć dynamiczne szybkie akcje na bieżąco. Aby zdefiniować dwie nowe dynamiczne szybkie akcje, zmodyfikuj AppDelegate.cs plik ponownie i zmodyfikuj metodę FinishedLaunching tak, aby wyglądała następująco:

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

Teraz sprawdzamy, czy application element zawiera już zestaw dynamicznie utworzonych ShortcutItemsobiektów , jeśli nie utworzymy dwóch nowych UIMutableApplicationShortcutItem obiektów w celu zdefiniowania nowych elementów i dodania ich do tablicy ShortcutItems .

Kod, który dodaliśmy już w powyższej sekcji Obsługa szybkiej akcji , będzie obsługiwać te dynamiczne szybkie akcje tak jak te statyczne.

Należy zauważyć, że można utworzyć kombinację zarówno statycznych, jak i dynamicznych elementów szybkiej akcji (jak to robimy tutaj), nie jest ograniczona do jednego lub drugiego.

Aby uzyskać więcej informacji, skorzystaj z naszego przykładu ViewControllerPreview dla systemu iOS 9 i zobacz ApplicationShortcuts firmy Apple: Using UIApplicationShortcutItem sample app, UIApplicationShortcutItem Class Reference, UIMutableApplicationShortcutItem Class Reference and UIApplicationShortcutIcon Class Reference (Dokumentacja klasy UIApplicationShortcutIcon).

Testowanie dotyku 3D w symulatorze

W przypadku korzystania z najnowszej wersji programu Xcode i symulatora systemu iOS na zgodnym komputerze Mac z trackpadem z funkcją Force Touch można przetestować funkcje 3D Touch w symulatorze.

Aby włączyć tę funkcję, uruchom dowolną aplikację w symulowanym sprzęcie i Telefon obsługującym funkcję 3D Touch (i Telefon 6s i nowsze). Następnie wybierz menu Sprzęt w symulatorze systemu iOS i włącz element menu Use Trackpad Force for 3D touch :

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

Dzięki tej funkcji aktywnej możesz naciskać mocniej na głocie mac, aby włączyć 3D Touch tak jak w przypadku rzeczywistego sprzętu i Telefon.

Podsumowanie

W tym artykule wprowadzono nowe interfejsy API 3D Touch udostępnione w systemie iOS 9 dla systemów i Telefon 6s i i Telefon 6s Plus. Opisano w nim dodawanie poufności ciśnienia do aplikacji; używanie funkcji Podgląd i Pop w celu szybkiego wyświetlania informacji w aplikacji z bieżącego kontekstu bez nawigacji; i używanie funkcji Szybkich akcji w celu udostępnienia skrótów do najczęściej używanych funkcji aplikacji.