首页 > 开发 > iOS > 正文

iOS开发教程之3D Touch

2016-05-18 19:21:05  来源:慕课网

  3D Touch的触控技术,被苹果称为新一代多点触控技术。随着这项技术的出现,iOS开发者们为了行业需求也进行了新技术的攻关。3D Touch包含三大模块:peek and pop、Home Screen Quick Actions、Force Properties。这里进行一下Home Screen Quick Actions和peek and pop在实际开发中简单实现。       注:在xcode7以上都可以支持3D touch的开发,正常情况下在模拟器上是不能进行调试,但是可以通过    实现在模拟器上调试 Home screen quick actions,但是对于其他两个模块只能在真机上调试。  1.Home Screen Quick Actions即在主屏幕按压应用图标快速获取到进入应用某些功能的菜单      3D Touch快速入口标签有两种添加方式:一种是静态添加,在工程中的info.plist文件中添加相关标签选项,通过这种方式添加的标签选项,在App第一次运行前,就可以唤出这些标签选项;另一种是动态添加,通过代码给App添加快速入口。这种方式添加的标签选项,第一次运行App前是看不到这些标签选项的,必须先运行一次App,以后就可以唤出这些标签选项了。  (1)静态添加入口标签:我们需要在info.plist中添加如下信息:   设置后在真机(iPhone6S或者6sPlus)上运行程序,运行成功后,退出程序,按压应用图标,就会有相应的效果。如果想添加多个标签,可在Item 0下边按照上述标准继续添加Item1,Item2,Item3等(最多四个)。 (2)动态添加入口标签:动态添加入口标签就是通过代码来实现。  在工程的viewDidLoad方法中创建标签的Icon图标;然后再创建一个标签并配置相关属性;然后将标签添加到Application的shortcutItems中。具体实现如下:

//3D Touch  
//创建标签icon图标  
UIApplicationShortcutIcon * icon = [UIApplicationShortcutIcon iconWithType:UIApplicationShortcutIconTypeAdd]; 
//创建一个标签并设置相关属性  
UIApplicationShortcutItem * item = [[UIApplicationShortcutItem alloc] initWithType:@"2" localizedTitle:@"主标题2" localizedSubtitle:@"副标题2" icon:icon userInfo:nil];  
//将标签添加到UIApplication的shortcutItems数组中  
[UIApplication sharedApplication].shortcutItems = @[item];

 这样,再次测试,运行程序后,退出后,按压应用图标,弹出框由之前的一个变成两个。    上述代码首先是创建标签入口,这一步与设置info.plist中 UIApplicationShortcutItemIconType的效果是相同的。同时系统还为我们提供了不同样式的标签。如下:  

typedef NS_ENUM(NSInteger, UIApplicationShortcutIconType) {
    UIApplicationShortcutIconTypeCompose,
    UIApplicationShortcutIconTypePlay,
    UIApplicationShortcutIconTypePause,
    UIApplicationShortcutIconTypeAdd,
    UIApplicationShortcutIconTypeLocation,
    UIApplicationShortcutIconTypeSearch,
    UIApplicationShortcutIconTypeShare,
    UIApplicationShortcutIconTypeProhibit NS_ENUM_AVAILABLE_IOS(9_1),
    UIApplicationShortcutIconTypeContact NS_ENUM_AVAILABLE_IOS(9_1),
    UIApplicationShortcutIconTypeHome NS_ENUM_AVAILABLE_IOS(9_1),
    UIApplicationShortcutIconTypeMarkLocation NS_ENUM_AVAILABLE_IOS(9_1),
    UIApplicationShortcutIconTypeFavorite NS_ENUM_AVAILABLE_IOS(9_1),
    UIApplicationShortcutIconTypeLove NS_ENUM_AVAILABLE_IOS(9_1),
    UIApplicationShortcutIconTypeCloud NS_ENUM_AVAILABLE_IOS(9_1),
    UIApplicationShortcutIconTypeInvitation NS_ENUM_AVAILABLE_IOS(9_1) UIApplicationShortcutIconTypeConfirmation NS_ENUM_AVAILABLE_IOS(9_1),
    UIApplicationShortcutIconTypeMail NS_ENUM_AVAILABLE_IOS(9_1),
    UIApplicationShortcutIconTypeMessage NS_ENUM_AVAILABLE_IOS(9_1),
    UIApplicationShortcutIconTypeDate NS_ENUM_AVAILABLE_IOS(9_1),
    UIApplicationShortcutIconTypeTime NS_ENUM_AVAILABLE_IOS(9_1),
    UIApplicationShortcutIconTypeCapturePhoto NS_ENUM_AVAILABLE_IOS(9_1),
    UIApplicationShortcutIconTypeCaptureVideo NS_ENUM_AVAILABLE_IOS(9_1),
    UIApplicationShortcutIconTypeTask NS_ENUM_AVAILABLE_IOS(9_1),
    UIApplicationShortcutIconTypeTaskCompleted NS_ENUM_AVAILABLE_IOS(9_1),
    UIApplicationShortcutIconTypeAlarm NS_ENUM_AVAILABLE_IOS(9_1),
    UIApplicationShortcutIconTypeBookmark NS_ENUM_AVAILABLE_IOS(9_1),
    UIApplicationShortcutIconTypeShuffle NS_ENUM_AVAILABLE_IOS(9_1),
    UIApplicationShortcutIconTypeAudio NS_ENUM_AVAILABLE_IOS(9_1),
    UIApplicationShortcutIconTypeUpdate NS_ENUM_AVAILABLE_IOS(9_1)
} NS_ENUM_AVAILABLE_IOS(9_0) __TVOS_PROHIBITED;

       完成以上步骤之后,相当于日常开发中创建了UIButton并添加到了相应地View上面,剩下的就是添加点击回调了,也就是说通过检测用户以哪种方式进入的应用,并且根据不同的方式确定不同的响应。   iOS9在AppDelegated中提供了一个新方法:  

-(void)application:(UIApplication )application  performActionForShortcutItem:(UIApplicationShortcutItem )shortcutItem completionHandler:(void (^)(BOOL))completionHandler;

  如果应用是从3D Touch快速入口启动的,则会执行这个方法。该方法的shortcutItem参数携带了从快速入口进入应用时的标签参数。我们可以在这个方法里判断shortcutItem.localizedTitle属性的值来判断是从哪一个标签进入的应用。
注意事项:
1)最多只会显示4个Item,也就是说无论你往数组里面放多少个,都只会显示四个;
2)当静态,动态两种方法同时存在的时候,会先读取静态添加的Item,然后才会进行动态添加。
2.Peek and Pop(预览与跳转) 交互过程分为三个步骤:     (1)轻压UI元素,周围界面变模糊,提示用户3D Touch中peek可用;
(2)深按一会,会弹出该元素的预览视图;
(3)再用力按住,即可全部进入视图;若视图上有交互控件,通过向上滑动,可以进一步操作。  
  在开发过程中,想要在App内使用该功能之前,应该先检测一下设备是否支持3D Touch功能,iOS9中添加了UIForceTouchCapability这一属性,可在ViewWillAppear中调用下面方法进行判断,如果设备不支持的话,可以替换成长按等其他响应手势。
  

if(self.traitCollection.forceTouchCapability==UIForceTouchCapabilityAvailable){  };

另外还可以对手势改变进行监听,如果用户在使用过程中修改了3D Touch设置,则会触发方法回调  

-(void)traitCollectionDidChange:(UITraitCollection)previousTraitCollection;

确定了3D Touch功能可用之后,就可以对视图进行注册。

- (id)registerForPreviewingWithDelegate:(id)delegate;

在这之后,只要该视图响应了Touch手势,就会触发下面的方法回调,只要在这个方法里返回想要进行预览展示的UIViewController就可以了。  

- (UIViewController)previewingContext:(id)previewingContext viewControllerForLocation:(CGPoint)location;

如果在预览页面向上滑动的话,则会弹出UIPreviewAction,具体的实现应该在所预览的ViewController中实现,-(NSArray<id<UIPreviewActionItem>>)previewActionItems,需要注意的是数组中可添加UIPreviewAction 和 UIPreviewActionGroup两种类型的参数。
最后,如果在peek的基础上继续用力按压的话,则会触发pop效果,具体的调用方法是

-(void)previewingContext:(id)previewingContext  commitViewController:(UIViewController)viewControllerToCommit;

经过测试测试发现,在该回调方法中,我们可以直接对这个返回ViewController进行操作,也可以另外创建ViewController进行弹出操作,具体弹出调用的方法为:

[self showViewController:viewControllerToCommit sender:self];