iOS9 3D Touch 标签菜单 peek and pop  force 压力触控 功能开发高级版教程

github地址: https://github.com/wyk125/3DTouchDemo.git 觉得不错,记得Start哦,谢过!

前言

技术的本身并不是难点,而是怎样优雅地把这些 技术平滑的融入到我们的app,我们的工作,我们的生活,才是学习之本,学习之道。

3D Touch 标签 视频演示(6s,6Ps且iOS9以上支持3D Touch,越狱的不在此列):
http://pan.baidu.com/s/1mhd8FYK
3D Touch peek and pop 视频演示
http://player.ku6.com/refer/pTdE_6IsnauaoQ_xoqaoiQ../v.swf

在Mac电脑上为iPhone或iPad录屏的方法 需要的请get  http://www.weste.net/2015/04-07/102560.html

app启动过程  http://blog.csdn.net/u011363981/article/details/50589880

3D Touch  苹果官方文档
https://developer.apple.com/library/prerelease/ios/documentation/UserExperience/Conceptual/MobileHIG/3DTouch.html#//apple_ref/doc/uid/TP40006556-CH71

3D Touch的主要应用

3D Touch给用户带来的额外维度上的交互,这个设计之所以叫做3D Touch,其原理上是增加了一个压力的感触,通过区分轻按和重按来进行不同的用户交互。官方文档给出的应用介绍主要有两块:

第一部分的应用是我们可以通过3D手势,在主屏幕上的应用Icon处,直接进入应用的响应功能模块。这个功能就例如我们上面的日历示例,会在Icon旁边出现一个菜单,点击菜单我们可以进入相应的功能单元。3D Touch功能,push消息功能加上iOS8推出的扩展today功能,这三个机制使iOS应用变得无比灵活方便,用户可以不需付出寻找的时间成本来快速使用自己需要的功能。

第二部分是对app的一个优化,用户可以通过3D Touch手势在view上来预览一些预加载信息,这样的设计可以使app更加简洁大方,交互性也更强。

在模拟器上学习和测试3D Touch(目前这个方法不一定行的通,可以试下,后续更新)

3D Touch是一个很新颖的设计,可是苹果文档说,只有xcode7以上才支持3D Touch开发的,模拟器并不支持这个压力手势,我们只能在真机上进行学习与测试,但是在IT的世界,从来都不缺拯救世界的人物,github上有人为我们提供了这样的一个插件,可以让我们在模拟器上进行3D Touch的效果测试:

git地址:https://github.com/DeskConnect/SBShortcutMenuSimulator

附.SBShortcutMenuSimulator的安装和使用

其实安装和使用并不需要怎么介绍,git主页里介绍的很清楚,这里在记录一遍,其中只有一点需要注意,如果你的电脑中装有Xcode6和Xcode7两个版本,那个Xcode的编译路径,需要做一下修改。

安装:

在终端中一次运行如下指令:

?
1
2
3
git clone https://github.com/DeskConnect/SBShortcutMenuSimulator.git
cd SBShortcutMenuSimulator
make

如果电脑中有多个Xcode版本,先做如下操作,如果只有Xcode7,则可以跳过

?
1
sudo xcode-select -switch /Applications/Xcode2.app/Contents/Developer/

注意:上面命令中,Xcode2.app是你电脑中Xcode的名字,这里如要特别注意,如果名字中有空格,需要修改一下,把空格去掉,否则会影响命令的执行。

之后在SBShortcutMenuSimulator的目录中执行如下操作:

?
1
2
xcrun simctl spawn booted launchctl debug system/com.apple.SpringBoard --environment DYLD_INSERT_LIBRARIES=$PWD/SBShortcutMenuSimulator.dylib
xcrun simctl spawn booted launchctl stop com.apple.SpringBoard

如果没有报错,我们可以通过向指定端口发送消息的方法来在模拟器上模拟3D Touch的效果:

?
1
echo 'com.apple.mobilecal' nc 127.0.0.1 8000

其中,com.apple.mobilecal是应用的Bundle ID ,如果要测试我们的应用,将其改为我们应用的BundleID即可,可以看到模拟器的效果如下:

图1

我试了几次 却显示如下图2所示,后面找到解决思路,或有更好的方法 ,我会第一时间分享。

图 2

3D Touch的三大模块

在我们的app中使用3D Touch功能,主要分为以下三个模块:

Home Screen Quick Actions

通过主屏幕的应用Icon,我们可以用3D Touch呼出一个菜单,进行快速定位应用功能模块相关功能的开发。如图3,图4所示。

  
图 3                                                                                                                                          图4

peek and pop

这个功能是一套全新的用户交互机制,在使用3D Touch时,ViewController中会有如下三个交互阶段:

(1)提示用户这里有3D Touch的交互,会使交互控件周围模糊  如 图5

图 5

(2)继续深按,会出现预览视图 ,图  6

图6

(3)通过视图上的交互控件进行进一步交互  如 图7

图 7

这个模块的设计可以在网址连接上进行网页的预览交互。

Force Properties

iOS9为我们提供了一个新的交互参数:力度。我们可以检测某一交互的力度值,来做相应的交互处理。例如,我们可以通过力度来控制快进的快慢,音量增加的快慢等。

3D Touch 的Home Screen Quick Action 使用与相关api详解

iOS9为我们提供了两种屏幕标签,分别是静态标签和动态标签。两点注意:

1、快捷标签最多可以创建四个,包括静态的和动态的。

2、每个标签的题目和icon最多两行,多出的会用...省略

静态标签

静态标签是我们在项目的配置plist文件中配置的标签,在用户安装程序后就可以使用,并且排序会在动态标签的前面。

我们先来看静态标签的配置:

必填项(下面两个键值是必须设置的):

UIApplicationShortcutItemType 这个键值设置一个快捷通道类型的字符串

UIApplicationShortcutItemTitle 这个键值设置标签的标题

选填项(下面这些键值不是必须设置的):

UIApplicationShortcutItemSubtitle 设置标签的副标题

UIApplicationShortcutItemIconType 设置标签Icon类型

UIApplicationShortcutItemIconFile  设置标签的Icon文件

UIApplicationShortcutItemUserInfo 设置信息字典(用于传值)

首先,找到项目的info.plist文件,右击文件,再将鼠标放在 Open As  上,点击 Source  Code。

以XML格式打开 info.plist文件 ,插入以下  代码 即可。或者你也可以直接在plist 文件中,直接键入key值再 设置。

静态标签的设置顺序和显示顺序 是相反的,进栈出栈。

<array>
<span style="white-space:pre"> </span><dict><key>UIApplicationShortcutItemIconType</key> <!--注释行    --><string>UIApplicationShortcutIconTypeDate</string><key>UIApplicationShortcutItemIconFile</key> <!--自定义图片文件 替代不理想的系统图标   --><string>tabbar_shoppingcart</string>    <!--图片名称 --><span style="white-space:pre">    </span> <span style="white-space:pre">   </span><key>UIApplicationShortcutItemTitle</key><span style="white-space:pre">       </span><string>购物车</string><span style="white-space:pre">        </span><key>UIApplicationShortcutItemType</key><span style="white-space:pre">        </span><string>YPYD.UITouchText.cart</string>
<span style="white-space:pre"> </span></dict>
<span style="white-space:pre"> </span><dict>
<span style="white-space:pre">     </span><key>UIApplicationShortcutItemIconType</key>    <!--  标签的类型key   -->
<span style="white-space:pre">     </span><string>UIApplicationShortcutIconTypeSearch</string>  <!--  标签的类型vale   -->
<span style="white-space:pre">     </span><key>UIApplicationShortcutItemTitle</key>    <!--  必写标签的标题key   -->
<span style="white-space:pre">     </span><string>搜索商品</string>                       <!--  必写标签的标题vale   -->
<span style="white-space:pre">     </span><key>UIApplicationShortcutItemType</key>  <!--必写  标签的唯一标识Key 自由定义的一个字符串-->
<span style="white-space:pre">     </span><string>YPYD.UITouchText.search</string>    <!--  必写标签的唯一标识vale -->
<span style="white-space:pre"> </span></dict>
<span style="white-space:pre"> </span><dict>
<span style="white-space:pre">     </span><key>UIApplicationShortcutItemIconType</key>
<span style="white-space:pre">     </span><string>UIApplicationShortcutIconTypeHome</string>
<span style="white-space:pre">     </span><key>UIApplicationShortcutItemTitle</key>
<span style="white-space:pre">     </span><string>首页</string>
<span style="white-space:pre">     </span><key>UIApplicationShortcutItemType</key>
<span style="white-space:pre">     </span><string>YPYD.UITouchText.home</string>
<span style="white-space:pre"> </span></dict>
</array>

如果你的手机支持 3D Touch 真机运行程序,会有图3所示的效果。

动态标签

动态标签是我们在程序中,通过代码添加的,与之相关的类,主要有三个:

UIApplicationShortcutItem 创建3DTouch标签的类

UIMutableApplicationShortcutItem 创建可变的3DTouch标签的类

UIApplicationShortcutIcon 创建标签中图片Icon的类

因为这些类是iOS9中新增加的类,所以其api的复杂程度并不大,下面我们来对其中方法与属性进行简要讲解:

UIApplicationShortcutItem

@interface UIApplicationShortcutItem : NSObject <NSCopying, NSMutableCopying>
//下面是两个初始化方法 通过设置type,title等属性来创建一个标签,这里的icon是UIApplicationShortcutIcon对象,我们后面再说
- (instancetype)initWithType:(NSString *)type localizedTitle:(NSString *)localizedTitle localizedSubtitle:(nullableNSString *)localizedSubtitle icon:(nullableUIApplicationShortcutIcon *)icon userInfo:(nullableNSDictionary *)userInfoNS_DESIGNATED_INITIALIZER;
- (instancetype)initWithType:(NSString *)type localizedTitle:(NSString *)localizedTitle;
//下面这是一些只读的属性,获取相应的属性值
@property (nonatomic,copy,readonly)NSString *type;
@property (nonatomic,copy,readonly)NSString *localizedTitle;
@property (nullable,nonatomic,copy,readonly)NSString *localizedSubtitle;
@property (nullable,nonatomic,copy,readonly)UIApplicationShortcutIcon *icon;//系统定义的图标
@property (nullable,nonatomic,copy,readonly)NSDictionary<NSString *,id <NSSecureCoding>> *userInfo;

UIMutableApplicationShortcutItem

// 这个类继承于 UIApplicationShortcutItem ,创建的标签可变

@interface UIMutableApplicationShortcutItem : UIApplicationShortcutItem
@property (nonatomic,copy) NSString *type;
@property (nonatomic,copy)NSString *localizedTitle;
@property (nullable,nonatomic,copy)NSString *localizedSubtitle;
@property (nullable,nonatomic,copy)UIApplicationShortcutIcon *icon;
@property (nullable,nonatomic,copy)NSDictionary<NSString *,id <NSSecureCoding>> *userInfo;
@end

UIApplicationShortcutIcon

//这个类创建标签中的icon
@interface UIApplicationShortcutIcon : NSObject <NSCopying>
//创建系统风格的icon
+ (instancetype)iconWithType:(UIApplicationShortcutIconType)type;
//创建自定义的图片icon
+ (instancetype)iconWithTemplateImageName:(NSString *)templateImageName;
@end
/** 创建shortcutItems */
- (void)configShortCutItems {NSMutableArray *shortcutItems = [NSMutableArray array];UIApplicationShortcutItem *item1 = [[UIApplicationShortcutItem alloc]initWithType:@"YPYD.UITouchText.home" localizedTitle:@"测试1" localizedSubtitle:nil icon:[UIApplicationShortcutIcon iconWithType:UIApplicationShortcutIconTypeHome] userInfo:nil];UIApplicationShortcutItem *item2 = [[UIApplicationShortcutItem alloc]initWithType:@"YPYD.UITouchText.search" localizedTitle:@"测试2" localizedSubtitle:@"测试2副标题" icon:[UIApplicationShortcutIcon iconWithType:UIApplicationShortcutIconTypeSearch]userInfo:nil];[shortcutItems addObject:item2];[shortcutItems addObject:item1];[[UIApplication sharedApplication] setShortcutItems:shortcutItems];
}
创建好标签后,将其添加如application的hortcutItems数组中即可,示例如图 8:
</pre><p style="margin-top:0px; margin-bottom:0px; font-size:14px; line-height:normal; font-family:Menlo"></p><p style="color:rgb(51,51,51); font-family:Menlo; font-size:14px; margin-top:0px; margin-bottom:0px; line-height:normal"></p><div style="color:rgb(51,51,51); font-family:Verdana,sans-serif,宋体; font-size:16px"></div><p style="margin-top:0px; margin-bottom:0px; line-height:normal"><img src="https://img-blog.csdn.net/20160128105549280?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" width="375" height="667" alt="" /></p><p style="color:rgb(51,51,51); font-family:Helvetica; font-size:16px; margin-top:0px; margin-bottom:0px; line-height:normal"><img src="" alt="" /></p><p style="color:rgb(51,51,51); font-family:Helvetica; font-size:16px; margin-top:0px; margin-bottom:0px; line-height:normal">图 8 </p><p style="color:rgb(51,51,51); font-family:Helvetica; font-size:16px; margin-top:0px; margin-bottom:0px; line-height:normal"><span style="color:rgb(51,51,51); font-family:Verdana,sans-serif,宋体; font-size:16px; letter-spacing:0.5px">这里,将系统风格icon的枚举列举如下:</span></p><p style="color:rgb(51,51,51); font-family:Helvetica; font-size:16px; margin-top:0px; margin-bottom:0px; line-height:normal"><span style="color:rgb(51,51,51); font-family:Verdana,sans-serif,宋体; font-size:16px; letter-spacing:0.5px"></span><pre name="code" class="objc">typedef NS_ENUM(NSInteger, UIApplicationShortcutIconType) {UIApplicationShortcutIconTypeCompose,UIApplicationShortcutIconTypePlay,UIApplicationShortcutIconTypePause,UIApplicationShortcutIconTypeAdd,UIApplicationShortcutIconTypeLocation,UIApplicationShortcutIconTypeSearch,UIApplicationShortcutIconTypeShare,UIApplicationShortcutIconTypeProhibit       NS_ENUM_AVAILABLE_IOS(9_1),UIApplicationShortcutIconTypeContact        NS_ENUM_AVAILABLE_IOS(9_1),UIApplicationShortcutIconTypeHome           NS_ENUM_AVAILABLE_IOS(9_1),UIApplicationShortcutIconTypeMarkLocation   NS_ENUM_AVAILABLE_IOS(9_1),UIApplicationShortcutIconTypeFavorite       NS_ENUM_AVAILABLE_IOS(9_1),UIApplicationShortcutIconTypeLove           NS_ENUM_AVAILABLE_IOS(9_1),UIApplicationShortcutIconTypeCloud          NS_ENUM_AVAILABLE_IOS(9_1),UIApplicationShortcutIconTypeInvitation     NS_ENUM_AVAILABLE_IOS(9_1),UIApplicationShortcutIconTypeConfirmation   NS_ENUM_AVAILABLE_IOS(9_1),UIApplicationShortcutIconTypeMail           NS_ENUM_AVAILABLE_IOS(9_1),UIApplicationShortcutIconTypeMessage        NS_ENUM_AVAILABLE_IOS(9_1),UIApplicationShortcutIconTypeDate           NS_ENUM_AVAILABLE_IOS(9_1),UIApplicationShortcutIconTypeTime           NS_ENUM_AVAILABLE_IOS(9_1),UIApplicationShortcutIconTypeCapturePhoto   NS_ENUM_AVAILABLE_IOS(9_1),UIApplicationShortcutIconTypeCaptureVideo   NS_ENUM_AVAILABLE_IOS(9_1),UIApplicationShortcutIconTypeTask           NS_ENUM_AVAILABLE_IOS(9_1),UIApplicationShortcutIconTypeTaskCompleted  NS_ENUM_AVAILABLE_IOS(9_1),UIApplicationShortcutIconTypeAlarm          NS_ENUM_AVAILABLE_IOS(9_1),UIApplicationShortcutIconTypeBookmark       NS_ENUM_AVAILABLE_IOS(9_1),UIApplicationShortcutIconTypeShuffle        NS_ENUM_AVAILABLE_IOS(9_1),UIApplicationShortcutIconTypeAudio          NS_ENUM_AVAILABLE_IOS(9_1),UIApplicationShortcutIconTypeUpdate         NS_ENUM_AVAILABLE_IOS(9_1)
}

如果上述系统默认图标没你想要的 ,你还可以调用这个方法 手动 自定义图标。

+ (instancetype)iconWithTemplateImageName:(NSString *)templateImageName;

如果上述系统默认图标没你想要的 ,你还可以调用这个方法 手动 自定义图标。

响应标签的行为

类似推送,当我们点击标签进入应用程序时,也可以进行一些操作,我们可以看到,在applocation中增加了这样一个方法:

- (void)application:(UIApplication *)application performActionForShortcutItem:(UIApplicationShortcutItem *)shortcutItem completionHandler:(void(^)(BOOL succeeded))completionHandler NS_AVAILABLE_IOS(9_0);

当我们通过标签进入app时,就会在appdelegate中调用这样一个回调,我们可以获取shortcutItem的信息进行相关逻辑操作。

这里有一点需要注意:我们在app的入口函数:

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

也需要进行一下判断,在launchOptions中有UIApplicationLaunchOptionsShortcutItemKey这样一个键,通过它,我们可以区别是否是从标签进入的app,如果是则处理结束逻辑后,返回NO,防止处理逻辑被反复回调。

实现3D Touch 标签 跳转的参考方法

因为app的启动会首先加载

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

即为app启动,并已存在self.window 和 UITabBarController 视图控制器,因此,你可以通过 通知的方式来实现
performActionForShortcutItem 的 相关 跳转显示。

// iOS9 的 3D Touch 响应通知

- (void)application:(UIApplication *)application performActionForShortcutItem:(UIApplicationShortcutItem *)shortcutItem completionHandler:(void(^)(BOOL succeeded))completionHandler
{if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 9.0 &&self.window.traitCollection.forceTouchCapability == UIForceTouchCapabilityAvailable){YPYDLog(@"你的手机支持3D Touch!");YPYDNetCountManager * sharedNetCountManager = [YPYDNetCountManager sharedNetCountManager];sharedNetCountManager.applicationShortcutItemTitle = shortcutItem.type;//首页if([shortcutItem.type isEqualToString:@"YPYD.UITouchText.home"]){[[NSNotificationCenter defaultCenter] postNotificationName:@"YPYD.UITouchText.home" object:nil userInfo:nil];}//搜索商品if([shortcutItem.type isEqualToString:@"YPYD.UITouchText.search"]){[[NSNotificationCenter defaultCenter] postNotificationName:@"YPYD.UITouchText.search" object:nil userInfo:nil];}//购物车if([shortcutItem.type isEqualToString:@"YPYD.UITouchText.cart"]){[[NSNotificationCenter defaultCenter] postNotificationName:@"YPYD.UITouchText.cart" object:nil userInfo:nil];}//我的Uif([shortcutItem.type isEqualToString:@"YPYD.UITouchText.myU"]){[[NSNotificationCenter defaultCenter] postNotificationName:@"YPYD.UITouchText.home" object:nil userInfo:nil];}}else{YPYDLog(@"你的手机暂不支持3D Touch!");}
}

// 3D Touch 具体通知响应

- (void)applicationShortcutItemResponse
{YPYDNetCountManager * sharedNetCountManager = [YPYDNetCountManagersharedNetCountManager];// 配合系统 判断是否已经完成登录方法 主要用于,app处于关闭状态时,先登录账号,再进入相关功能页面//    YPYDLog(@"netGoodsListCount  %d", sharedNetCountManager.hadAutoLogin);//    if (!sharedNetCountManager.hadAutoLogin)//    {//        return;//    }//    else//首页if([ sharedNetCountManager.applicationShortcutItemTitleisEqualToString:@"YPYD.UITouchText.home"]){self.selectedIndex =0;[[NSNotificationCenterdefaultCenter]postNotificationName:@"UITouchText.home"object:niluserInfo:nil];}//搜索商品if([ sharedNetCountManager.applicationShortcutItemTitleisEqualToString:@"YPYD.UITouchText.search"]){self.selectedIndex =0;YPYDSearchController * searchController = [[YPYDSearchControlleralloc]init];searchController.navigationItem.title =@"搜索";YPYDLog(@"self.selectedViewController  %@",self.selectedViewController.childViewControllers[0]);[self.selectedViewController.childViewControllers[0].navigationControllerpushViewController:searchControlleranimated:YES];}//购物车if([ sharedNetCountManager.applicationShortcutItemTitleisEqualToString:@"YPYD.UITouchText.cart"]){self.selectedIndex =2;}//我的 Uif([ sharedNetCountManager.applicationShortcutItemTitleisEqualToString:@"YPYD.UITouchText.myU"]){self.selectedIndex =3;}
}

3D Touch 的 peek and pop 使用与相关api详解

根据苹果的介绍,Peek手势允许用户通过短时间按压屏幕进行操作,可在邮件、照片等应用弹出全新功能菜单,给出预览内容。如果按压力度加大,则是Pop手势功能,会让被点击内容完全呈现,这些内容可以是文字、图像、网页以及其他各种内容。简单来说,Peek专注于预览,Pop可以全面展现内容。如 图9 图 10。

图9 peek 预览图 图 10 pop 视图

实现peek and pop步骤

1、遵守协议 UIViewControllerPreviewingDelegate

@interface YPYDHomeViewController ()
<UITableViewDelegate,UITableViewDataSource,UIViewControllerPreviewingDelegate>

2、注册Peek和Pop方法

[self registerForPreviewingWithDelegate:self sourceView:self.view];

3、实现代理方法

#pragma mark peek && pop 代理方法轻按进入浮动预览页面

/** peek手势  */

- (nullable UIViewController *)previewingContext:(id <UIViewControllerPreviewing>)previewingContext viewControllerForLocation:(CGPoint)location
{YPYDPOPTestViewController1 *childVC = [[YPYDPOPTestViewController1alloc]init];// 获取用户手势点所在cell的下标。同时判断手势点是否超出tableView响应范围。if (![selfgetShouldShowRectAndIndexPathWithLocation:location])return nil;previewingContext.sourceRect = self.sourceRect;// 加个白色背景UIView *bgView =[[UIViewalloc]initWithFrame:CGRectMake(20,10,ScreenWidth -40,ScreenHeight -20 -64 *2)];bgView.backgroundColor = [UIColorwhiteColor];bgView.layer.cornerRadius =10;bgView.clipsToBounds = YES;[childVC.view addSubview:bgView];// 加个lableUILabel *lable = [[UILabelalloc]initWithFrame:bgView.bounds];lable.textAlignment =NSTextAlignmentCenter;lable.numberOfLines = 3;lable.text =[NSStringstringWithFormat:@"按着的是 %@\n用力,再按重一点...",self.items[self.indexPath.row]];[bgView addSubview:lable];return childVC;
}

/** 获取用户手势点所在cell的下标。同时判断手势点是否超出tableView响应范围。*/

#pragma mark  比较巧妙 准确的 获取高亮区域的方法
/** 获取用户手势点所在cell的下标。同时判断手势点是否超出tableView响应范围。*/
- (BOOL)getShouldShowRectAndIndexPathWithLocation:(CGPoint)location
{YPYDLog(@"%f",location.y);// 根据手指按压的区域,结合 tableView 的 Y 偏移量(上下)location.y = self.homeTableView.contentOffset.y+location.y;//定位到当前,按压的区域处于哪个 cell  获得 cell 的indexPathself.indexPath = [self.homeTableView indexPathForRowAtPoint:location];// 根据cell 的indexPath 取出 cellUITableViewCell * cell = [self.homeTableView cellForRowAtIndexPath:self.indexPath];
//    cell.backgroundColor = [UIColor redColor];// 根据 获得cell ,确定高亮的区域,记得 高亮区域是相对于屏幕  位置来算,记得减去 tableView 的 Y偏移量self.sourceRect = CGRectMake(cell.frame.origin.x, cell.frame.origin.y-self.homeTableView.contentOffset.y, cell.frame.size.width,cell.frame.size.height);// 如果row越界了,返回NO 不处理peek手势return (self.indexPath.row >= self.items.count &&self.indexPath.row<0) ? NO : YES;
}

/** pop手势  */

- (void)previewingContext:(id <UIViewControllerPreviewing>)previewingContext commitViewController:(UIViewController *)viewControllerToCommit
{[selftableView:self.homeTableViewdidSelectRowAtIndexPath:self.indexPath];
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{YPYDPOPTestViewController1 * testVC = [[YPYDPOPTestViewController1alloc]init];[self.navigationControllerpushViewController:testVCanimated:YES];
}

完成后,即可实现图9、图10的效果。

预览时上滑底部菜单的添加

在我们刚刚创建的预览控制器YPYDPOPTestViewController1里实现  如 图 11。

//遵守协议

@interface YPYDPOPTestViewController1 ()<UIViewControllerPreviewingDelegate>

//预览页面 底部Action Items

- (NSArray<id<UIPreviewActionItem>> *)previewActionItems
{UIPreviewAction *p1 =[UIPreviewActionactionWithTitle:@"分享"style:UIPreviewActionStyleDefaulthandler:^(UIPreviewAction *_Nonnull action, UIViewController *_Nonnull previewViewController) {       NSLog(@"点击了分享");    }];UIPreviewAction *p2 =[UIPreviewActionactionWithTitle:@"收藏"style:UIPreviewActionStyleDefaulthandler:^(UIPreviewAction *_Nonnull action, UIViewController *_Nonnull previewViewController) {       NSLog(@"点击了收藏");    }];NSArray *actions = @[p1,p2];return actions;
}

图 11

3D Touch 的Force Properties 使用与相关api详解

在iOS 9中,UITouch类支持3D触摸应用程序定制实现了两个新的属性:force 和 maximumpossibleforce 。

// Force of the touch, where 1.0 represents the force of an average touch
@property(nonatomic,readonly) CGFloat force NS_AVAILABLE_IOS(9_0);
// Maximum possible force with this input mechanism
@property(nonatomic,readonly) CGFloat maximumPossibleForce NS_AVAILABLE_IOS(9_0);

首次在iOS设备上,这些特性让你检测和响应触摸在UIEvent对象接收应用程序的压力。一个触摸的力量有一个高动态范围,可作为一个浮点值应用到您的应用程序。

#pragma mark 获取压力的大小非常简单,我们可以通过UITouch类中的一些属性来完成。我们只需要在ToucheMoved的事件中捕获这些信息,请注意,不用判断 x,y 值变化
//我这里 只做了一个简单的  压力感应示例,如需更复杂的效果,可以自行编制。
- (void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{//宣告一个UITouch的指标来存放事件触发时所撷取到的状态UITouch *touch = [[event allTouches] anyObject];_forceLab.text = [NSString stringWithFormat:@"当前压力值为: %f",touch.force];//   YPYDLog(@"最大压力值  %f",touch.maximumPossibleForce);最大压力值  6.666667if (touch.force>0.2){_lab.font = [UIFont systemFontOfSize:20*touch.force];_lab.textColor = YPYDColor(255*touch.force/6.5, 0, 0, 1);}
}

结语

关于3DTouch功能 更详细的实现步骤,你可以参考下方的3D Touch  Demo,如有疑问,可以在下方评论留言,或者QQ:823023927,最后,如有疏漏和错误之处,欢迎指正。

github地址:https://github.com/wyk125/3DTouchDemo.git  觉得不错,记得Start哦,谢过!

iOS9 3D Touch 标签菜单 peek and pop force 压力触控 功能开发高级版教程相关推荐

  1. android app防止锁屏_触控禁止!Touch Protector 锁定屏幕触控功能,避免意外操作(Android)...

    「Touch Protector」是一款可以关闭手机萤幕触控功能的App,启动锁定功能后,萤幕仍可继续显示原本的画面,但完全不可触控操作任何功能,连同下方的导航栏与上方的通知栏会都一并上锁,适用于任何 ...

  2. iOS9 3DTouch、ShortcutItem、Peek And Pop技术一览

    3DTouch UITouch类里API的变化 iOS9中添加的属性 altitudeAngle 当笔平行于平面时,该值为0 当笔垂直于平面时,该值为Pi / 2 estimatedPropertie ...

  3. iOS 3D Touch浅谈

    一.什么是3D Touch? 3D Touch是iPhone 6s推出的一种可以让你与手机进行互动的全新方式.除了轻点.轻扫.双指开合这些熟悉的 Multi‑Touch 手势之外,3D Touch 还 ...

  4. 设置android 触摸灵敏,3D Press触屏灵敏度设置教程 魅族PRO 6 3D Press触控力度怎么调...

    3D Press压力触控功能可以说是魅族新一代魅族PRO 6最大的新特性,带来了革命性的交互操作体验.其实,想必不少朋友都知道3D Pres技术跟苹果6S的3D Touch技术差不多,简单来说就是通过 ...

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

    简介 3D Touch是iPhone 6s+,iOS9之后新增的功能.是一种立体触控技术,被苹果称为新一代多点触控技术,在Apple Watch上体现为采用了Force Touch,屏幕可感知不同的感 ...

  6. 在iPhone上使用3D Touch

    3D Touch入门 在iOS 9中,新iPhone将第三维度添加到了用户界面. 用户现在可以用力摁下主屏按钮来快速调出应用提供的功能菜单. 在应用中,用户现在可以用力摁下视图以查看更多内容的预览并且 ...

  7. 3D Touch的基本使用

    3D Touch主要的使用场景为两个,一个静态这设置,一个动态添加,还有包括修改UIApplicationShortcutItem,peek(预览)和pop(跳转)的实现. 应用最多添加4个快捷选项标 ...

  8. iOS 9之3D Touch

    金田 北京时间9月10日凌晨, Apple在美国旧金山比尔格拉汉姆公民大礼堂(Bill Graham Civic Auditorium)召开新品发布会.本次着重介绍了3D Touch功能, 大体介绍一 ...

  9. iPhone 或将告别 3D Touch ?

    作者 | 屠敏 出品 | CSDN(ID:CSDNnews) 生于创新,死于无用. 或许这句话说的太过绝对,但是用在 3D Touch 这项技术身上似乎又毫不为过,当然其中的"无用" ...

最新文章

  1. 浅析 SpringMVC 中返回对象的循环引用问题
  2. centos安装JDK、Tomcat、mysql
  3. “科创30条”鼓励高校开设AI新兴学科
  4. cad线加粗怎么设置_原来CAD的线条还可以这样加粗!还能修改初始单位!太实用了...
  5. C语言algorithm主函数,C语言中主函数中相关有关问题?
  6. phoneGap2.9+eclipse开发环境和helloword案例
  7. C/C++——各种类型int、long、double、char表示范围(最大最小值)
  8. 移形换影 - 短视频色彩特效背后的故事
  9. 【2018CPCP-Final G:】Pastoral Life in Stardew Valley
  10. java new 关键字到底做了什么?
  11. 什么是DDD(领域驱动设计)?
  12. 泛泰A860版本的识别
  13. excel中如何锁定单元格
  14. 免费邮箱怎么注册?创建注册邮箱帐号免费吗?
  15. 伦敦大学国王学院 计算机phd,重磅!伦敦国王学院全奖博士录取一枚!
  16. Android studio中的警告Hardcoded text
  17. NDS CA system和爱迪德CA系统
  18. java控制台实现的简易计算器,实现加减乘除
  19. 一、TF2 常用命令
  20. 银河麒麟V10 SP2 server 搭建 ntp服务端

热门文章

  1. java毕业设计木材产销系统的生产管理模块mybatis+源码+调试部署+系统+数据库+lw
  2. hdmi怎么支持2k分辨率_HDMI更新了!HDMI线用户忍受了一年的问题,终于能解决了...
  3. 酷派s6、Coolpad 9190l_C00 无log信息输出解决方法
  4. RealView MDK开发工具
  5. 推荐系统基础03:矩阵分解与FM
  6. poker网络 -2
  7. tensorflow系统学习(1):如何使用tensorflow
  8. [转载From少数派] 码字必备:18 款优秀的 Markdown 写作工具 | 2015 年度盘点
  9. Matlab 图像几何变换
  10. Google 认证之GMS 认证