• iOS 3Dtouch


    1. 3D Touch的主要应用

    官方文档给出的应用介绍主要有两块:

    1.A user can now press your Home screen icon to immediately access functionality provided by your app.

    2.Within your app, a user can now press views to see previews of additional content and gain accelerated access to features.

    第一部分的应用是我们可以通过3D手势,在主屏幕上的应用Icon处,直接进入应用的响应功能模块。这个功能就例如我们上面的日历示例,会在Icon旁边出现一个菜单,点击菜单我们可以进入相应的功能单元。

    我个人理解,这个功能,push消息功能加上iOS8推出的扩展today功能,这三个机制使iOS应用变得无比灵活方便,用户可以不需付出寻找的时间成本来快速使用自己需要的功能。

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

    2. 3D Touch的三大模块

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

    1、Home Screen Quick Actions

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

    2、peek and pop

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

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


     

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


     

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


     

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

    3.Force Properties

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


    静态3Dtouch 在info.plist中配置

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

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

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

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

    UIApplicationShortcutItemSubtitle 设置标签的副标题

    UIApplicationShortcutItemIconType 设置标签Icon类型

    UIApplicationShortcutItemIconFile  设置标签的Icon文件

    ② 动态在 appdelegate 中实现

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

    UIApplicationShortcutItem 创建3DTouch标签的类

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

    UIApplicationShortcutIcon 创建标签中图片Icon的类

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

    @interface UIApplicationShortcutItem : NSObject 

    //下面是两个初始化方法 通过设置type,title等属性来创建一个标签,这里的icon是UIApplicationShortcutIcon对象,我们后面再说

    - (instancetype)initWithType:(NSString *)type localizedTitle:(NSString *)localizedTitle localizedSubtitle:(nullable NSString *)localizedSubtitle icon:(nullable UIApplicationShortcutIcon *)icon userInfo:(nullable NSDictionary *)userInfo NS_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> *userInfo;

    //这个类继承于 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> *userInfo;

    @end

    //这个类创建标签中的icon

    @interface UIApplicationShortcutIcon : NSObject 

    //创建系统风格的icon

    + (instancetype)iconWithType:(UIApplicationShortcutIconType)type;

    //创建自定义的图片icon

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

    @end

    创建好标签后,将其添加如application的hortcutItems数组中即可,示例如下:

    - (void)viewDidLoad {

    [super viewDidLoad];

    // Do any additional setup after loading the view, typically from a nib.

    //创建

    UIApplicationShortcutItem * item = [[UIApplicationShortcutItem alloc]initWithType:@"two"localizedTitle:@"第二个标签"localizedSubtitle:@"看我哦"icon:[UIApplicationShortcutIcon iconWithType:UIApplicationShortcutIconTypePlay] userInfo:nil];

    //添加

    [UIApplication sharedApplication].shortcutItems = @[item];

    }

    也可以在appdelegate 中写

    UIApplicationShortcutIcon *icon1 = [UIApplicationShortcutIcon iconWithTemplateImageName:@"iCon1"];

    UIApplicationShortcutIcon *icon2 = [UIApplicationShortcutIcon iconWithTemplateImageName:@"iCon2"];

    UIApplicationShortcutIcon *icon3 = [UIApplicationShortcutIcon iconWithTemplateImageName:@"iCon3"];

    // create several (dynamic) shortcut items

    UIMutableApplicationShortcutItem

    *item1 = [[UIMutableApplicationShortcutItem

    alloc]initWithType:@"com.test.dynamic" localizedTitle:@"Dynamic

    Shortcut" localizedSubtitle:@"available after first launch" icon:icon1

    userInfo:nil];

    UIMutableApplicationShortcutItem

    *item2 = [[UIMutableApplicationShortcutItem

    alloc]initWithType:@"com.test.deep1" localizedTitle:@"Deep Link 1"

    localizedSubtitle:@"Launch Nav Controller" icon:icon2 userInfo:nil];

    UIMutableApplicationShortcutItem

    *item3 = [[UIMutableApplicationShortcutItem

    alloc]initWithType:@"com.test.deep2" localizedTitle:@"Deep Link 2"

    localizedSubtitle:@"Launch 2nd Level" icon:icon3 userInfo:nil];

    // add all items to an array

    NSArray *items = @[item1, item2, item3];

    // add this array to the potentially existing static UIApplicationShortcutItems

    NSArray *existingItems = [UIApplication sharedApplication].shortcutItems;

    NSArray *updatedItems = [existingItems arrayByAddingObjectsFromArray:items];

    [UIApplication sharedApplication].shortcutItems = updatedItems;

    - (void)application:(UIApplication *)application

    performActionForShortcutItem:(UIApplicationShortcutItem *)shortcutItem

    completionHandler:(void (^)(BOOL))completionHandler

    在控制器中pop peek

    首先控制器该继承UIViewControllerPreviewingDelegate应该判断该控制器当前是否实现了3dtouch手势 如果实现的话最好禁用长按手势 (如果你的添加了该手势的话)

    if (self.traitCollection.forceTouchCapability == UIForceTouchCapabilityAvailable) {

    [self registerForPreviewingWithDelegate:(id)self sourceView:self.view];

    NSLog(@"3D Touch is available! Hurra!");

    // no need for our alternative anymore

    self.longPress.enabled = NO;

    } else {

    NSLog(@"3D Touch is not available on this device. Sniff!");

    // handle a 3D Touch alternative (long gesture recognizer)

    self.longPress.enabled = YES;

    }

    点击进入预览模式: 实现该协议方法

    - (UIViewController *)previewingContext:(id)previewingContext viewControllerForLocation:(CGPoint)location

    继续按压进入:实现该协议

    - (void)previewingContext:(id)previewingContext commitViewController:(UIViewController *)viewControllerToCommit

    预览模式上拉实现 :

    我们预览模式下上拉 出现一个视图  该视图类 apple提供了 UIPreviewAction 该类来实现,调用

    UIPreviewAction *action1 = [UIPreviewAction actionWithTitle:@"Action 1" style:UIPreviewActionStyleDefault handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {

    NSLog(@"Action 1 triggered");

    }];

    回调中实现你要操作的行为

    这个方法在 - (NSArray> *)previewActionItems  中返回action 的数组

    有趣的是 如果我们对action 继续包装一个数组 还是可以的

  • 相关阅读:
    思念
    空白
    curl json string with variable All In One
    virtual scroll list All In One
    corejs & RegExp error All In One
    socket.io All In One
    vue camelCase vs PascalCase vs kebabcase All In One
    element ui 表单校验,非必填字段校验 All In One
    github 定时任务 UTC 时间不准确 bug All In One
    input range & color picker All In One
  • 原文地址:https://www.cnblogs.com/zhangrunchao/p/5981645.html
Copyright © 2020-2023  润新知