3DTouch是蘋果在iOS9之后新推出的功能,功能大致可以分成兩種,一種是長按app的icon,會出現以下的界面,還有一種是在app內部的某個視圖上使用,效果如下圖。 詳細的效果也可以參見微信。微信就集成了這些功能,在微信的首頁
第一個3DTouch的實現直接在AppDelegate類里面實現就行了,貼代碼啦
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
[self setup3DTouch:application];
return YES;
}
// 3DTouch點擊的回調方法
- (void)application:(UIApplication *)application performActionForShortcutItem:(UIApplicationShortcutItem *)shortcutItem completionHandler:(void (^)(BOOL))completionHandler
{
NSLog(@"------%@",shortcutItem);
}
- (void)setup3DTouch:(UIApplication *)application
{
/**
type 該item 唯一標識符
localizedTitle :標題
localizedSubtitle:副標題
icon:icon圖標 可以使用系統類型 也可以使用自定義的圖片
userInfo:用戶信息字典 自定義參數,完成具體功能需求
*/
// UIApplicationShortcutIcon *icon1 = [UIApplicationShortcutIcon iconWithTemplateImageName:@"標簽.png"];
UIApplicationShortcutIcon *cameraIcon = [UIApplicationShortcutIcon iconWithType:UIApplicationShortcutIconTypeCompose];
UIApplicationShortcutItem *cameraItem = [[UIApplicationShortcutItem alloc] initWithType:@"typeOne" localizedTitle:@"功能1" localizedSubtitle:@"" icon:cameraIcon userInfo:nil];
UIApplicationShortcutIcon *shareIcon = [UIApplicationShortcutIcon iconWithType:UIApplicationShortcutIconTypeShare];
UIApplicationShortcutItem *shareItem = [[UIApplicationShortcutItem alloc] initWithType:@"typeTwo" localizedTitle:@"功能2" localizedSubtitle:@"" icon:shareIcon userInfo:nil];
/** 將items 添加到app圖標 */
application.shortcutItems = @[cameraItem,shareItem];
}
關於在app內部的3DTouch效果,可以參見微信的首頁。
微信的首頁是一個tableview列表,在實現表的協議方法的時候需要在這個方法里面注冊
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
注冊的方法如下:
// cell注冊綁定,設置代理,實現協議
if ([self respondsToSelector:@selector(traitCollection)]) {
if ([self.traitCollection respondsToSelector:@selector(forceTouchCapability)]) {
if (self.traitCollection.forceTouchCapability == UIForceTouchCapabilityAvailable) {
[self registerForPreviewingWithDelegate:self sourceView:cell];
}
}
}
聲明協議 <UIViewControllerPreviewingDelegate>
實現此協議的代理方法
#pragma mark - UIViewControllerPreviewingDelegate
// 3DTouch結束時預覽的界面 這里預覽的界面是--DetailViewController--
- (UIViewController *)previewingContext:(id<UIViewControllerPreviewing>)previewingContext viewControllerForLocation:(CGPoint)location
{
NSIndexPath *index = [mainTableView indexPathForCell:(UITableViewCell *)[previewingContext sourceView]];
DetailViewController *VC = [[DetailViewController alloc] init];
VC.viewTitle = [NSString stringWithFormat:@"%ld",(long)index.section];
previewingContext.sourceRect = previewingContext.sourceView.frame;
return VC;
}
// 點擊功能模塊需要實現的方法
-(void)previewingContext:(id<UIViewControllerPreviewing>)previewingContext commitViewController:(UIViewController *)viewControllerToCommit
{
[self showViewController:viewControllerToCommit sender:self];
}
注意,這里預覽的界面是 DetailViewController ,需要在 DetailViewController.m文件中實現下面的方法,這個是預覽界面需要實現的點擊功能
// 預覽界面需要實現的點擊功能
- (NSArray<id<UIPreviewActionItem>>*)previewActionItems
{
UIPreviewAction *action0 = [UIPreviewAction actionWithTitle:@"action0" style:UIPreviewActionStyleDefault handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {
NSLog(@"%s, line = %d, action0 = %@, previewViewController = %@", __FUNCTION__, __LINE__, action, previewViewController);
}];
UIPreviewAction *action1 = [UIPreviewAction actionWithTitle:@"action1" style:UIPreviewActionStyleDestructive handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {
NSLog(@"%s, line = %d, action1 = %@, previewViewController = %@", __FUNCTION__, __LINE__, action, previewViewController);
}];
UIPreviewAction *action2 = [UIPreviewAction actionWithTitle:@"action2" style:UIPreviewActionStyleSelected handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {
NSLog(@"%s, line = %d, action2 = %@, previewViewController = %@", __FUNCTION__, __LINE__, action, previewViewController);
}];
UIPreviewAction *action3 = [UIPreviewAction actionWithTitle:@"action3" style:UIPreviewActionStyleSelected handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {
NSLog(@"%s, line = %d, action2 = %@, previewViewController = %@", __FUNCTION__, __LINE__, action, previewViewController);
}];
//該按鈕可以是一個組,點擊該組時,跳到組里面的按鈕.
UIPreviewActionGroup *actionGroup = [UIPreviewActionGroup actionGroupWithTitle:@"actionGroup" style:UIPreviewActionStyleSelected actions:@[action2, action3]];
//直接返回數組.
return @[action0,action1,actionGroup];
}
--over--