3D Touch
是iPhone6s
以上机型而且是iOS9
及以上系统而引入的三维触控功能git
做用:github
开关设置:app
在3D Touch设备上,能够在设置
>通用
>辅助功能
>三维触控
中选择开启或者关闭touch功能,以及设置灵敏度动画
用户能够按住屏幕的应用图标启动touch提供的一组快速操做的功能,当用户选择其中某一项操做时,在appdelegate的应用委托中会收到回调响应的信息atom
目前最多支持应用显示四个主屏幕的快速操做,在限制的范围内,从菜单中的最顶部位置开始,系统首先显示静态快速操做。当添加了四个静态的快速操做后,即使添加动态快速操做也不会有任何响应。spa
有些应用中出现五项快捷操做。通过笔者的研究,分享应用的touch Item是上线后,系通通一为应用提供的功能,应用上线后系统为每个应用提供了默认的分享touch功能
3d
在应用首次启动以前,主屏幕仅显示程序的静态快捷操做,首次启动后,动态添加的操做也会显示。若是用户应用更新后还没有启动更新,则主屏幕的快捷操做会响应以前操做,这个时候UIApplicationShortcutItemUserInfo
就起到了关键性的做用,由于该键中应定义应用版本的信息以响应不一样版本的操做代理
实例: code
item旗下支持的键:orm
描述启动项的秘钥(必填)
item的名称(必填)
item的辅助注释(选填)
item中系统提供icon的选项(选填)
指定项目的中资源icon文件(选填)大小为35x35 point
自定义的键值对(选填)
该类系统目前仅提供三个类方法
//使用系统定义的icon建立
+ (instancetype)iconWithType:(UIApplicationShortcutIconType)type;
//使用资源文件中的图片资源建立
+ (instancetype)iconWithTemplateImageName:(NSString *)templateImageName;
//使用联系人建立
+ (instancetype)iconWithContact:(CNContact *)contact;
复制代码
//仅定义启动项的秘钥以及名称
- (instancetype)initWithType:(NSString *)type localizedTitle:(NSString *)localizedTitle;
- (instancetype)initWithType:(NSString *)type
localizedTitle:(NSString *)localizedTitle
localizedSubtitle:(NSString *)localizedSubtitle
icon:(UIApplicationShortcutIcon *)icon
userInfo:(NSDictionary<NSString *,id<NSSecureCoding>> *)userInfo;
复制代码
能够经过UIApplicationShortcutItem
设置可变的touch操做。动态设置的touch是可变的,apple中提供了变换Item的实例。
实例代码:
//该方法获取到的items实际上是上次设置的项
NSArray <UIApplicationShortcutItem *> *existingShortcutItems = [[UIApplication sharedApplication] shortcutItems];
UIApplicationShortcutItem *existingShortcutItem = [existingShortcutItems firstObject];
NSMutableArray <UIApplicationShortcutItem *> *updatedShortcutItems = [existingShortcutItems mutableCopy];
UIMutableApplicationShortcutItem *mutableShortcutItem = [existingShortcutItem mutableCopy];
NSInteger index = [existingShortcutItems indexOfObject:existingShortcutItem];
[mutableShortcutItem setLocalizedTitle: @"New Title"];
[updatedShortcutItems replaceObjectAtIndex: index withObject: mutableShortcutItem];
[[UIApplication sharedApplication] setShortcutItems: updatedShortcutItems];
复制代码
在Appdelegate中实现协议以驱动快捷操做的响应
- (void)application:(UIApplication *)application
performActionForShortcutItem:(UIApplicationShortcutItem *)shortcutItem
completionHandler:(void (^)(BOOL succeeded))completionHandler;
完成操做后,应使用对应的布尔值完成处理程序
复制代码
当应用程序未启动,此时经过快捷touch启动项目时:
系统会先回调- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
代理
而后再调用- (void)application:(UIApplication *)application performActionForShortcutItem:(UIApplicationShortcutItem *)shortcutItem completionHandler:(void (^)(BOOL))completionHandler
的回调。
此种状况apple建议在didFinishLaunchingWithOptions
中获取launchOptions
中UIApplicationLaunchOptionsShortcutItemKey
键值的相关信息以处理Touch的快捷启动,此时返回NO
后,系统不会再回调- (void)application:(UIApplication *)application performActionForShortcutItem:(UIApplicationShortcutItem *)shortcutItem completionHandler:(void (^)(BOOL))completionHandler
在使用快速预览的时候,须要判断Touch的可用性,而且须要注意用在运行程序时关闭Touch功能
实例:
//遵照UITraitEnvironment协议
1.判断是否可用来决定的是否注册touch视图
if (self.traitCollection.forceTouchCapability == UIForceTouchCapabilityAvailable) {
//注册touch视图
}
2.监听Touch开关变化
- (void)traitCollectionDidChange:(UITraitCollection *)previousTraitCollection {
}
复制代码
//用户在Touch向上滑动时显示的快捷操做
@property(nonatomic, readonly) NSArray<id<UIPreviewActionItem>> *previewActionItems;
//注册视图参与Touch预览功能,指定源视图响应触摸
- (id<UIViewControllerPreviewing>)registerForPreviewingWithDelegate:(id<UIViewControllerPreviewingDelegate>)delegate
sourceView:(UIView *)sourceView;
//取消注册的上下文标识
- (void)unregisterForPreviewingWithContext:(id<UIViewControllerPreviewing>)previewing;
复制代码
//sourceView的边界,动画启动的定位
@property(nonatomic) CGRect sourceRect;
//Touch手势
@property(nonatomic, readonly) UIGestureRecognizer *previewingGestureRecognizerForFailureRelationship;
//Delegate
@property(nonatomic, readonly) id<UIViewControllerPreviewingDelegate> delegate;
//源视图
@property(nonatomic, readonly) UIView *sourceView;
复制代码
/* 当用户在预览视图控制器中Touch的时候回调
*
* previewingContext 预览视图控制器上下文对象
* location 触摸在源视图坐标系中的位置
* 返回显示对应的控制器,能够经过返回nil,禁用预览
*/
- (UIViewController *)previewingContext:(id<UIViewControllerPreviewing>)previewingContext
viewControllerForLocation:(CGPoint)location;
//Touch响应点后的操做,通常推出须要显示的视图控制器
- (void)previewingContext:(id<UIViewControllerPreviewing>)previewingContext
commitViewController:(UIViewController *)viewControllerToCommit;
复制代码
/* 建立一个快捷操做
*
* title 动做的标题
* style 快捷操做的类型
*/
+ (instancetype)actionWithTitle:(NSString *)title
style:(UIPreviewActionStyle)style
handler:(void (^)(UIPreviewAction *action, UIViewController *previewViewController))handler;
//快捷操做调用的快
@property(nonatomic, copy, readonly, nonnull) void (^handler)(id<UIPreviewActionItem> action, UIViewController *previewViewController);
复制代码
/* 快捷操做组
*
* title 组的标题
* style 组的类型
*/
+ (instancetype)actionGroupWithTitle:(NSString *)title
style:(UIPreviewActionStyle)style
actions:(NSArray<UIPreviewAction *> *)actions;
复制代码
//快速行动的标题
@property(nonatomic, copy, readonly) NSString *title;
复制代码
UIViewControllerPreviewingDelegate
协议,并实现相关的代理previewActionItems
属性便可