iOS9 3DTouch学习

3D Touch是iOS9以后才能使用的相关功能。

Home Screen Quick Actions(主屏幕捷径)

3D Touch第一个用法就是在主屏幕的时候,通过按压app的图标显示出一些快捷操作


Home Screen Quick Actions

有2种方法可以设置Home Screen Quick Actions

第一种:static quick actions

通过在Info.plist文件中设置UIApplicationShortcutItems数组,如图:

UIApplicationShortcutItems_plist
名字 解释
UIApplicationShortcutItemType (必须) 用来标识应用响应用户action的唯一标识
UIApplicationShortcutItemTitle (必须) 快捷操作的title
UIApplicationShortcutItemSubtitle 快捷操作的subTitle
UIApplicationShortcutItemIconType 系统的快捷图标
UIApplicationShortcutItemIconFile 自定义的图标
UIApplicationShortcutItemUserInfo app定义的一些参数

下面手动在Info.plist中写死的static quick actions

静态设置

运行图:

静态

显示的quick actions列表中,有图标和文字,图标在左边或者在右边是系统自动适配的。

第二种:dynamic quick actions

通过运行app后,执行相关的代码才能显示出来的quick actions

//设置动态的quick actions
- (void)configDynamicQuickActions {

    UIApplicationShortcutIcon *tempItem1Icon = [UIApplicationShortcutIcon iconWithType:UIApplicationShortcutIconTypeHome];
    
    UIApplicationShortcutItem *tempItem1 = [[UIApplicationShortcutItem alloc] initWithType:@"com.resume.third" localizedTitle:@"我是动态的1" localizedSubtitle:@"我是运行程序后才出现的" icon:tempItem1Icon userInfo:nil];
    
    UIApplicationShortcutItem *tempItem2 = [[UIApplicationShortcutItem alloc] initWithType:@"com.resume.fourth" localizedTitle:@"我是动态的2"];
    [UIApplication sharedApplication].shortcutItems = @[tempItem1,tempItem2];
}

然后启动app,返回主屏幕,按压app图标得到如图:

动态后

可以发现,虽然我动态设置2个,加上静态设置的3个,但是并没有出现5个,所以quick actions是最多显示4个。

点击后,app中响应的方法
- (void)application:(UIApplication *)application performActionForShortcutItem:(UIApplicationShortcutItem *)shortcutItem completionHandler:(void(^)(BOOL succeeded))completionHandler {
    //根据设置的type唯一标识,来做具体的事情
    if ([shortcutItem.type isEqualToString:@"com.demoCollection.first"]) {
        [self showShortcutAlertWithTitle:shortcutItem.localizedTitle message:shortcutItem.localizedSubtitle];
    }else if ([shortcutItem.type isEqualToString:@"com.demoCollection.second"]){
        [self showShortcutAlertWithTitle:shortcutItem.localizedTitle message:[NSString stringWithFormat:@"subtitle:%@\nuserinfo:%@",shortcutItem.localizedSubtitle,[shortcutItem.userInfo objectForKey:@"keyName"]]];
    }
    completionHandler(YES);
}
Peek and Pop
Indication of peek availability

轻按某个地方,如果周围出现虚化模糊的情况,就代表这个Item可以peek(预览、偷窥)
previewingContext.sourceRect这属性来设置源地方,就是轻按不虚化的rect。

preview_available

Peek

稍微用力按Cell会出现如图(图片压缩太厉害了,字有点看不清了)


Peek

设置代理

    //设置代理,forceTouchCapability是判断该设备是否支持3DTouch
    if (self.traitCollection.forceTouchCapability == UIForceTouchCapabilityAvailable) {
        [self registerForPreviewingWithDelegate:self sourceView:self.view];
    }else {
        UIAlertController *tipsAlertVC = [UIAlertController alertControllerWithTitle:@"3DTouch提示" message:@"该设备不支持3DTouch" preferredStyle:UIAlertControllerStyleAlert];
        
        UIAlertAction *okAction = [UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) {
        }];
        [tipsAlertVC addAction:okAction];
        
        [self presentViewController:tipsAlertVC animated:YES completion:nil];
    }

实现代理方法

#pragma mark UIViewControllerPreviewingDelegate
- (UIViewController *)previewingContext:(id<UIViewControllerPreviewing>)previewingContext viewControllerForLocation:(CGPoint)location {
    
    //location找到对应数据源
    CGPoint convertPoint = [self.view convertPoint:location toView:self.tableView];
    NSIndexPath *clickIndexPath = [self.tableView indexPathForRowAtPoint:convertPoint];
    
    //设置Peek的sourceRect,sourceRect就是Peek动画弹出的位置,轻按的时候周围会虚化
    UITableViewCell *clickCell = [self.tableView cellForRowAtIndexPath:clickIndexPath];
    //sourceRect对应的是self.view坐标系中的rect,所以需要转换一下
    CGRect convertRect = [self.view convertRect:clickCell.frame fromView:self.tableView];
    previewingContext.sourceRect = convertRect;
    
    TouchDetailVC *detailVC = [[TouchDetailVC alloc] init];
    detailVC.touchModel = [_listViewModel.touchListDataArray objectAtIndex:clickIndexPath.row];
    //设置宽度没用,只设置高度就行了
    detailVC.preferredContentSize = CGSizeMake(0, 400);
    return detailVC;
}

- (void)previewingContext:(id <UIViewControllerPreviewing>)previewingContext commitViewController:(UIViewController *)viewControllerToCommit {
    //这个就是Peek后再用力按就干什么的方法了,下面代码就相当于push了
    [self showViewController:viewControllerToCommit sender:self];
}
Peek quick actions

在peek时,有个往上拉的箭头,这个时候往上拉,会出现一些选项。这些选项是需要在你peek的UIViewController里面实现下面的方法的

- (NSArray<id<UIPreviewActionItem>> *)previewActionItems {
    
    UIPreviewAction *firstItem = [UIPreviewAction actionWithTitle:@"确定" style:UIPreviewActionStyleDefault handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {
        NSLog(@"%@",action.title);
    }];
    
    UIPreviewAction *secondItem = [UIPreviewAction actionWithTitle:@"喜欢" style:UIPreviewActionStyleSelected handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {
        NSLog(@"%@",action.title);
    }];
    
    UIPreviewAction *thirdItem = [UIPreviewAction actionWithTitle:@"取消" style:UIPreviewActionStyleDestructive handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {
        NSLog(@"%@",action.title);
    }];
    
    return @[firstItem, secondItem, thirdItem];
}
Peek quick actions
Web View Peek and Pop

原理和上面差不多

#pragma mark UIViewControllerPreviewingDelegate
- (nullable UIViewController *)previewingContext:(id <UIViewControllerPreviewing>)previewingContext viewControllerForLocation:(CGPoint)location {
    
    previewingContext.sourceRect = previewingContext.sourceView.frame;
    
    return [[SFSafariViewController alloc] initWithURL:[NSURL URLWithString:@"http:www.jianshu.com"]];
}

- (void)previewingContext:(id <UIViewControllerPreviewing>)previewingContext commitViewController:(UIViewController *)viewControllerToCommit {
    [self showViewController:viewControllerToCommit sender:self];
}
Force Properties

在iOS9中,UITouch中增加了2个属性:forcemaximumPossibleForce
force :压力,
maximumPossibleForce:最大压力。

详细使用方法,请看代码:github

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

推荐阅读更多精彩内容