再看一下如何在應(yīng)用內(nèi)集成3Dtouch.
3D-touch操作分為輕按peek
跟重按pop
,根據(jù)apple官方設(shè)計規(guī)范,一般來說peek
呼出預(yù)覽視圖,我在storyboard里面創(chuàng)建一個PreviewController
用于描述呼出的預(yù)覽視圖,同時創(chuàng)建了一個DetailViewController
用于顯示最終顯示的視圖,同時我們應(yīng)該注意,pop
之后的視圖應(yīng)該與用戶正常點擊進去之后沒有任何區(qū)別.
此時我們應(yīng)用層級為
tableView---(peek)---->previewController---(pop)--->DetailviewController
無論何時,我們在使用3D-touch的時候應(yīng)當(dāng)先檢查3D-touch的可用性
- (void)check3Dtouch
{
//檢測3Dtouch是否可用,若可用注冊預(yù)覽視圖代理
if (self.traitCollection.forceTouchCapability == UIForceTouchCapabilityAvailable) {
[self registerForPreviewingWithDelegate:self sourceView:self.view];
}
}
我們在viewWillAppear里面和用戶進行3D-touch相關(guān)設(shè)置的時候都要檢查可用性
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
[self check3Dtouch];
}
///用戶可能進入設(shè)置開啟/關(guān)閉3Dtouch的時候,在這里需要再次檢測3Dtouch可用性
- (void)traitCollectionDidChange:(UITraitCollection *)previousTraitCollection
{
[self check3Dtouch];
}
別忘了設(shè)置UIViewControllerPreviewingDelegate
預(yù)覽視圖代理.
接下來只需要在對應(yīng)的代理方法里面返回相應(yīng)的控制器即可
- (UIViewController *)previewingContext:(id<UIViewControllerPreviewing>)previewingContext viewControllerForLocation:(CGPoint)location{
if ([self.presentedViewController isKindOfClass:[PreviewViewController class]]) {return nil;}
UIStoryboard *sb = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
PreviewViewController *previewController = [sb instantiateViewControllerWithIdentifier:@"preview"];
location = CGPointMake(10, 100);
return previewController;
}
- (void)previewingContext:(id<UIViewControllerPreviewing>)previewingContext commitViewController:(UIViewController *)viewControllerToCommit{
UIStoryboard *sb = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
DetailViewController *detailView = [sb instantiateViewControllerWithIdentifier:@"detailView"];
[self showViewController:detailView sender:self];
}
此時peek
跟pop
手勢都已經(jīng)集成完畢,這時候還想實現(xiàn)類似在preview下面添加alert的操作,如系統(tǒng)message里面的快捷回復(fù)
8.png
其實只需要在previewController里面實現(xiàn)
- (NSArray<id<UIPreviewActionItem>> *)previewActionItems
方法即可.PS:在xcode6.3時OC添加了制定數(shù)組元組類型的功能,有利于寫出更加嚴謹?shù)拇a,好評~
- (NSArray<id<UIPreviewActionItem>> *)previewActionItems
{
UIPreviewAction *action1 = [UIPreviewAction actionWithTitle:@"action1" style:UIPreviewActionStyleDefault handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {
NSLog(@"action1 click");
}];
UIPreviewAction *action2 = [UIPreviewAction actionWithTitle:@"action2" style:UIPreviewActionStyleDestructive handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {
NSLog(@"action2 click");
}];
UIPreviewAction *action3 = [UIPreviewAction actionWithTitle:@"action3" style:UIPreviewActionStyleSelected handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {
NSLog(@"action3 click");
}];
UIPreviewActionGroup *group1 = [UIPreviewActionGroup actionGroupWithTitle:@"group1" style:UIPreviewActionStyleDefault actions:@[action1,action2]];
UIPreviewActionGroup *group2 = [UIPreviewActionGroup actionGroupWithTitle:@"group2" style:UIPreviewActionStyleDestructive actions:@[action1,action3]];
UIPreviewActionGroup *group3 = [UIPreviewActionGroup actionGroupWithTitle:@"group3" style:UIPreviewActionStyleSelected actions:@[action2,action3]];
// NSArray *items = @[action1,action2,action3];
// NSArray *items = @[group1,group2,group3];
NSArray *items = @[action1,group1,action2,group2,action3,group3];
return items;
}
有興趣的話可以自己動手體會一下UIPreviewActionGroup
與UIPreviewAction
的區(qū)別.