iOS中3DTouch的使用

本文详细介绍了苹果设备上的3DTouch功能,包括其在iOS9系统中的引入背景、实现原理及应用场景。阐述了桌面和应用内3DTouch的配置方法,并提供了具体的代码示例。

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

	苹果是在iphone6s开始加入的3DTouch功能.也就是说是ios9开始加入的3DTouch.3DTouch也就是根据你手按压的力度大小来触发的.


	3DTouch具体有两种表现形式.第一种是在Launch页面,也就是在苹果的桌面上.就算我们不做关于3DTouch的任何集成.在上线的项目中(注:一定是上线的项目,Debug之类的是没有任何显示的)也有一个关于分享的3DTouch按钮

这里写图片描述

	这个就是苹果系统给我们弄上去的.那么如果我们想加一个自己的应该怎么弄呢.

###桌面的3DTouch
对于桌面版的3DTouch.也是两种方式.
1.使用plist文件,这个其实有点恶心,那个键值对其实在plist里面查找不到.我们需要手动添加以下的字段.

UIApplicationShortcutItems(NSArray),这个其实也可以猜出来.毕竟是Items.

	array的每一个元素都是以NSDictionry形式存在的,因为每一个小cell都有不同的标题,副标题,图片嘛.
	UIApplicationShortcutItemType: 快捷可选项的特定字符串(必填)
键值作用
UIApplicationShortcutItemTitle快捷可选项的标题(必填)
UIApplicationShortcutItemSubtitle快捷可选项的子标题(可选)
UIApplicationShortcutItemIconType快捷可选项的图标(可选)
UIApplicationShortcutItemIconFile快捷可选项的自定义图标(可选)
UIApplicationShortcutItemUserInfo快捷可选项的附加信息(可选)
当你点击桌面的shortcutItem之后,系统会调用
- (void)application:(UIApplication *)application performActionForShortcutItem:(UIApplicationShortcutItem *)shortcutItem completionHandler:(void (^)(BOOL))completionHandler {
    if ([shortcutItem.type isEqualToString:@"xxx"]) {//因为我们注册Item的时候就使用了不同的Type,我们可以判断shortcutItem的type来做不同的事情.如果不写代码默认是跳转进入APP

    }
}
	我来简单的描述一下跳转逻辑,对于3DTouch这种特殊的需要在APP界面外调用的功能来说.调试的时候就需要开放一下想象力.
	这样来思考一下,当你把QQ杀死之后.重新进入QQ.走的是applicationdidfinshlaunch.这个我们是知道的.纯代码设置window的rootviewcontroller也是在这个方法里面设置的,这个我们也是知道的.如果我们没有设置rootviewcontroller的话,程序就不会有主界面.就是一黑色的window(我一般喜欢把window设置成白色的).如果我们把QQ杀死,使用的是QQ的3DTouch进入比如扫一扫.就会进入相应的页面.如果没有走finishLaunch的话界面都没有那是如何在里面能正常返回的.

小Tips:如果我们直接运行APP.然后,回退到桌面再在桌面使用3DTouch(不退出APP).那么我们调用相应方法的时候看起来是首先走的3DTouch的响应方法performActionForShortcutItem然后didfinishlaunch没走.如果我们把程序杀死,就不能看到调试信息.其实我们可以在command + R的同时一直按home键.让App不会起来.这个时候就不会去调用didfinishlaunch.这是看到的调用顺序基本上可以说是准确的.

	根据小Tips里面的方法,我们可以得出,在不进入程序的情况下,第一次使用桌面的3DTouch功能.首先调用的是`didfinishLaunch`,然后才是3DTouch的响应方法.后面的话因为已经lauch了就只会直接调用3DTouch的响应方法了.
	//创建UIApplicationShortcutItem
	UIApplicationShortcutItem *applicationShortcutItemItem1 = [[UIApplicationShortcutItem alloc] initWithType:@"Message" localizedTitle:@"消息" localizedSubtitle:nil icon:[UIApplicationShortcutIcon iconWithType:UIApplicationShortcutIconTypeMessage] userInfo:nil];
	UIApplicationShortcutItem *applicationShortcutItemItem2 = [[UIApplicationShortcutItem alloc] initWithType:@"hehe" localizedTitle:@"呵呵" localizedSubtitle:nil icon:[UIApplicationShortcutIcon iconWithType:UIApplicationShortcutIconTypeMessage] userInfo:nil];
	//把item1和item2添加到系统的item属性里面
    application.shortcutItems = @[applicationShortcutItemItem1 ,applicationShortcutItemItem2];	
	其实.桌面呼出的3DTouch工具栏(个人喜欢这么称呼)会根据位置不同而排列不同.比如,如果应用Icon在左上方
	那么.Item的排列方向是,先添加进去的排在上面.图标会在左边.其实也就是说,先添加进去的会离手点击的Icon近.图标的排列就是应用Icon在哪边屏幕(左右).图标就在哪边.

###应用内的3DTouch

1.需要在当前.能够使用3DTouch的控制器里面遵循UIViewControllerPreviewingDelegate
2.然后注册一下代理[self registerForPreviewingWithDelegate:self sourceView:self.view];
3.使用代理的两个方法

	// If you return nil, a preview presentation will not be performed
	- (nullable UIViewController *)previewingContext:(id <UIViewControllerPreviewing>)previewingContext viewControllerForLocation:(CGPoint)location NS_AVAILABLE_IOS(9_0);
	- (void)previewingContext:(id <UIViewControllerPreviewing>)previewingContext commitViewController:(UIViewController *)viewControllerToCommit NS_AVAILABLE_IOS(9_0);

第一个是peek状态的代理方法,第二个是pop状态的代理方法.
peek英文的意思是一瞥.
peek
第二个代理方法是pop页面也就是说直接用力按进去的样子.


- (UIViewController *)previewingContext:(id<UIViewControllerPreviewing>)previewingContext viewControllerForLocation:(CGPoint)location {
//    previewingContext.sourceRect = self.view.frame;
    //peek从哪里出来.比如用的是self.button.frame就是从button上面抛出来.
    previewingContext.sourceRect = self.button.frame;
    ViewControllerDetail *VCDetail = [[ViewControllerDetail alloc] init];
    return VCDetail;
}

对比与QQ比如按一个聊天cell往上拉之后的删除的几个类似于AlertControl的东西又是怎么做的呢

- (NSArray<id<UIPreviewActionItem>> *)previewActionItems {
    //
    UIPreviewAction *action1 = [UIPreviewAction actionWithTitle:@"进入" style:UIPreviewActionStyleDefault handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {
    }];
    //
    UIPreviewAction *action2 = [UIPreviewAction actionWithTitle:@"取消" style:UIPreviewActionStyleDefault handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {

    }];
    NSArray *actions = @[action1,action2];
    return actions;
}

是不是和AlertControl很像.3DTouch我就讲到这里.附上一个Demo: 3DTouchDemo

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值