iOS开发之 3D Touch 开发
在App 的开发中对于开发人员来说新设备以及新功能的适配无疑是一个很苦逼的事。在今年九月份iPhone 6S 以及 6S+ 出来之后,新的功能 3D Touch又是一个比较头疼的事。刚刚看到的时候以为是比较麻烦的东西 看着开发文档就头大(本撸主英语水平有限)。但是看完官方文档之后感觉也不是很麻烦。所以就自己写了一个Demo 供大家吐槽和狂喷。
我感觉 3D Touch 的使用和 UITabBar 差不多还是一个比较简单的东西,几乎是拿过来就能用的东西。
一、 给桌面 Icon 添加 3D Touch
首先是App 的桌面 Icon 的效果的实现。这里最多只能添加四个Btn 的点击事件。虽然对于有些App 来说的确是有点少但是我感觉 这样设计是有一定道理的 毕竟是多了之后会感觉跟一个 膏药一样很坑爹。 (附部分代码1.1 在AppDelegate 里面实现就好)
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
/* 桌面icon 的 重压效果 可以使用系统的Type 当然也可以进行自定义 还可以将其进行本地化静态处理存储为一个plist 文件 然后进行调取使用
// 系统提供的部分的类型 直接可以使用 并且附带 icon
UIApplicationShortcutIconTypeCompose,
UIApplicationShortcutIconTypePlay,
UIApplicationShortcutIconTypePause,
UIApplicationShortcutIconTypeAdd,
UIApplicationShortcutIconTypeLocation,
UIApplicationShortcutIconTypeSearch,
UIApplicationShortcutIconTypeShare
*/
UIApplicationShortcutItem *item1 = [[UIApplicationShortcutItem alloc] initWithType:@"TYShortcut1" localizedTitle:@"TYLocation" localizedSubtitle:@"你点一下试试(定位)" icon:[UIApplicationShortcutIcon iconWithType:UIApplicationShortcutIconTypeLocation] userInfo:nil];
UIApplicationShortcutItem *item2 = [[UIApplicationShortcutItem alloc] initWithType:@"TYShortcut2" localizedTitle:@"TYLocaPlay" localizedSubtitle:@"点一下试试呗(播放)" icon:[UIApplicationShortcutIcon iconWithType:UIApplicationShortcutIconTypePlay] userInfo:nil];
UIApplicationShortcutItem *item3 = [[UIApplicationShortcutItem alloc] initWithType:@"TYShortcut3" localizedTitle:@"TYShare" localizedSubtitle:@"点一下试试吧(分享)" icon:[UIApplicationShortcutIcon iconWithType:UIApplicationShortcutIconTypeShare] userInfo:nil];
// 这里是可以自定义的效果 可以自己设置 Icon
UIApplicationShortcutItem * item4 = [[UIApplicationShortcutItem alloc]initWithType:@"TYShortcut4" localizedTitle:@"TYCustom" localizedSubtitle:@"来点一下!(自定义)" icon:[UIApplicationShortcutIcon iconWithTemplateImageName:@""] userInfo:nil];
[[UIApplication sharedApplication] setShortcutItems: @[ item1, item2, item3, item4 ]];
// 这个鬼东西实现起来是不是还是很简单的啊
return YES;
}
当然添加上之后还要实现他们的点击事件 具体代码如下(1.2) 同样在AppDelegate 里边实现就好
-(void) application:(UIApplication *)application performActionForShortcutItem:(UIApplicationShortcutItem *)shortcutItem completionHandler:(void (^)(BOOL))completionHandler{
NSLog(@"%@",shortcutItem.type);
if ([shortcutItem.type isEqualToString:@"TYShortcut1"]) {
/*
在此处添加需要跳转到的页面 如果不写默认进入程序正常开启页面(不添加3D Touch的效果)
*/
} else if ([shortcutItem.type isEqualToString:@"TYShortcut2"]){
}else if ([shortcutItem.type isEqualToString:@"TYShortcut3"]){
} else if([shortcutItem.type isEqualToString:@"TYShortcut4"]){
}
return ;
}
二、在某个controller 里添加3D Touch
我感觉这个鬼东西还是蛮简单的么 但是在页面里边的效果还是比较复杂的
因为在此处会有三种不同的状态 一、 第一次按压(出现悬浮窗口)二、向上滑动(有向上滑动的指示箭头的情况下 出现设定好的 UIActionSheet ) 三、 第二次按压 (进入到定义好的Controller) 大体就有这三种不同的状态
// 生明 添加3D Touch
if (self.traitCollection.forceTouchCapability == UIForceTouchCapabilityAvailable) {
[self registerForPreviewingWithDelegate:self sourceView:self.view];
}
else {
NSLog(@"ForceTouch not available. use LongPress...");
}
# pragma - mark 3D Touch delegate UIViewControllerPreviewingDelegate 添加代理 并实现代理中的方法
- (UIViewController *)previewingContext:(id <UIViewControllerPreviewing>)previewingContext viewControllerForLocation:(CGPoint)location
{ // 第一次 重压 显示的悬浮窗口
CGPoint TYPoint = [TYTabView convertPoint:location fromView:self.view];
NSIndexPath * TYindexpath = [TYTabView indexPathForRowAtPoint:TYPoint];
[TYTabView deselectRowAtIndexPath:TYindexpath animated:YES];
CGRect TYCGrect = [TYTabView cellForRowAtIndexPath:TYindexpath].frame;
previewingContext.sourceRect = TYCGrect;
TY3DTouchVC* TYVC = [[TY3DTouchVC alloc] init];
TYVC.view.backgroundColor = [UIColor whiteColor];
TYVC.TYImageView.image = [UIImage imageNamed:@"lyf-1"];
TYVC.preferredContentSize = CGSizeMake(0, 300); // 修改悬浮窗口的大小
return TYVC;
}
- (void)previewingContext:(id <UIViewControllerPreviewing>)previewingContext commitViewController:(UIViewController *)viewControllerToCommit
{
// 第二次重压之后显示的 详情页
TY3DTouchVC * TYVC = [[TY3DTouchVC alloc]init];
TYVC.view.backgroundColor = [UIColor whiteColor];
TYVC.TYImageView.image = [UIImage imageNamed:@"LYF"];
[self presentViewController:TYVC animated:YES completion:nil];
}
三、 在3D Touch 所跳转到的页面添加的 UIActionSheet 的效果
// 这个点击事件的实现实在Block 里添加的还是比较容易理解的 具体效果 会附上效果图片
// 整体效果的实现也就是这样了 当然这些仅仅是一个初步的使用和了解 望各位童鞋们还不要喷的太厉害 以后还会陆续发一些 自己在各个设备上适配不同屏幕的方法 和心得
- (NSArray <id <UIPreviewActionItem>> *)previewActionItems
{
UIPreviewAction *TYAction1 = [UIPreviewAction actionWithTitle:@"TYActionFist" style:UIPreviewActionStyleDefault handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {
NSLog(@"action1 selected.");
}];
UIPreviewAction *TYAction2 = [UIPreviewAction actionWithTitle:@"TYActionSecond" style:UIPreviewActionStyleSelected handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {
NSLog(@"action2 selected.");
}];
UIPreviewAction *TYAction3_1 = [UIPreviewAction actionWithTitle:@"TYActionThird_1" style:UIPreviewActionStyleDefault handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {
NSLog(@"action3-1 selected.");
}];
UIPreviewAction *TYAction3_2 = [UIPreviewAction actionWithTitle:@"TYActionThird_2" style:UIPreviewActionStyleDefault handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {
NSLog(@"action3-2 selected.");
}];
UIPreviewActionGroup *TYAction3 = [UIPreviewActionGroup actionGroupWithTitle:@"TYActionThird" style:UIPreviewActionStyleDestructive actions:@[TYAction3_1, TYAction3_2]];
return @[TYAction1, TYAction2, TYAction3];
}
/*
最后写一个很关键的东西,由于这是一个新的API 只有在iOS9 之后才有的所以在使用的时候一定要注意系统的适配和兼容问题。否则在iOS9 一下的版本就是各种崩崩崩
*/
/*
TianYang_AN
我只是一个小小的菜鸟,跪求各位大神 枪下留情
*/