3DTouch是iOS9出的新特性,用戶可以在手機主屏幕和app內部使用
1. 主屏幕的快捷操作
當用戶按壓應用圖標是會彈出快捷操作列表,當用戶選擇選擇一個快捷操作是,應用會被激活或者啓動,同事你的代理對象會收到快捷操作的信息。
- 固定的快捷操作:需要在
Info.plist
裏設置 UIApplicationShortcutItems - 動態的快捷操作:需要使用
UIApplicationShortcutItem
類和相關方法創建快捷操作,並設置UIApplication
的shortcutItems
的屬性
2. 應用內使用
當用戶按壓時會經歷三個階段:
- 看看內容預覽是否有效
- 展示預覽內容
- present出內容預覽頁面
3. 使用
- 檢查3D-Touch是否可用
//通過forceTouchCapability屬性判斷3DTousch是否可用
//UIForceTouchCapabilityUnknown、UIForceTouchCapabilityUnavailable、UIForceTouchCapabilityAvailable
//實現UITraitEnvironment協議的類都可以直接調用,UIScreen、UIWindow、UIViewController、UIView都實現了該協議
if(self.traitCollection.forceTouchCapability == UIForceTouchCapabilityAvailable){
NSLog(@"可用");
}
//重寫該方法可以監聽狀態改變改變
- (void)traitCollectionDidChange:(nullable UITraitCollection *)previousTraitCollection
如果3DTouch不可用需要自己寫 UILongPressGestureRecognizer來代替
主屏幕快捷操作—固定的快捷操作
需要在
Info.plist
文件中添加UIApplicationShortcutItems
UIApplicationShortcutItemType快捷操作的類型,需要這個識別快捷操作
UIApplicationShortcutItemTitle快捷操作的標題
UIApplicationShortcutItemSubtitle快捷操作的子標題
UIApplicationShortcutItemIconType快捷操作的圖標
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // Override point for customization after application launch. //如果程序被殺掉,在這裏拿到快捷操作 if([[UIDevice currentDevice].systemVersion floatValue] >= 9.0){ UIApplicationShortcutItem *shortcutItem = launchOptions[UIApplicationLaunchOptionsShortcutItemKey]; if(shortcutItem){ //根據type判斷要指定哪個操作 } } return YES; } //設置完plist文件後需要在appdelegate中重寫該方法 - (void)application:(UIApplication *)application performActionForShortcutItem:(UIApplicationShortcutItem *)shortcutItem completionHandler:(void (^)(BOOL))completionHandler { //根據type來判斷執行不同的操作 if([shortcutItem.type isEqualToString:@"search"]){ NSLog(@"search"); }else if([shortcutItem.type isEqualToString:@"open"]){ NSLog(@"open"); } completionHandler(YES); }
主屏幕快捷操作——— 動態的快捷操作
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // Override point for customization after application launch. if([[UIDevice currentDevice].systemVersion floatValue] >= 9.0){ UIApplicationShortcutItem *shortcutItem = launchOptions[UIApplicationLaunchOptionsShortcutItemKey]; if(shortcutItem == nil){ UIApplicationShortcutItem *firstItem = [[UIApplicationShortcutItem alloc] initWithType:@"first" localizedTitle:@"第一個" localizedSubtitle:@"子標題" icon:[UIApplicationShortcutIcon iconWithTemplateImageName:@"sun1"] userInfo:nil]; UIApplicationShortcutItem *secondItem = [[UIApplicationShortcutItem alloc] initWithType:@"second" localizedTitle:@"第二個" localizedSubtitle:@"子標題" icon:[UIApplicationShortcutIcon iconWithTemplateImageName:@"sun2"] userInfo:nil]; application.shortcutItems = @[firstItem,secondItem]; }else{ //根據type判斷要指定哪個操作 } } return YES; } //自定義圖標需要正方形,單一顏色,35*35的圖纔可以使用
應用內使用
應用內使用3DTouch需要使用
UIPreviewAction
和UIPreviewActionGroup
類以及UIPreviewActionItem
協議
- (void)viewDidLoad {
[super viewDidLoad];
_imgView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 70, 70)];
_imgView.center = self.view.center;
_imgView.image = [UIImage imageNamed:@"sun"];
_imgView.userInteractionEnabled = YES;
[self.view addSubview:_imgView];
//先判斷3DTouch是否可用
if(self.traitCollection.forceTouchCapability == UIForceTouchCapabilityAvailable){
//註冊,首先是一個代理,sourceView是你需要將3DTouch加到的view上
[self registerForPreviewingWithDelegate:self sourceView:_imgView];
}
}
//實現代理方法
#pragma UIViewControllerPreviewingDelegate
- (nullable UIViewController *)previewingContext:(id <UIViewControllerPreviewing>)previewingContext viewControllerForLocation:(CGPoint)location {
//location是按壓在應用3DTouch視圖上的位置
//設置sourceRect,應用3DTouch視圖的bounds
previewingContext.sourceRect = _imgView.bounds;
//這是需要彈出的controller
DetailViewController *detailVC = [[DetailViewController alloc] init];
//預覽是後的大小
detailVC.preferredContentSize = CGSizeMake(0, 300);
return detailVC;
}
- (void)previewingContext:(id <UIViewControllerPreviewing>)previewingContext commitViewController:(UIViewController *)viewControllerToCommit {
//present預覽的controller
[self showViewController:viewControllerToCommit sender:self];
}
//這是再DetailViewController.m文件中的重寫的,當彈出預覽時,上滑預覽視圖,出現預覽視圖中快捷選項
- (NSArray<id<UIPreviewActionItem>> *)previewActionItems {
UIPreviewAction *action1 = [UIPreviewAction actionWithTitle:@"action1" style:UIPreviewActionStyleDefault handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {
NSLog(@"action1");
}];
UIPreviewAction *action2 = [UIPreviewAction actionWithTitle:@"action2" style:UIPreviewActionStyleDefault handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {
NSLog(@"action2");
}];
UIPreviewAction *action3 = [UIPreviewAction actionWithTitle:@"action3" style:UIPreviewActionStyleDefault handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {
NSLog(@"action3");
}];
return @[action1,action2,action3];
}