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

2940人阅读 评论(0) 收藏 举报
分类:

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


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

前言      

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

3D Touch 标签 视频演示(6s,6Ps且iOS9以上支持3D Touch,越狱的不在此列):
3D Touch peek and pop 视频演示

在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];
        }
        //我的U
        if([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;
    }
    //我的 U
    if([ 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注册PeekPop方法

[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];
    
    // 加个lable
    UILabel *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 的indexPath
    self.indexPath = [self.homeTableView indexPathForRowAtPoint:location];
    // 根据cell 的indexPath 取出 cell
    UITableViewCell * 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.666667
    if (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 高级UI特效视频课程(Objective-C版)

本课程包括按钮、滑块、开关、进度条、导航条、菜单、文本等UI特效。特效包括放光的按钮、弹出式按钮、多彩滑块、自定义滑块、自定义开关、扇形进度条等等上百种UI特效。
  • 2016年11月05日 21:30

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

3DTouchUITouch类里API的变化iOS9中添加的属性 altitudeAngle当笔平行于平面时,该值为0 当笔垂直于平面时,该值为Pi / 2 estimatedPropertie...
  • showhilllee
  • showhilllee
  • 2015-09-11 18:07:47
  • 22219

Android-实现类似3DTouch菜单功能

前言在开发中,我们经常遇到需要菜单功能的实现,我们经常会参考其他人的优秀设计。比如3D Touch菜单,作为iphone6和iphone6s上引人注目的新功能。现在,我们希望尽力来模仿这种菜单设计,尽...
  • z82367825
  • z82367825
  • 2016-10-31 00:12:24
  • 3235

IOS开发之 一起用Swift来玩一玩3D Touch

Swift 2.3 IOS 8.0 XCode 8.0 添加入口标签在这里只说下静态的好了,暂时还用不到动态的,e.g.UIApplicationShortcutItems ...
  • sbt0198
  • sbt0198
  • 2017-02-07 14:45:51
  • 1138

3D Touch开发之App 快速入口标签(快捷菜单)

一、简介:自从苹果公司引入了 3D Touch 功能后,众多开发者,也开在自己的app上实现自己的 3D Touch 效果,今天我也来小秀一把。我们先来看看,3D Touch 下的 app 快速启动入...
  • zhengang007
  • zhengang007
  • 2015-12-16 11:45:35
  • 1584

iOS 菜单 PopMenu

PopMenu 有很不错的弹出效果,很适合用于分享功能。
  • u010551118
  • u010551118
  • 2015-12-12 20:02:16
  • 1298

iOS之实现3D Touch

3D Touch简介 2015年,苹果发布了iOS9以及iphone6s/iphone6s Plus,其中最具有创新的就是新的触控方式3D Touch,相对于多点触摸在平面二维空间的操作,3D ...
  • Leemin_ios
  • Leemin_ios
  • 2016-04-05 10:07:12
  • 573

iOS开发 非常全的三方库、插件、大牛博客等等

UI 下拉刷新 EGOTableViewPullRefresh- 最早的下拉刷新控件。 SVPullToRefresh- 下拉刷新控件。 MJRefresh- 仅需一行...
  • qq_16825363
  • qq_16825363
  • 2017-04-11 17:24:42
  • 1090

iOS 第三方库、插件、知名博客总结

用到的组件 1、通过CocoaPods安装 项目名称 项目信息 AFNetworking 网络请求组件 FMDB 本地数据库组件 SDWebImage 多个缩略图缓存组件 UICK...
  • u012701023
  • u012701023
  • 2017-09-29 10:43:36
  • 1731

3D Touch

一:3D Touch的三大模块 3D Touch功能主要分为以下三个模块: 1、Home Screen Quick Actions 通过主屏幕的应用Icon,我们可以用3D Touch呼出一个菜单,进...
  • wujakf
  • wujakf
  • 2017-06-19 14:47:26
  • 166
    个人资料
    持之以恒
    等级:
    访问量: 15万+
    积分: 2235
    排名: 2万+
    最新评论