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

问题描述

新的iPhone6s和iPhone6sPlus新添加了3DTouch的功能,本文简单介绍一下如何在Xamarin.iOS上面使用该功能。3DTouch不仅会感知用户按压屏幕,也会感知压力的大小。要注意一点的是,现在的iOS模拟器并不支持3DTouch,大家必须要在iPhone6s/6sPlus真机上进行测试和调试。3DTouch可以给你的应用带来全新的交互方式.•PressureSensitivity-应用可以感知用户按压屏幕的压力。这样一些绘画应用可以根据压力的大小改变笔触。•PeekandPop-应用可在单一页面中获取更多的内容。用户用力按压屏幕会弹出当前条目的额外信息,比如一些预览信息,这个行为叫做Peek,当用户再用力一点,可以跳转到预览信息的页面,这个行为叫做Pop。•QuickActions-这个行为有点类似于windows中的右键菜单,但是只是针对于应用图标的,显示一些关于这个应用的额外选项下面我们分开来讲PressureSensitivity在XamariniOS中,获取压力的大小非常简单,我们可以通过UITouch类中的一些属性来完成。我们只需要在ToucheMoved的事件中捕获这些信息,请参考一下代码publicoverridevoidTouchesMoved(NSSettouches,UIEventevt){base.TouchesMoved(touches,evt);UITouchtouch=touches.AnyObjectasUITouch;if(touch!=null){//Getthepressurevarforce=touch.Force;//获取压力varmaxForce=touch.MaximumPossibleForce;//获取压力最大值//Dosomethingwiththetouchandthepressure...}}

这里要注意的是,用户按压会触发TouchesMoved的事件,在这样的情况下X/Y的值是不变的,如果你的应用之前的代码是通过这个事件来判断X,Y值的是否改变,现在需要注意,X/Y不一定改变。相关文档请参考TouchCanvas:UsingUITouchefficientlyandeffectively和UITouchClassReference.PeekandPop这个交互行为会让用户更快的获取信息,比如用户在浏览一个表格,用户可以按压表格中的某项,获取一些关于该项的概况信息(这个行为叫做Peek),再用力一些,就可进入该项的详情页(这个行为叫做Pop或Pop-ping)。检测设备是否支持3DTouch可以通过下面的代码,在UIViewController中判断当前设备是否支持3DTouchpublicoverridevoidViewDidLoad(){base.ViewDidLoad();//检测是否支持3DTouchif(TraitCollection.ForceTouchCapability==UIForceTouchCapability.Available){//设备支持...}}

响应Peek和Pop行我们可以通过继承UIViewControllerPreviewingDelegate类来响应Peek和Pop的行为。请参考下面代码,假设我们之前提到的表格叫做MasterViewControllerusingSystem;usingSystem.Collections.Generic;usingUIKit;usingFoundation;usingCoreGraphics;namespaceDTouch{publicclassPreviewingDelegate:UIViewControllerPreviewingDelegate{#regionComputedPropertiespublicMasterViewControllerMasterController{get;set;}#endregion#regionConstructorspublicPreviewingDelegate(MasterViewControllermasterController){//Initializethis.MasterController=masterController;}publicPreviewingDelegate(NSObjectFlagt):base(t){}publicPreviewingDelegate(IntPtrhandle):base(handle){}#endregion#regionOverrideMethods///继续按压触发Pop事件publicoverridevoidCommitViewController(IUIViewControllerPreviewingpreviewingContext,UIViewControllerviewControllerToCommit){//直接使用之前创建好的详情页面MasterController.ShowViewController(viewControllerToCommit,this);}///创建预览页面,当用户触发Peek事件publicoverrideUIViewControllerGetViewControllerForPreview(IUIViewControllerPreviewingpreviewingContext,CGPointlocation){//判断表格中的条目varindexPath=MasterController.TableView.IndexPathForRowAtPoint(location);varcell=MasterController.TableView.CellAt(indexPath);varitem=MasterController.dataSource.Objects[indexPath.Row];//创建ViewController,并设置初始位置vardetailViewController=MasterController.Storyboard.InstantiateViewController("DetailViewController")asDetailViewController;detailViewController.PreferredContentSize=newCGSize(0,0);//填入数据detailViewController.SetDetailItem(item);detailViewController.NavigationItem.LeftBarButtonItem=MasterController.SplitViewController.DisplayModeButtonItem;detailViewController.NavigationItem.LeftItemsSupplementBackButton=true;//设置预览页面的位置,模糊其他页面previewingContext.SourceRect=cell.Frame;returndetailViewController;}#endregion}}

代码中GetViewControllerForPreview函数用来响应Peek行为,在这个函数中,首先我们获取当前表单,然后我们加载DetailViewController,接着通过PreferredContentSize设置Peek窗口的默认大小,最后我们通过previewingContext.SourceRect=cell.Frame这段代码来模糊其他表单,然后返回我们想要的窗口。CommitViewController这个函数会利用我们在Peek行为中创建的窗口,来给Pop显示。注册Peek和Pop行为在使用Peek和Pop之前,我们要注册他们,在当前的ViewController,请参考下面代码publicoverridevoidViewDidLoad(){base.ViewDidLoad();//判断设备是否支持3DTouchif(TraitCollection.ForceTouchCapability==UIForceTouchCapability.Available){//注册Pop和PeekRegisterForPreviewingWithDelegate(newPreviewingDelegate(this),View);}...}

在这里,我们调用RegisterForPreviewingWithDelegate方法把创建的PreviewingDelegate实例传进去,更多信息请参考,,,和.未完,更多技术资讯,请看:查看更多Xamarin技术文章:了解最新Xamarin特惠方案:

解决方案

本帖最后由 acutepig 于 2015-10-22 10:10:24 编辑
解决方案二:
看起来很深奥啊,不明觉厉。
解决方案三:

解决方案四:
我买了6s,可是对于很多功能还不会用....

时间: 2024-07-30 01:54:27

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

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

问题描述 接定义静态QuickActionsQuickActions的行为可以是一个或者多个,我们需要在Info.plist中声明他们,代码如下<key>UIApplicationShortcutItems</key><array><dict><key>UIApplicationShortcutItemIconType</key><string>UIApplicationShortcutIconTypeSearch<

浅谈3D Touch(1) -- Home screen quick action

1. 背景: 随着iOS9 和 iPhone 6s的普及,苹果官方提供的3D Touch将带给我们更好玩,更便捷的操作习惯,桌面快捷菜单可谓是3D Touch功能中最实用的一个,有了它,用户不再需要进入app后做额外的操作,便能快速进入指定的页面. 2. 前期工作: 由于手头"并(wo)没(xiang)有(yao)"iPhone 6s 的设备,很多人说,那我怎么开发这个功能呢?不怕,github上早有大神写好了模拟器的解决方案.按照这个文档上的方法依次执行,你的模拟器也能唤出快捷菜单.

浅谈3D Touch(2) -- UITouch &amp;&amp; Peek &amp;&amp; Pop

UITouch 之所以先说UITouch是因为从Peek到Pop这个过程中,相信其内部用到了这个东西,我们来看一下iOS9在这个UITouch中加了哪些东西: UIForceTouchCapability UIForceTouchCapabilityUnknown //3D Touch检测失败 UIForceTouchCapabilityUnavailable //3D Touch不可用 UIForceTouchCapabilityAvailable //3D Touch可用 这3个枚举值就是我

[技术学习]浅谈MFC中超类化技术的实现 .

自 Panr 的 Blog // 关键词:// 面对对象编程.超类化.子类化.Superclassing// MFC.CWnd::SubclassWindow// 通用控件.CMNCTRL//// 主题:// 通过CWnd::SubclassWindow 函数的分析,浅谈MFC中超类化技术的实现////// 背景// 我在2002-12月见了mahongxi (烤鸡翅膀)(色摸)在CSDN上的一个帖// 介绍了MFC中窗体的超类化的概念,以下是对我个人回贴的总结//// 日志// 修改:Panr

经验分享:浅谈垂直门户网站如何提高网站价值

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 人的价值在于对社会的贡献,但是一个网站存在的价值是什么?广大站长怎么让自己的网站体现出它存在的价值,从而给你带去可观的收入?我想这是我们值得思考的问题.接下来,我浅谈一下垂直门户网站该如何提高网站的价值.高手跳过,新手一起学习进步.现在个人站长的时代已经过去,但是还是有个人站长,为了理想,为了兴趣,为了生活在部分日夜的奋斗,苦的是付出的劳动得

一起谈.NET技术,浅谈C#中的延迟加载(2)——善用virtual

之前的文章"浅谈C#中的延迟加载(1)--善用委托"中介绍了三层结构中在Model层对实体类的属性实现延迟加载的方法,该方法利用C#中的委托来实现,最后虽然延迟加载的目的得以实现,但是给客户端(例如UI层)暴露了不必要的属性(一个委托对象,我使用了泛型的Fun类来实现).这篇文章介绍一种方法来隐藏这个属性,同时又可以达到延迟加载的目的,更重要的是这一切都是在之前的基础上来完成的,不需要改变原来使用到实体类的地方的代码. 按照惯例,我们考虑一下想要我们的代码达到什么效果:首先在Model

一起谈.NET技术,浅谈如何使用.NET存储XML数据

XML Bulk Load和Updategrams,这两种客户端技术使用带有注解的大纲指定XML文档内容和数据库的表之间的映射:OpenXML是一种服务器端技术,它允许你在XML文档上定义关系视图,有了OpenXML的关系视图,你就能使用T-SQL代码查询XML文档中的数据并把结果存储在你的SQL Server数据库中. 这三种技术中的每一种都是为特定的目的设计的.XML Bulk Load把来自很大的XML文档的数据存储在SQL Server中:Updategrams执行SQL Server数

一起谈.NET技术,浅谈提升C#正则表达式效率

说到C#的Regex,谈到最多的应该就是RegexOptions.Compiled这个东西,传说中在匹配速度方面,RegexOptions.Compiled是可以提升匹配速度的,但在启动速度上,使用了RegexOptions.Compiled情况下,通常会使启动速度慢许多,据说最多是60倍. 进行一组测试,有测试数据,才有讨论依据. 第一步,帖上测试硬件信息(呵呵,硬件有点烂:() 第二步, a.测试在没有使用RegexOptions.Compiled项时候的情况,随意使用一些内容,然后循环一万

一起谈.NET技术,浅谈C#中的延迟加载(3)——还原模型的业务规则

上一篇文章讲到把实体类中需要实现延迟加载的属性声明为virtual,然后继承实体类做一个子类,在子类里面实现该属性,配合使用委托来实现比较完美的延迟加载(原本的模型层依旧保持在最底层用于贯穿三层结构,同时又可以实现在实体类的属性里面访问到比他高层的数据访问层).文章的最后依旧出现杯具,原因是在对模型的属性实现延迟加载之前,这个属性可能由于我们业务的需要,它并不单单是作为一个存储和读取的功能使用,而是在其get或者set的访问器中都包含这或许复杂或许简单的逻辑代码. 举例:考虑一下这个情景,我们有