2018-01-04 14:54:01 LOLITA0164 阅读数 19867

概述

在6s之后,我们可以使用3DTouch功能,我们对应用(线上)做按压操作,通常会出现下面样式,这就是3DTouch中的一种应用,最少也会系统默认添加的出现《分享”应用名”》选项,这个是系统默认添加的,无需我们去做

分享


3DTouch开发

在日常开发中,我们经常需要使用3D Touch中的两个功能

1、主屏交互:在主屏幕上对应用图标使用3DTouch操作(上图)

2、Peek and Pop:在应用程序内对某一控件使用3DTouch操作(如微信、QQ消息列表)


一、主屏交互


关于ShortcutItem

ShortcutItem功能允许用户在主屏幕上对应用图标使用3DTouch操作,如果本次操作有效,则会给出几个快捷可选项允许用户进行操作

ShortcutItem

使用方法

1、静态添加(plist)

添加

⚠️:如果使用了自定义图片,系统的UIApplicationShortcutItemIconType字段会失效
⚠️:没有使用系统图片或者自定义图片,那么图片位置会出现黑色原点
⚠️:自定义图片必须是单色图片
⚠️:建议35*35 2x图
⚠️:最多添加4个,第五个可以是系统默认带上的分享功能

其中各个关键字释义如下:

UIApplicationShortcutItemType: 特定字符串(必填)
UIApplicationShortcutItemTitle: 标题(必填)
UIApplicationShortcutItemSubtitle: 子标题(可选)
UIApplicationShortcutItemIconType: 图标(可选)
UIApplicationShortcutItemIconFile: 自定义图标(可选)
UIApplicationShortcutItemUserInfo: 附加信息(可选)

快捷粘贴添加(根据需求删减)

<key>UIApplicationShortcutItems</key>
    <array>
        <dict>
            <key>UIApplicationShortcutItemIconType</key>
            <string>UIApplicationShortcutIconTypeSearch</string>
            <key>UIApplicationShortcutItemSubtitle</key>
            <string>搜索副标题</string>
            <key>UIApplicationShortcutItemTitle</key>
            <string>搜索</string>
            <key>UIApplicationShortcutItemType</key>
            <string>search</string>
            <key>UIApplicationShortcutItemUserInfo</key>
            <dict/>
        </dict>
        <dict>
            <key>UIApplicationShortcutItemIconFile</key>
            <string>attention</string>
            <key>UIApplicationShortcutItemSubtitle</key>
            <string>关注副标题</string>
            <key>UIApplicationShortcutItemTitle</key>
            <string>关注</string>
            <key>UIApplicationShortcutItemType</key>
            <string>attention</string>
            <key>UIApplicationShortcutItemUserInfo</key>
            <dict/>
        </dict>
        <dict>
            <key>UIApplicationShortcutItemTitle</key>
            <string>扫一扫</string>
            <key>UIApplicationShortcutItemType</key>
            <string>scan</string>
            <key>UIApplicationShortcutItemUserInfo</key>
            <dict/>
        </dict>
    </array>

2、动态添加 (代码)

UIApplicationShortcutItem 类

// type: 快捷可选项的特定字符串(必填)
// localizedTitle: 快捷可选项的标题(必填)
// localizedSubtitle: 快捷可选项的子标题(可选)
// icon: 快捷可选项的图标(可选)
// userInfo: 快捷可选项的附加信息(可选)
- (instancetype)initWithType:(NSString *)type localizedTitle:(NSString *)localizedTitle localizedSubtitle:(nullable NSString *)localizedSubtitle icon:(nullable UIApplicationShortcutIcon *)icon userInfo:(nullable NSDictionary *)userInfo;

UIApplicationShortcutIcon

每一个快捷可选项图标为一个UIApplicationShortcutIcon对象,我们可以使用系统提供的多个图标,也可以自定义我们自己的图标

// 使用系统提供的图标
+ (instancetype)iconWithType:(UIApplicationShortcutIconType)type;

// 自定义图标
+ (instancetype)iconWithTemplateImageName:(NSString *)templateImageName;

系统提供的图标样式如下:

系统样式

代码示例:

系统图标
UIApplicationShortcutIcon *searchShortcutIcon = [UIApplicationShortcutIcon iconWithType:UIApplicationShortcutIconTypeSearch];
UIApplicationShortcutItem *searchShortcutItem = [[UIApplicationShortcutItem alloc] initWithType:@"search" localizedTitle:@"搜索" localizedSubtitle:@"搜索副标题" icon:searchShortcutIcon userInfo:nil];
// 自定义图标
UIApplicationShortcutIcon *attentionShortcutIcon = [UIApplicationShortcutIcon iconWithTemplateImageName:@"attention"];
UIApplicationShortcutItem *attentionShortcutItem = [[UIApplicationShortcutItem alloc] initWithType:@"attention" localizedTitle:@"关注" localizedSubtitle:@"关注副标题" icon:attentionShortcutIcon userInfo:nil];
// 系统低于9.0是没有这个属性的
if ([[UIApplication sharedApplication] respondsToSelector:@selector(shortcutItems)]) {
    [UIApplication sharedApplication].shortcutItems = @[searchShortcutItem, attentionShortcutItem];
}

运行效果

运行效果


触发回调

当用户通过点击快捷可选项进入应用程序会回调如下方法,我们可以在这里通过快捷可选项的type来加以区分,以便进行不同的操作

- (void)application:(UIApplication *)application performActionForShortcutItem:(UIApplicationShortcutItem *)shortcutItem completionHandler:(void (^)(BOOL))completionHandler{
    // 通常先定位主页面
    if ([shortcutItem.type isEqualToString:@"search"]){   // 搜索
        // do something ...
    }
    else if ([shortcutItem.type isEqualToString:@"attention"]){   // 关注
        // do something ...
    }
}

二、Peek & Pop


Peek和Pop是应用内的一种全新交互模式,当用户不断增加力量在控件上按压,会依次进入四个阶段

1、轻按控件,除触发Peek的控件外,其他区域全部虚化
2、继续用力Peek被触发,展示Pop界面快照
3、向上滑动展示快捷选项
4、继续用力跳转进入Pop界面

演示

系统应用如(短信列表),微信、QQ(消息列表)等皆有应用

使用步骤

1、需要实现Peek & Pop交互的控件所在的控制器遵守UIViewControllerPreviewingDelegate协议

@interface ViewController ()<UIViewControllerPreviewingDelegate>
@end

2、在控制器内为需要实现Peek & Pop交互的控件注册Peek & Pop功能

// cell 设置
//注册3D Touch
/**
 从iOS9开始,我们可以通过这个类来判断运行程序对应的设备是否支持3D Touch功能。
 UIForceTouchCapabilityUnknown = 0,     //未知
 UIForceTouchCapabilityUnavailable = 1, //不可用
 UIForceTouchCapabilityAvailable = 2    //可用
 */
if ([self respondsToSelector:@selector(traitCollection)]) {
    if ([self.traitCollection respondsToSelector:@selector(forceTouchCapability)]) {
        if (self.traitCollection.forceTouchCapability == UIForceTouchCapabilityAvailable) {
            [self registerForPreviewingWithDelegate:(id)self sourceView:cell];
        }
    }
}
return cell;

以下为UIViewControllerPreviewingDelegate代理的实现

3、当进入Peek状态时,系统会回调如下方法

// Peek状态
- (nullable UIViewController *)previewingContext:(id<UIViewControllerPreviewing>)previewingContext viewControllerForLocation:(CGPoint)location{
    UITableViewCell *cell = (UITableViewCell *)[previewingContext sourceView];
    DetailViewController *detailVC = [[DetailViewController alloc] init];
    detailVC.content = cell.textLabel.text;
    // 预览区域大小(可不设置)
//    detailVC.preferredContentSize = CGSizeMake(0, 500);
    return detailVC;
}

4、当进入Pop状态时,系统会回调如下方法

// Pop状态
- (void)previewingContext:(id<UIViewControllerPreviewing>)previewingContext commitViewController:(UIViewController *)viewControllerToCommit{
    [self showViewController:viewControllerToCommit sender:self];
}

5、在Peek时希望提供一些快捷选项,需要在DetailViewController中重写previewActionItems的getter方法

// 选项设置
- (NSArray<id<UIPreviewActionItem>> *)previewActionItems{
    UIPreviewAction *action1 = [UIPreviewAction actionWithTitle:@"选项一" style:UIPreviewActionStyleDefault handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {

    }];
    UIPreviewAction *action2 = [UIPreviewAction actionWithTitle:@"选项二" style:UIPreviewActionStyleSelected handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {

    }];
    UIPreviewAction *action3 = [UIPreviewAction actionWithTitle:@"选项三" style:UIPreviewActionStyleDefault handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {

    }];
    UIPreviewAction *action4 = [UIPreviewAction actionWithTitle:@"选项四" style:UIPreviewActionStyleDestructive handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {

    }];
    UIPreviewActionGroup *actionGroup = [UIPreviewActionGroup actionGroupWithTitle:@"选项组" style:UIPreviewActionStyleDefault actions:@[action3, action4]];

    return @[action1, action2, actionGroup];
}

演示

演示


参考地址

iOS系统3DTouch全解析

2016-02-26 11:11:13 Coding_Niu 阅读数 1729

众所周知,苹果公司每年9月份都会发布一款新的iPhone设备,而每代的iPhone都会在硬件和技术上有所升级。

随着iPhone6S、iPhone6SPlus 的发布,一项新的技术也出现在世人的视野中,是的,就是3DTouch功能。一直想分享这个新功能给大家,但是带班就忙起来了,现在利用空余时间整理一下。

但是也有一个缺陷,3DTouch的只能在6S,6SPlus以及以后的产品中使用。

更多关于3DTouch的功能,大家可以去网上找找文字资料,我就不在这过多赘述了,咱们直接上代码。

大家按照这个步骤将代码添加到自己的工程中

第一步:为桌面应用图标添加3DTouch功能,在AppDelegate.m文件的-(BOOL)application:(UIApplication )application didFinishLaunchingWithOptions:(NSDictionary )launchOptions 方法中添加以下代码:

// 创建一个应用程序快捷方式项
    UIMutableApplicationShortcutItem *itemOne = [[UIMutableApplicationShortcutItem alloc] initWithType:@"111" localizedTitle:@"拍照"];
    UIApplicationShortcutIcon *iconOne = [UIApplicationShortcutIcon iconWithType:UIApplicationShortcutIconTypeCapturePhoto];
    itemOne.icon = iconOne;

    // 创建跳转到相册的快捷方式
    UIApplicationShortcutIcon *iconTwo = [UIApplicationShortcutIcon iconWithTemplateImageName:@"test"];// 此处显示不了彩色图片,只能是黑色镂空的图片
    UIMutableApplicationShortcutItem *itemTwo = [[UIMutableApplicationShortcutItem alloc] initWithType:@"222" localizedTitle:@"相册" localizedSubtitle:@"这是一个子标题" icon:iconTwo userInfo:nil];

    application.shortcutItems = @[itemOne,itemTwo];

第二步:还需在AppDelegate.m中实现一个委托方法

{
    // 在此方法中完成点击后具体的操作
    UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init];
    imagePicker.editing = YES;

    // 此处没有判断相机是否可用,因为3DTouch只能真机调试,真机肯定能用
    if ([shortcutItem.type isEqualToString:@"111"])
    {
        imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera;
        [self.window.rootViewController presentViewController:imagePicker animated:YES completion:nil];
    }
    else
    {
        imagePicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
        [self.window.rootViewController presentViewController:imagePicker animated:YES completion:nil];
    }
}
  • 完成上面两步之后就可以通过3DTouch功能进入到App的对应页面中

3DTouch还可以对二级页面进行预览,那怎么实现的呢?我在这举个简单例子,比如我现在可以通过点击一个button跳转到二级页面,那么就可以绑定此功能,也就是咱们接下来要做的第三步

第三步:在当面ViewController中创建一个button
@property (strong, nonatomic) IBOutlet UIButton *button;
并且一定要在ViewDidLoad方法中注册回调

// 注册回调
    [self registerForPreviewingWithDelegate:self sourceView:self.button];

第四步:遵循协议UIViewControllerPreviewingDelegate 然后去实现两个协议方法

#pragma mark UIViewControllerPreviewingDelegate Method
// 预览的视图
- (UIViewController *)previewingContext:(id<UIViewControllerPreviewing>)previewingContext viewControllerForLocation:(CGPoint)location
{
    // 通过storyboard获取当前的VC
    UIViewController *vc = [self.storyboard instantiateViewControllerWithIdentifier:@"erjiVC"];
    return vc;
}

// 继续用力按可推进二级界面
- (void)previewingContext:(id<UIViewControllerPreviewing>)previewingContext commitViewController:(UIViewController *)viewControllerToCommit
{
    [self showViewController:viewControllerToCommit sender:self];
}
  • 做完了上面几步后,基本的功能就已经完成啦,那其实3DTouch还可以稍微复杂那么一点点的,还可以在进入二级页面之前有其他的操作,比如说:

第五步:在要进入的二级页面直接实现一个委托方法

// 返回预览下面的快捷方式
- (NSArray<id<UIPreviewActionItem>> *)previewActionItems
{
    UIPreviewAction *action1 = [UIPreviewAction actionWithTitle:@"分享" style:UIPreviewActionStyleDefault handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {
        NSLog(@"点击了分享按钮!");
    }];
    UIPreviewAction *action2 = [UIPreviewAction actionWithTitle:@"收藏" style:UIPreviewActionStyleDestructive handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {
        NSLog(@"点击了收藏按钮!");
    }];
    NSArray *actions = @[action1,action2];
    return actions;
}

好啦,恭喜您,一个小的demo已经可以去测试了,但是注意3DTouch功能在模拟器上不能测试,所以骚年快去连接手机吧~

那关于代码我也已经上传到coding了,如果需要请点击下载代码

下载代码

2018-01-14 13:35:47 qq_18683985 阅读数 939
	苹果是在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

2015-12-15 16:44:00 gaoyong0624 阅读数 712

1.前言  

  随着6S的到来,3DTouch被各大热门APP迅速普及,博主亲自体验后,发现使用便捷性大幅提高,随后自己照着文档,写了个Demo出来,分享给大家,希望能对有需要的朋友提供有一些帮助。

2.如何使用3D Touch?  

2.1.主界面重按APP图标,弹出Touch菜单  

\

AppleDelegate文件中的程序入口处配置:

didFinishLaunchingWithOptions

01.//给App图标添加3D Touch菜单
02.//拍照
03. 
04.//菜单图标
05.UIApplicationShortcutIcon *iconCamera = [UIApplicationShortcutIcon iconWithType:UIApplicationShortcutIconTypeAdd];
06.//菜单文字
07.UIMutableApplicationShortcutItem *itemCamera = [[UIMutableApplicationShortcutItem alloc] initWithType:@'1' localizedTitle:@'拍照'];
08.//绑定信息到指定菜单
09.itemCamera.icon = iconCamera;
10. 
11.//相册
12.//菜单图标
13.UIApplicationShortcutIcon *iconPhotoLibrary = [UIApplicationShortcutIcon iconWithType:UIApplicationShortcutIconTypeSearch];
14.//菜单文字
15.UIMutableApplicationShortcutItem *itemPhotoLibrary = [[UIMutableApplicationShortcutItem alloc] initWithType:@'2' localizedTitle:@'相册'];
16.//绑定信息到指定菜单
17.itemPhotoLibrary.icon = iconPhotoLibrary;
18.//绑定到App icon
19.application.shortcutItems = @[itemCamera,itemPhotoLibrary];

 弹出菜单,我们需要让用户点击后跳转指定页面

这里我们会用到AppDelegate里新增加的一个方法

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

 让后我们需要在这个方法里做跳转的操作

01.//照相type
02.if ([shortcutItem.type isEqualToString:@'1']) {
03. 
04.UIImagePickerController *picker = [[UIImagePickerController alloc] init];//初始化
05.picker.allowsEditing = YES;//设置可编辑
06.picker.sourceType = UIImagePickerControllerSourceTypeCamera;
07.[self.window.rootViewController presentViewController:picker animated:YES completion:nil];//进入照相界面
08. 
09.}
10.//相册type
11.if ([shortcutItem.type isEqualToString:@'2']) {
12. 
13.UIImagePickerController *picker = [[UIImagePickerController alloc] init];//初始化
14.picker.allowsEditing = YES;//设置可编辑
15.picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
16.[self.window.rootViewController presentViewController:picker animated:YES completion:nil];//进入图片库

 点击后分别会进入相机和相册

\\

2.2. 3DTouch轻按预览功能,预览时底部菜单的添加  

首先我们要把轻按预览和长按手势区分开来,这里要在初始化时做一个基本的检测。  
01.nterface ViewController () <UIViewControllerPreviewingDelegate>
02.{
03.UILongPressGestureRecognizer *_longPress;
04.}
05.@end
06. 
07. 
08.@implementation ViewController
09. 
10.- (void)viewDidLoad {
11.[super viewDidLoad];
12.UILongPressGestureRecognizer *longPressGr = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPressToDo)];
13._longPress = longPressGr;
14.}
15. 
16. 
17.//检测页面是否处于3DTouch
18.- (void)check3DTouch{
19. 
20.if (self.traitCollection.forceTouchCapability == UIForceTouchCapabilityAvailable) {
21. 
22.[self registerForPreviewingWithDelegate:self sourceView:self.view];
23.NSLog(@'3D Touch 开启');
24.//长按停止
25._longPress.enabled = NO;
26. 
27.}else{
28._longPress.enabled = YES;
29.}
30. 
31.}
32. 
33. 
34.- (void)viewWillAppear:(BOOL)animated{
35. 
36.[self check3DTouch];
37. 
38.}

然后我们需要实现 UIViewControllerPreviewingDelegate的协议

1.@interface ViewController () <UIViewControllerPreviewingDelegate>
1.//然后实现代理方法
2.- (UIViewController *)previewingContext:(id<UIViewControllerPreviewing>)previewingContext viewControllerForLocation:(CGPoint)location;
01.#pragma mark >> 3D touch 代理方法
02.//轻按进入浮动预览页面
03.- (UIViewController *)previewingContext:(id<UIViewControllerPreviewing>)previewingContext viewControllerForLocation:(CGPoint)location{
04. 
05.//注意这里我因为测试,没做具体的位置处理,如果需要定位到具体的图片Cell位置的话,可以用location通过tableView的convertPoint来取到指定Cell
06. 
07.<a href="http://www.it165.net/pro/webasp/" target="_blank"class="keylink">ASP</a>reviewViewController *vc = [[<a href="http://www.it165.net/pro/webasp/"target="_blank" class="keylink">ASP</a>reviewViewController alloc] init];
08.vc.view.frame = self.view.frame;
09.UIImageView *er = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@'123.png']];
10.vc.view = er;
11.return vc;
12. 
13.}

 完成后可以实现基本的预览效果:

\\

最后我们加上一个

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

在我们刚刚创建的预览控制器ASPreviewViewController里实现 UIViewControllerPreviewingDelegate的协议

然后重写它的代理方法

1.- (NSArray<id<UIPreviewActionItem>> *)previewActionItems;
01.//预览页面 底部Action Items
02.- (NSArray<id<UIPreviewActionItem>> *)previewActionItems{
03. 
04.UIPreviewAction *p1 =[UIPreviewAction actionWithTitle:@'分享' style:UIPreviewActionStyleDefault handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {
05.NSLog(@'点击了分享');
06.}];
07. 
08.UIPreviewAction *p2 =[UIPreviewAction actionWithTitle:@'收藏' style:UIPreviewActionStyleDefault handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {
09.NSLog(@'点击了收藏');
10.}];
11. 
12.NSArray *actions = @[p1,p2];
13.return actions;
14.}
2019-06-28 10:22:00 weixin_41769887 阅读数 22

首先,我希望通过本文能帮到大家,大家的方便就是我最好的回报!
iOS设备上对用户的体验始终都是日渐提升的,其中3DTouch和widget的体验也是重要的一环。这不,最近我们多人开发的项目中也要求去做这块。
首先,支持3DTouch的苹果设备默认会帮每个没有做这块的APP会生成一个自带分享功能,弹出的页面也是苹果系统自己控制的。我们想要做一个自定义的touch功能会覆盖系统的这个分享功能。那么,具体是怎么去一一实现我们自定义的效果呢。我接着和大家聊一聊。
iOS系统有个shortcutItems的属性,这个里面就是暴露出来给用户去添加自定义的touch样式的。我们仅需要控制每个UIApplicationShortcutItem的样式就好了。这个类有三个属性UIApplicationShortcutIcon,localizedTitle,localizedSubtitle。分别给这三个属性赋值就是对图片,标题,详情标题的赋值。如果某个值传空,则对应的地方也会空着,来表示,一般第三个属性传空来显示图片和标题就好了。
那么根据touch如何控制弹出APP相对应的页面呢,这里要用到APPDelegate中的一个方法来控制逻辑,这个方法就是application(_ application: performActionFor shortcutItem: , completionHandler: )
通过在这里面对着shortcutItem.type进行判断来分类处理相关逻辑。
做好如上操作,基本上3DTouch功能就可以用了。那么,紧接着我会为大家聊一下widget的实现
widget的实现其实相当于要构建一个子APP,过程就是在project中的capabilities中通过"+"号来添加一个叫"Today Extension"的项目,添加命名完了之后,需要让主APP与这个子APP相互关联,来达到偏好设置及写文件处理的共享。当然主APP中的方法在子APP中不能调用。那怎么去做这个APP组关联呢。同样是在capabilities中去设置,在APP Group中打开按钮,通过加号来添加这个组名,在子APP中同一位置将这些操作都对应上。以上这些步骤可视为widget的环境搭建
说完了搭建,更重要的一步就是如何具体实现了。widget上的页面显示是完全依赖于子APP上的界面(换句话来说就是这上面的界面)。默认创建的"Today Extension"会给出MainInterface.storyboard的xib文件。在这上面操作最好还是用到xib而不是纯代码。因为很可能会出现对应控件不显示的问题。然后按照你们的需求及样式来铺设相关的界面。如果要求网络传输请求,可以通过widget中extensionContext?.open(NSURL(string: url)! as URL, completionHandler: { (bool) in})这个方法来实现(注意这个方法中url参数需要带有主APP的url schemes)。completionHandler里面要写回调之后的操作,比如要渲染相关的UI,那么调用这个方法之后,我们如何能请求对应的接口呢。这时候需要在主APP上的APPDelegate中的一个方法func application(_ app: ,open url: ,options: )来实现。通过传输的url中带有某个前缀来判断是点了哪个按钮。然后根据URL后缀带有的参数来进行网络请求。请求完了会调用到之前的回调结果,我们在这个回调中写出对应的结果就OK了。
以上就是做3DTouch及widget中用到的思路及步骤,如果有疑问,欢迎来致微(death-god-xpc)

iOS开发 - 3DTouch

阅读数 170

没有更多推荐了,返回首页