iOS9 3D Touch 标签菜单 peek and pop force 压力触控 功能开发高级版教程
iOS9 3D Touch 标签菜单 peek and pop force 压力触控 功能开发高级版教程
github地址: https://github.com/wyk125/3DTouchDemo.git 觉得不错,记得Start哦,谢过!
前言
技术的本身并不是难点,而是怎样优雅地把这些 技术平滑的融入到我们的app,我们的工作,我们的生活,才是学习之本,学习之道。
在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所示。
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];
}
</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。
实现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 压力触控 功能开发高级版教程相关推荐
- android app防止锁屏_触控禁止!Touch Protector 锁定屏幕触控功能,避免意外操作(Android)...
「Touch Protector」是一款可以关闭手机萤幕触控功能的App,启动锁定功能后,萤幕仍可继续显示原本的画面,但完全不可触控操作任何功能,连同下方的导航栏与上方的通知栏会都一并上锁,适用于任何 ...
- iOS9 3DTouch、ShortcutItem、Peek And Pop技术一览
3DTouch UITouch类里API的变化 iOS9中添加的属性 altitudeAngle 当笔平行于平面时,该值为0 当笔垂直于平面时,该值为Pi / 2 estimatedPropertie ...
- iOS 3D Touch浅谈
一.什么是3D Touch? 3D Touch是iPhone 6s推出的一种可以让你与手机进行互动的全新方式.除了轻点.轻扫.双指开合这些熟悉的 Multi‑Touch 手势之外,3D Touch 还 ...
- 设置android 触摸灵敏,3D Press触屏灵敏度设置教程 魅族PRO 6 3D Press触控力度怎么调...
3D Press压力触控功能可以说是魅族新一代魅族PRO 6最大的新特性,带来了革命性的交互操作体验.其实,想必不少朋友都知道3D Pres技术跟苹果6S的3D Touch技术差不多,简单来说就是通过 ...
- iOS技术总结1——3D Touch技术
简介 3D Touch是iPhone 6s+,iOS9之后新增的功能.是一种立体触控技术,被苹果称为新一代多点触控技术,在Apple Watch上体现为采用了Force Touch,屏幕可感知不同的感 ...
- 在iPhone上使用3D Touch
3D Touch入门 在iOS 9中,新iPhone将第三维度添加到了用户界面. 用户现在可以用力摁下主屏按钮来快速调出应用提供的功能菜单. 在应用中,用户现在可以用力摁下视图以查看更多内容的预览并且 ...
- 3D Touch的基本使用
3D Touch主要的使用场景为两个,一个静态这设置,一个动态添加,还有包括修改UIApplicationShortcutItem,peek(预览)和pop(跳转)的实现. 应用最多添加4个快捷选项标 ...
- iOS 9之3D Touch
金田 北京时间9月10日凌晨, Apple在美国旧金山比尔格拉汉姆公民大礼堂(Bill Graham Civic Auditorium)召开新品发布会.本次着重介绍了3D Touch功能, 大体介绍一 ...
- iPhone 或将告别 3D Touch ?
作者 | 屠敏 出品 | CSDN(ID:CSDNnews) 生于创新,死于无用. 或许这句话说的太过绝对,但是用在 3D Touch 这项技术身上似乎又毫不为过,当然其中的"无用" ...
最新文章
- 浅析 SpringMVC 中返回对象的循环引用问题
- centos安装JDK、Tomcat、mysql
- “科创30条”鼓励高校开设AI新兴学科
- cad线加粗怎么设置_原来CAD的线条还可以这样加粗!还能修改初始单位!太实用了...
- C语言algorithm主函数,C语言中主函数中相关有关问题?
- phoneGap2.9+eclipse开发环境和helloword案例
- C/C++——各种类型int、long、double、char表示范围(最大最小值)
- 移形换影 - 短视频色彩特效背后的故事
- 【2018CPCP-Final G:】Pastoral Life in Stardew Valley
- java new 关键字到底做了什么?
- 什么是DDD(领域驱动设计)?
- 泛泰A860版本的识别
- excel中如何锁定单元格
- 免费邮箱怎么注册?创建注册邮箱帐号免费吗?
- 伦敦大学国王学院 计算机phd,重磅!伦敦国王学院全奖博士录取一枚!
- Android studio中的警告Hardcoded text
- NDS CA system和爱迪德CA系统
- java控制台实现的简易计算器,实现加减乘除
- 一、TF2 常用命令
- 银河麒麟V10 SP2 server 搭建 ntp服务端
热门文章
- java毕业设计木材产销系统的生产管理模块mybatis+源码+调试部署+系统+数据库+lw
- hdmi怎么支持2k分辨率_HDMI更新了!HDMI线用户忍受了一年的问题,终于能解决了...
- 酷派s6、Coolpad 9190l_C00 无log信息输出解决方法
- RealView MDK开发工具
- 推荐系统基础03:矩阵分解与FM
- poker网络 -2
- tensorflow系统学习(1):如何使用tensorflow
- [转载From少数派] 码字必备:18 款优秀的 Markdown 写作工具 | 2015 年度盘点
- Matlab 图像几何变换
- Google 认证之GMS 认证