[技术分享]浅谈3D Touch 在Xamarin.iOS上的应用 (上)

Allisvanity 2015-10-21 05:26:54
加精
新的iPhone6s和iPhone6s Plus新添加了3D Touch的功能,本文简单介绍一下如何在Xamarin.iOS上面使用该功能。

3D Touch不仅会感知用户按压屏幕,也会感知压力的大小。要注意一点的是,现在的iOS模拟器并不支持3D Touch,大家必须要在iPhone 6s/6s Plus 真机上进行测试和调试。

3D Touch可以给你的应用带来全新的交互方式.

•Pressure Sensitivity - 应用可以感知用户按压屏幕的压力。这样一些绘画应用可以根据压力的大小改变笔触。
•Peek and Pop - 应用可在单一页面中获取更多的内容。用户用力按压屏幕会弹出当前条目的额外信息,比如一些预览信息,这个行为叫做Peek,当用户再用力一点,可以跳转到预览信息的页面,这个行为叫做Pop。
•Quick Actions - 这个行为有点类似于windows中的右键菜单,但是只是针对于应用图标的,显示一些关于这个应用的额外选项

下面我们分开来讲

Pressure Sensitivity

在Xamarin iOS中,获取压力的大小非常简单,我们可以通过UITouch类中的一些属性来完成。我们只需要在ToucheMoved的事件中捕获这些信息,请参考一下代码
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
...
}
}

这里要注意的是,用户按压会触发TouchesMoved的事件,在这样的情况下X/Y的值是不变的,如果你的应用之前的代码是通过这个事件来判断X,Y值的是否改变,现在需要注意,X/Y不一定改变。相关文档请参考 TouchCanvas: Using UITouch efficiently and effectively 和 UITouch Class Reference.
Peek and Pop

这个交互行为会让用户更快的获取信息,比如用户在浏览一个表格,用户可以按压表格中的某项,获取一些关于该项的概况信息(这个行为叫做Peek),再用力一些,就可进入该项的详情页(这个行为叫做Pop或Pop-ping)。

检测设备是否支持3D Touch
可以通过下面的代码,在UIViewController 中判断当前设备是否支持3D Touch
public override void ViewDidLoad ()
{
base.ViewDidLoad ();

// 检测是否支持3D Touch
if (TraitCollection.ForceTouchCapability == UIForceTouchCapability.Available) {
// 设备支持
...
}
}


响应Peek和Pop行
我们可以通过继承UIViewControllerPreviewingDelegate类来响应Peek和Pop的行为。请参考下面代码,假设我们之前提到的表格叫做MasterViewController
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
/// 继续按压触发Pop事件
public override void CommitViewController (IUIViewControllerPreviewing previewingContext, UIViewController viewControllerToCommit)
{
// 直接使用之前创建好的详情页面
MasterController.ShowViewController(viewControllerToCommit,this);
}

/// 创建预览页面,当用户触发Peek事件
public override UIViewController GetViewControllerForPreview (IUIViewControllerPreviewing previewingContext, CGPoint location)
{
// 判断表格中的条目
var indexPath = MasterController.TableView.IndexPathForRowAtPoint (location);
var cell = MasterController.TableView.CellAt (indexPath);
var item = MasterController.dataSource.Objects [indexPath.Row];

// 创建ViewController,并设置初始位置
var detailViewController = MasterController.Storyboard.InstantiateViewController ("DetailViewController") as DetailViewController;
detailViewController.PreferredContentSize = new CGSize (0, 0);

// 填入数据
detailViewController.SetDetailItem (item);
detailViewController.NavigationItem.LeftBarButtonItem = MasterController.SplitViewController.DisplayModeButtonItem;
detailViewController.NavigationItem.LeftItemsSupplementBackButton = true;

// 设置预览页面的位置,模糊其他页面
previewingContext.SourceRect = cell.Frame;

return detailViewController;
}
#endregion
}
}

代码中GetViewControllerForPreview函数用来响应Peek行为,在这个函数中,首先我们获取当前表单,然后我们加载DetailViewController,接着通过PreferredContentSize设置Peek窗口的默认大小,最后我们通过previewingContext.SourceRect = cell.Frame 这段代码来模糊其他表单,然后返回我们想要的窗口。
CommitViewController 这个函数会利用我们在Peek行为中创建的窗口,来给Pop显示。

注册Peek和Pop行为

在使用Peek和Pop之前,我们要注册他们,在当前的ViewController,请参考下面代码
public override void ViewDidLoad ()
{
base.ViewDidLoad ();

// 判断设备是否支持3D Touch
if (TraitCollection.ForceTouchCapability == UIForceTouchCapability.Available) {
// 注册Pop和Peek
RegisterForPreviewingWithDelegate(new PreviewingDelegate(this), View);
}
...

}

在这里,我们调用RegisterForPreviewingWithDelegate方法把创建的PreviewingDelegate实例传进去,更多信息请参考

iOS 9 ApplicationShortcuts Sample , ViewControllerPreviews: Using the UIViewController previewing APIs , UIPreviewAction Class Reference, UIPreviewActionGroup Class ReferenceUIPreviewActionItem Protocol Reference.

未完,更多技术资讯,请看:[技术分享]浅谈3D Touch 在Xamarin.iOS上的应用 (下)

查看更多Xamarin技术文章:http://blog.csdn.net/xamarin?viewmode=contents
了解最新Xamarin特惠方案:http://mall.csdn.net/product/500
...全文
6418 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhiyikeji001 2019-02-18
  • 打赏
  • 举报
回复
cexbzxh 2016-09-19
  • 打赏
  • 举报
回复
果断收藏,学习!
qq_35614732 2016-07-15
  • 打赏
  • 举报
回复
  • 打赏
  • 举报
回复
我买了6s,可是对于很多功能还不会用....
dankong1234 2015-10-22
  • 打赏
  • 举报
回复
看起来很深奥啊,不明觉厉。

436

社区成员

发帖
与我相关
我的任务
社区描述
欢迎来到Xamarin技术交流论坛学习交流,Xamarin是一个行动App开发平台,开发人员透过Xamarin可开发出iOS、Android 与Windows 等平台的...
社区管理员
  • Xamarin技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧