Introducción a 3D Touch en Xamarin.iOS
En este artículo se describe el uso de los nuevos iPhone 6s y iPhone 6s Plus 3D Touch gestos en la aplicación.
En este artículo se proporciona una introducción al uso de las nuevas API de 3D Touch para agregar gestos sensibles a la presión a las aplicaciones de Xamarin.iOS que se ejecutan en los nuevos dispositivos iPhone 6s y iPhone 6s Plus.
Con 3D Touch, una aplicación de iPhone ahora no solo puede saber que el usuario está tocándose la pantalla del dispositivo, sino que es capaz de saber cuánta presión está haciendo el usuario y responder a los distintos niveles de presión.
3D Touch proporciona las siguientes características a la aplicación:
- Sensibilidad a la presión: las aplicaciones ahora pueden medir la fuerza o la luz que el usuario está tocándose en la pantalla y aprovechar esa información. Por ejemplo, una aplicación de dibujo puede hacer que una línea sea más gruesa o más fina en función de la fuerza con la que el usuario toca la pantalla.
- Ver y sacar: la aplicación ahora puede permitir que el usuario interactúe con sus datos sin tener que salir de su contexto actual. Al presionar fuerte en la pantalla la pantalla, pueden ver el elemento en el que están interesados (como obtener una vista previa de un mensaje). Al presionar más fuerte, pueden abrirse paso a paso por el elemento.
- Acciones rápidas: piense en acciones rápidas como los menús contextuales que se pueden abrir cuando un usuario hace clic con el botón derecho en un elemento de una aplicación de escritorio. Con Acciones rápidas, puede agregar accesos directos a las funciones de la aplicación directamente desde el icono de la aplicación en la pantalla inicio.
- Pruebas 3D Touch en el simulador: con el hardware mac correcto, puede probar 3D Touch aplicaciones habilitadas en el simulador de iOS.
Sensibilidad a la presión
Como se indicó anteriormente, con las nuevas propiedades de la clase UITouch puede medir la cantidad de presión que el usuario está aplicando a la pantalla del dispositivo iOS y usar esta información en la interfaz de usuario. Por ejemplo, hacer que un trazo de pincel sea más translúcido u opaco en función de la cantidad de presión.
Como resultado de 3D Touch, si la aplicación se ejecuta en iOS 9 (o superior) y el dispositivo iOS es capaz de admitir 3D Touch, los cambios en la presión harán que se desplome TouchesMoved el evento.
Por ejemplo, al supervisar el evento de un UIView , puede usar el código siguiente para obtener la presión actual que el usuario está aplicando TouchesMoved a la pantalla: 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
...
}
}
La propiedad devuelve el valor más alto posible para la propiedad de UITouch en función del dispositivo MaximumPossibleForceForce iOS en el que se ejecuta la aplicación. MaximumPossibleForce
Importante
Los cambios en la presión provocarán que el evento TouchesMoved se suba, incluso si las coordenadas X/Y no han cambiado. Debido a este cambio de comportamiento, las aplicaciones iOS deben estar preparadas para que el evento se invoque con más frecuencia y para que las coordenadas X/Y sean las mismas que la TouchesMoved última TouchesMoved llamada.
Para obtener más información, vea TouchCanvas de Apple: Uso eficaz y eficaz de la aplicación de ejemplo UITouch y UiTouch Class Reference ( Referencia de clase de UITouch).
Peek y Pop
3D Touch proporciona nuevas maneras de que un usuario interactúe con la información dentro de la aplicación más rápido que nunca, sin tener que navegar desde su ubicación actual.
Por ejemplo, si la aplicación muestra una tabla de mensajes, el usuario puede presionar fuerte en un elemento para obtener una vista previa de su contenido en una vista superpuesta (a la que Apple hace referencia como Peek).
Si el usuario presiona más, escribirá la vista de mensajes normal (que se conoce como Pop-ping en la vista).
Comprobación de la 3D Touch disponibilidad
Al trabajar con un , puede usar el código siguiente para ver si el dispositivo iOS en el que se ejecuta la aplicación UIViewController admite 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);
...
Se puede llamar a este método antes o después de .
Control de Peek y Pop
En un dispositivo iOS que puede controlar 3D Touch, podemos usar una instancia de la clase para controlar la presentación de los detalles del elemento UIViewControllerPreviewingDelegateUIViewControllerPreviewingDelegatey Pop. Por ejemplo, si tuvieramos un controlador de vista de tabla llamado, podríamos usar el MasterViewController código siguiente para admitir MasterViewController y 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
}
}
El GetViewControllerForPreview método se usa para realizar la operación GetViewControllerForPreview Obtiene acceso a la celda de la tabla y a los datos de respaldo y, a continuación, carga desde DetailViewController el guión gráfico actual. Al establecer en PreferredContentSize (0,0), estamos solicitando el tamaño de PreferredContentSize predeterminado. Por último, desenfocamos todo, menos la celda con la que se previewingContext.SourceRect = cell.Frame muestra, y devolvemos la nueva vista para mostrarla.
reutiliza CommitViewController la vista que creamos en CommitViewController para la vista Pop cuando el usuario presiona más.
Registro para Peek y Pop
Desde el controlador de vista desde el que queremos permitir que el usuario vea los elementos Peek y Pop, es necesario registrarse para este servicio. En el ejemplo anterior de un controlador de vista de tabla ( MasterViewController ), usaríamos el código siguiente:
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);
}
...
}
Aquí llamamos al RegisterForPreviewingWithDelegate método con una instancia de que PreviewingDelegate creamos anteriormente. En dispositivos iOS que admiten 3D Touch, el usuario puede presionar fuertemente un elemento para inspeccionarlo. Si presionan aún más, el elemento aparecerá en la vista de presentación estándar.
Para obtener más información, vea nuestro ejemplo ApplicationShortcuts de iOS 9 y ViewControllerPreviews de Apple: Uso de la aplicación de ejemplo UIViewController previewing API, UIPreviewAction Class Reference, UIPreviewActionGroup Class Reference y UIPreviewActionItem Protocol Reference.
Acciones rápidas
Con 3D Touch y acciones rápidas, puede agregar accesos directos comunes, rápidos y fáciles de acceder a las funciones de la aplicación desde el icono de pantalla principal del dispositivo iOS.
Como se indicó anteriormente, puede pensar en acciones rápidas como los menús contextuales que se pueden abrir cuando un usuario hace clic con el botón derecho en un elemento de una aplicación de escritorio. Debe usar Acciones rápidas para proporcionar accesos directos a las funciones o características más comunes de la aplicación.
Definición de acciones rápidas estáticas
Si una o varias de las acciones rápidas que requiere la aplicación son estáticas y no necesitan cambiarse, puede definirlas en el archivo de la Info.plist aplicación. Edite este archivo en un editor externo y agregue las claves siguientes:
<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>
Aquí se definen dos elementos estáticos de acción rápida con las siguientes claves:
UIApplicationShortcutItemIconType: define el icono que mostrará el elemento Acción rápida como uno de los valores siguientes:UIApplicationShortcutIconTypeAddUIApplicationShortcutIconTypeAlarmUIApplicationShortcutIconTypeAudioUIApplicationShortcutIconTypeBookmarkUIApplicationShortcutIconTypeCapturePhotoUIApplicationShortcutIconTypeCaptureVideoUIApplicationShortcutIconTypeCloudUIApplicationShortcutIconTypeComposeUIApplicationShortcutIconTypeConfirmationUIApplicationShortcutIconTypeContactUIApplicationShortcutIconTypeDateUIApplicationShortcutIconTypeFavoriteUIApplicationShortcutIconTypeHomeUIApplicationShortcutIconTypeInvitationUIApplicationShortcutIconTypeLocationUIApplicationShortcutIconTypeLoveUIApplicationShortcutIconTypeMailUIApplicationShortcutIconTypeMarkLocationUIApplicationShortcutIconTypeMessageUIApplicationShortcutIconTypePauseUIApplicationShortcutIconTypePlayUIApplicationShortcutIconTypeProhibitUIApplicationShortcutIconTypeSearchUIApplicationShortcutIconTypeShareUIApplicationShortcutIconTypeShuffleUIApplicationShortcutIconTypeTaskUIApplicationShortcutIconTypeTaskCompletedUIApplicationShortcutIconTypeTimeUIApplicationShortcutIconTypeUpdate

UIApplicationShortcutItemSubtitle: define el subtítulo del elemento.UIApplicationShortcutItemTitle: define el título del elemento.UIApplicationShortcutItemType- Es un valor de cadena que usaremos para identificar el elemento en nuestra aplicación. Para obtener más información, vea la sección siguiente.
Importante
No se puede acceder a los elementos de acceso directo de acción rápida que se establecen en el archivo Info.plist con la Application.ShortcutItems propiedad . Solo se pasan al controlador HandleShortcutItem de eventos.
Identificación de elementos de acción rápida
Como vimos anteriormente, al definir los elementos de acción rápida en el de la aplicación, asignó un valor de cadena a la clave Info.plistUIApplicationShortcutItemType para identificarlos.
Para que esos identificadores sean más fáciles de trabajar con en el código, agregue una clase llamada al proyecto de la aplicación y que se parezca ShortcutIdentifier a la siguiente:
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";
}
}
Control de una acción rápida
A continuación, debe modificar el archivo de la aplicación para controlar el usuario que selecciona un elemento acción rápida en el icono de la aplicación AppDelegate.cs en la pantalla inicio.
Haga los siguientes cambios:
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));
}
En primer lugar, definimos una LaunchedShortcutItem propiedad pública para realizar el seguimiento del último elemento de acción rápida seleccionado por el usuario. A continuación, FinishedLaunching invalidamos el método y vemos si se han launchOptions pasado y si contienen un elemento de acción rápida. Si lo hacen, almacenamos la acción rápida en la LaunchedShortcutItem propiedad .
A continuación, invalidamos el método y pasamos cualquier elemento inicio rápido seleccionado al método sobre el OnActivated que se va a HandleShortcutItem actuar. Actualmente solo estamos escribiendo un mensaje en la consolade . En una aplicación real, controlaría qué acción era necesaria. Una vez realizada la acción, se LaunchedShortcutItem borra la propiedad .
Por último, si la aplicación ya se estaba ejecutando, se llamaría al método para controlar el elemento acción rápida, por lo que es necesario invalidarlo y llamar PerformActionForShortcutItem también a nuestro método HandleShortcutItem aquí.
Crear elementos de acción rápida dinámica
Además de definir elementos estáticos de acción rápida en el archivo de la aplicación, puede crear acciones rápidas dinámicas Info.plist sobre la marcha. Para definir dos nuevas acciones rápidas dinámicas, vuelva a editar AppDelegate.cs el archivo y modifique el método para que sea parecido al FinishedLaunching siguiente:
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;
}
Ahora estamos comprobando si ya contiene un conjunto de objetos creados dinámicamente, si no es así, crearemos dos nuevos objetos para definir los nuevos elementos y agregarlos a la applicationShortcutItemsUIMutableApplicationShortcutItemShortcutItems matriz.
El código que ya hemos agregado en la sección Control de una acción rápida anterior controlará estas acciones rápidas dinámicas como las estáticas.
Debe tenerse en cuenta que puede crear una mezcla de elementos de acción rápida estáticos y dinámicos (como estamos haciendo aquí), no está limitado a uno u otro.
Para obtener más información, consulte nuestro ejemplo ViewControllerPreview de iOS 9 y vea ApplicationShortcuts: Using UIApplicationShortcutItem sample app, UIApplicationShortcutItem Class Reference, UIMutableApplicationShortcutItem Class Reference y UIApplicationShortcutIcon Class Reference.
Prueba 3D Touch en el simulador
Al usar la versión más reciente de Xcode y el simulador de iOS en un equipo Mac compatible con Force Touch habilitar trackpad, puede probar la funcionalidad 3D Touch en el simulador.
Para habilitar esta funcionalidad, ejecute cualquier aplicación en hardware iPhone simulado que admita 3D Touch (iPhone 6s y superiores). A continuación, seleccione el menú Hardware en el simulador de iOS y habilite el elemento de menú táctil Use Trackpad Force for 3D (Usar Trackpad Force for 3D touch):
Con esta característica activa, puede presionar más en el panel de seguimiento del equipo Mac para habilitar 3D Touch igual que lo haría en hardware iPhone real.
Resumen
En este artículo se han presentado las nuevas API de 3D Touch disponibles en iOS 9 para iPhone 6s y iPhone 6s Plus. Se ha abordado la adición de sensibilidad a la presión a una aplicación. con Peek y Pop para mostrar rápidamente la información de la aplicación desde el contexto actual sin navegación; y el uso de Acciones rápidas para proporcionar accesos directos a las características más usadas de la aplicación.




