在Tamarin中 3D Touch 的使用

来源:互联网 发布:怎样管理海量数据 编辑:程序博客网 时间:2024/05/23 02:27
新的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的事件中捕获这些信息,请参考一下代码
C# code
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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
C# code
?
1
2
3
4
5
6
7
8
9
10
public override void ViewDidLoad ()
{
    base.ViewDidLoad ();
 
    // 检测是否支持3D Touch
    if (TraitCollection.ForceTouchCapability == UIForceTouchCapability.Available) {
        // 设备支持
        ...
    }
}


响应Peek和Pop行
我们可以通过继承UIViewControllerPreviewingDelegate类来响应Peek和Pop的行为。请参考下面代码,假设我们之前提到的表格叫做MasterViewController
C# code
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
using System;
using System.Collections.Generic;
using UIKit;
using Foundation;
using CoreGraphics;
 
namespace DTouch
{
    public class PreviewingDelegate : UIViewControllerPreviewingDelegate
    {
        #region Computed Properties
        public MasterViewController MasterController { getset; }
        #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,请参考下面代码
C# code
?
1
2
3
4
5
6
7
8
9
10
11
12
public override void ViewDidLoad ()
{
    base.ViewDidLoad ();
 
    // 判断设备是否支持3D Touch
    if (TraitCollection.ForceTouchCapability == UIForceTouchCapability.Available) {
        // 注册Pop和Peek
        RegisterForPreviewingWithDelegate(new PreviewingDelegate(this), View);
    }
    ...
 
}
0 0