iOS技术总结1——3D Touch技术

本文介绍了3D Touch技术在iOS中的应用,特别是Home Screen Quick Actions的实现。3D Touch提供了peek和pop手势,以及通过不同压力感知的交互方式。在主屏幕上,最多可设置4个Action Items,包括默认的分享项。实现Home Screen Quick Actions可通过静态的.plist文件或动态的UIApplicationShortcutItem对象。此外,文章还提到了检测设备是否支持3D Touch的API,并给出了相应代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简介
3D Touch是iPhone 6s+,iOS9之后新增的功能。是一种立体触控技术,被苹果称为新一代多点触控技术,在Apple Watch上体现为采用了Force Touch,屏幕可感知不同的感压力度触控。有peek和pop两种新手势。3D-Touch技术相对于多点触摸在平面二维空间的操作,增加了对力度和手指面积的感知,其最大的好处在于不启动app的情况下,可以通过长按快速预览/查看你想要的短信/图片/超链接等的内容,Peek和Pop手势的响应时间可迅捷到10ms和15ms。

常见使用
Home Screen Quick Actions(主屏快捷行为入口)
peek和pop(预览和弹出)
Force Properties(按压力度)
Web view peek and pop API(HTML链接预览功能)

本文主要讲Home Screen Quick Actions

1.上线的app默认会有一个分享的Action Item,也就是图中最后一个Action Item。
2.最多可以添加4个Action Item,加上上线后默认的分享Action Item,最多可显示5个Action Item。
3.弹出的3D Touch标签位置是由系统决定的,Action Item弹出位置靠屏幕下边或者屏幕上边,其顺序也是相反的。

有两种方法可以实现Home Screen Quick Actions,一种是使用.plist文件静态声明,另一种是使用UIApplicationShortcutItem对象构造。静态构造的quick actions可以在你的app第一次安装时候就有效果,而动态构造方法必须在第一次运行之后才能有效果。

1.plist文件静态声明实现Home Screen Quick Actions

/这里是图/

名称说明是否必须
UIApplicationShortcutItemType事件的唯一标识,可以通过这个标识来辨别你具体点击了哪个事件
UIApplicationShortcutItemTitle标题,在没有子标题的情况下如果标题太长能自动换行
UIApplicationShortcutItemSubtitle子标题,在标题的下方
UIApplicationShortcutItemIconType枚举选取系统中的一个图标类型
UIApplicationShortcutItemIconFile自定义一个图标,以单一颜色35x35的大小展示,如果设置这个,UIApplicationShortcutItemIconType将不起作用,图片必须预先添加进项目,而不能使用网络路径
UIApplicationShortcutItemUserInfo字典,里面可以添加各种key,value对

UIApplicationShortcutItemIconType这个key可以使用一些系统自定义的icon,可选的类型的枚举如下,详细介绍和每个图片的样子可以参考这里

2.以动态方式创建
检测是否支持3D Touch
在iOS9中提供如下的接口用于检测设备是否支持3D Touch:

https://developer.apple.com/documentation/uikit/uiapplicationshortcuticontype?language=objc

其中UIForceTouchCapability是一个枚举类型,具体的描述情况如下:

typedef NS_ENUM(NSInteger, UIForceTouchCapability) {
    UIForceTouchCapabilityUnknown = 0,//3D Touch检测失败
    UIForceTouchCapabilityUnavailable = 1, //3D Touch不可用
    UIForceTouchCapabilityAvailable = 2 //3D Touch可用
};

注意

由于兼容iOS 8.0,所以需要对3D Touch的检测,并且不能通过机型来判断3D Touch的可用与否,因为用户可能会在设置中把此功能关闭。

代码部分

这里分两种情况:
1.程序在被杀死的情况下,点击图标进入程序,会进入

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions;

2.程序在后台,点击图标进入程序,会进入

- (void)application:(UIApplication *)application performActionForShortcutItem:(UIApplicationShortcutItem *)shortcutItem completionHandler:(void (^)(BOOL))completionHandler;

首先在AppDelegate遵守协议(判断3D Touch是否可用)

@interface AppDelegate ()<UITraitEnvironment>

实现代码:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{ 

    if (@available(iOS 9.0, *)) {
        
        // 检测3d touch 是否可用
        if (self.window.traitCollection.forceTouchCapability == UIForceTouchCapabilityAvailable) {
            
            //手动创建3D Touch选项
            //系统风格的icon
            //    UIApplicationShortcutIcon *icon1 = [UIApplicationShortcutIcon iconWithType:UIApplicationShortcutIconTypeLove];
            //    UIApplicationShortcutIcon *icon2 = [UIApplicationShortcutIcon iconWithType:UIApplicationShortcutIconTypeLove];
            //    UIApplicationShortcutIcon *icon3 = [UIApplicationShortcutIcon iconWithType:UIApplicationShortcutIconTypeLove];
            //    UIApplicationShortcutIcon *icon4 = [UIApplicationShortcutIcon iconWithType:UIApplicationShortcutIconTypeLove];
            
            //自定义图标
            UIApplicationShortcutIcon *icon1 = [UIApplicationShortcutIcon iconWithTemplateImageName:@"14Eleven"];
            UIApplicationShortcutIcon *icon2 = [UIApplicationShortcutIcon iconWithTemplateImageName:@"11Eleven"];
            UIApplicationShortcutIcon *icon3 = [UIApplicationShortcutIcon iconWithTemplateImageName:@"OVEleven"];
            UIApplicationShortcutIcon *icon4 = [UIApplicationShortcutIcon iconWithTemplateImageName:@"PregnancyEleven"];
            
            //创建选项
            UIApplicationShortcutItem *item1 = [[UIApplicationShortcutItem alloc] initWithType:@"com.niaodaifu.14Eleven" localizedTitle:@"尿14项检测" localizedSubtitle:nil icon:icon1 userInfo:nil];
            UIApplicationShortcutItem *item2 = [[UIApplicationShortcutItem alloc] initWithType:@"com.niaodaifu.11Eleven" localizedTitle:@"尿11项检测" localizedSubtitle:nil icon:icon2 userInfo:nil];
            UIApplicationShortcutItem *item3 = [[UIApplicationShortcutItem alloc] initWithType:@"com.niaodaifu.OVEleven" localizedTitle:@"排卵检测" localizedSubtitle:nil icon:icon3 userInfo:nil];
            UIApplicationShortcutItem *item4 = [[UIApplicationShortcutItem alloc] initWithType:@"com.niaodaifu.pregnancyEleven" localizedTitle:@"早孕检测" localizedSubtitle:nil icon:icon4 userInfo:nil];
            //添加到选项数组
            [UIApplication sharedApplication].shortcutItems = @[item4,item3,item2,item1];
            
            UIApplicationShortcutItem *shortcutItem = [launchOptions valueForKey:UIApplicationLaunchOptionsShortcutItemKey];
            if (shortcutItem) {
                //判断先前我们设置的快捷选项标签唯一标识,根据不同标识执行不同操作
                if([shortcutItem.type isEqualToString:@"com.niaodaifu.14Eleven"]){ // 14
                    
                    [self detectionRoutineUrine_14Eleven];
                } else if ([shortcutItem.type isEqualToString:@"com.niaodaifu.11Eleven"]) { // 11
                    
                    [self detectionRoutineUrine_11Eleven];
                } else if ([shortcutItem.type isEqualToString:@"com.niaodaifu.OVEleven"]) { // 排卵
                    
                    [self detectionRoutineUrine_OVEleven];
                } else if ([shortcutItem.type isEqualToString:@"com.niaodaifu.pregnancyEleven"]) { // 早孕
                    
                    [self detectionRoutineUrine_pregnancyEleven];
                }
                return NO;
            }
        }
    }
    return YES;
}

程序在后台,点击图标会进入这个代理方法:

- (void)application:(UIApplication *)application performActionForShortcutItem:(UIApplicationShortcutItem *)shortcutItem completionHandler:(void (^)(BOOL))completionHandler {
    
    //判断先前我们设置的快捷选项标签唯一标识,根据不同标识执行不同操作
    if([shortcutItem.type isEqualToString:@"com.niaodaifu.14Eleven"]){ 
        
        [self detectionRoutineUrine_14Eleven];
    } else if ([shortcutItem.type isEqualToString:@"com.niaodaifu.11Eleven"]) { 
        
        [self detectionRoutineUrine_11Eleven];
    } else if ([shortcutItem.type isEqualToString:@"com.niaodaifu.OVEleven"]) { 
        
        [self detectionRoutineUrine_OVEleven];
    } else if ([shortcutItem.type isEqualToString:@"com.niaodaifu.pregnancyEleven"]) { 
        
        [self detectionRoutineUrine_pregnancyEleven];
    }
    
    if (completionHandler) {
        completionHandler(YES);
    }
}

对于如何进入主程序中任意一个界面,分两种情况:
1.根界面

- (void)detectionRoutineUrine_11Eleven {
    
      UITabBarController *tabBarVC = (UITabBarController *)self.window.rootViewController;
      tabBarVC.selectedIndex = 2;
}

2.其他非根界面,如二级、三级界面…

-(void)detectionRoutineUrine_11Eleven {
    
    UINavigationController *nav = ((UITabBarController*)self.window.rootViewController).selectedViewController;
    CameraViewController *VC = [[CameraViewController alloc] init];
    [nav pushViewController:VC animated:YES];
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值