iOS扩展新特性之3DTouch开发

3D Touch是在iPhone6s之后且系统是iOS9以上才能使用的功能,详情见官方文档
https://developer.apple.com/library/prerelease/content/documentation/UserExperience/Conceptual/Adopting3DTouchOniPhone/index.html#//apple_ref/doc/uid/TP40016543
3D Touch总的来说分如下两种
(1)A user can now press your Home screen icon to immediately access functionality provided by your app.
(2)Within your app, a user can now press views to see previews of additional content and gain accelerated access to features.
一种是按压应用icon弹出的快捷菜单,另一种是在应用里面,按压view弹出另一个视图,再深按一次可push到另一个页面。

一、Home Screen Quick Actions(按压应用图标)
在info.plist文件里添加一项UIApplicationShortcutItems,这是个数组,里面添加任意项,Item0里面的三项分别是图片名称、文本内容、类型,在AppDelegate里是根据这个类型跳转到指定页的。


屏幕快照 2017-01-19 17.49.33.png

在AppDelegate如下方法里实现跳转
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation


 if (articleType == kTypeAttetion) {
    [self.tabbar setTabBarSelectedWithIndex:kTabbarTypeAttention];
} else {
    [self.tabbar setTabBarSelectedWithIndex:kTabbarTypeHome];
}
HBBaseNavController *nc = (HBBaseNavController *)self.tabbar.selectedViewController;
[nc popToRootViewControllerAnimated:YES];

UIViewController *vc = [[UIViewController alloc] init];
  [nc pushViewController:vc animated:YES];

跳转的时候要注意的是,先让TabBarViewController跳转到指定Tab,再让这个Tab下的NavigationController 回到根视图(popToRootViewController),然后再push到对应的ViewController里去。

二、Peek and Pop(弹出一个视图和push到一个新的页面)

1.注册事件
如果是在一个tableview上实现这个功能,则需要在cellForRow里面去注册这个事件,

if (IOS9_OR_LATER) {
    if (self.traitCollection.forceTouchCapability == UIForceTouchCapabilityAvailable) {
        if (!cell.hasRegister3DTouch) {
            [[self viewController] registerForPreviewingWithDelegate:HBTouchDelegate sourceView:cell];
            cell.hasRegister3DTouch = YES;
        }
    }
}

这里面有两点重要的处理:

*第一点是关于这个cell是否被注册过,由于tableview的cell是复用的,所以只注册一遍即可,否则在列表上拉加载几屏后会出现严重的卡顿。

*第二点是这个View所属ViewController的代理指向问题,如果有多个列表,每个列表里都要注册这个代理,这样每个列表里都要实现这个代理的方法,同样的方法要写很多遍,这明显不符合我们编程简洁、高效的宗旨,所以可以把代理的实现抽象成一个类,然后注册时将代理指向这个类(在上面代码中指的是HBTouchDelegate,实现的就是UIViewControllerPreviewingDelegate的两个代理方法)。

2.实现代理方法
#pragma mark - UIViewControllerPreviewingDelegate
- (nullable UIViewController *)previewingContext:(id <UIViewControllerPreviewing>)previewingContext viewControllerForLocation:(CGPoint)location {

UIView *sourceCell = [previewingContext sourceView];
if (![[sourceCell viewController].presentedViewController isKindOfClass:[HBPeekViewController class]]) {
    HBPeekViewController *peekViewController = [HBPeekViewController new];
 peekViewController.preferredContentSize = CGSizeMake(0, 300);//这个是弹出视图的宽高,默认是屏幕宽高
    return peekViewController;
 } else {
    return nil;
}
}

- (void)previewingContext:(id <UIViewControllerPreviewing>)previewingContext commitViewController:(UIViewController *)viewControllerToCommit NS_AVAILABLE_IOS(9_0) {
[[[previewingContext sourceView] viewController] jumpWithArticleEntity:(HBArticleEntity *)self.touchEntity];
}

3.peekViewController中给弹出的视图添加一些快捷操作,点赞、收藏、对上面的文字进行复制等等,只要在previewActionItems方法,创建UIPreviewAction到数组中,可以在UIPreviewAction的block里实现对应的操作即可

- (NSArray<id<UIPreviewActionItem>>*)previewActionItems {
// 生成UIPreviewAction
 UIPreviewAction *action1 = [UIPreviewAction actionWithTitle:@"赞" style:UIPreviewActionStyleDefault handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {
         //do something  
 }];

UIPreviewAction *action2 = [UIPreviewAction actionWithTitle:@"看全文" style:UIPreviewActionStyleDefault handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {
   //do something
}];

UIPreviewAction *action3 = [UIPreviewAction actionWithTitle:@"收藏" style:UIPreviewActionStyleDefault handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {
   //do something
 }];
 NSArray *group = nil;
 group = @[action1, action2, action3];
 return group;
}

到这里3DTouch主要的几点就讲完啦!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,242评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,769评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,484评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,133评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,007评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,080评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,496评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,190评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,464评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,549评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,330评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,205评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,567评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,889评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,160评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,475评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,650评论 2 335

推荐阅读更多精彩内容