问题描述
新的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,可是对于很多功能还不会用....