iOS开发之3D Touch

1、简介

  3DTouch是在6s之后苹果的一项技术,只能在6s及其以上机型真机运行,Xcode的模拟器是不支持的。

  • Quick Actions(点击icon的快捷方式)
  • Peek&Pop(应用内快速预览内容)
  • UITouch和LivePhoto(读取压力和最大压力)

2、Quick Actions(点击icon的快捷方式)

  点击app的图标,可以弹出Today小组件(如果有的话)和UIApplicationShortcutItem快捷方式——这就是Quick Actions!

//
//  UIApplicationShortcutItem.h
//  UIKit
//
//  Copyright ? 2015-2017 Apple Inc. All rights reserved.
//

#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN

@class UIImage;

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)  //更新
} NS_ENUM_AVAILABLE_IOS(9_0) __TVOS_PROHIBITED;

NS_CLASS_AVAILABLE_IOS(9_0) __TVOS_PROHIBITED
@interface UIApplicationShortcutIcon : NSObject <NSCopying>
//初始化
+ (instancetype)iconWithType:(UIApplicationShortcutIconType)type;
//基于应用程序包中的图像创建主屏幕快速动作图标,最好是在资产目录中。
+ (instancetype)iconWithTemplateImageName:(NSString *)templateImageName;

@end

NS_CLASS_AVAILABLE_IOS(9_0) __TVOS_PROHIBITED
@interface UIApplicationShortcutItem : NSObject <NSCopying, NSMutableCopying>

//初始化
- (instancetype)init NS_UNAVAILABLE;
/**
 @param type 自定义的字符串type
 @param localizedTitle 标题
 @param localizedSubtitle 子标题
 @param icon 图标
 @param userInfo 传递的信息
 */
- (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<NSString *, id <NSSecureCoding>> *userInfo;

@end

NS_CLASS_AVAILABLE_IOS(9_0) __TVOS_PROHIBITED
//可变item
@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

NS_ASSUME_NONNULL_END

UIApplicationShortcutItem相关API

  2.1、静态创建

    直接配置Info.plist文件

  2.2、动态创建  

    代码创建:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    NSMutableArray *arrShortcutItem = (NSMutableArray *)[UIApplication sharedApplication].shortcutItems;

    UIApplicationShortcutItem *shoreItem1 = [[UIApplicationShortcutItem alloc] initWithType:@"适得府君书咖啡来看" localizedTitle:@"搜索" localizedSubtitle:nil icon:[UIApplicationShortcutIcon iconWithType:UIApplicationShortcutIconTypeSearch] userInfo:nil];
    [arrShortcutItem addObject:shoreItem1];
    UIApplicationShortcutItem *shoreItem2 = [[UIApplicationShortcutItem alloc] initWithType:@"杜师傅就快两个打开分割" localizedTitle:@"新消息" localizedSubtitle:@"" icon:[UIApplicationShortcutIcon iconWithType:UIApplicationShortcutIconTypeCompose] userInfo:nil];
    [arrShortcutItem addObject:shoreItem2];
    UIApplicationShortcutItem *shoreItem3 = [[UIApplicationShortcutItem alloc] initWithType:@"sdfasjdfhsksdjfsdajklfdjfh" localizedTitle:@"加大开发" localizedSubtitle:@"" icon:[UIApplicationShortcutIcon iconWithType:UIApplicationShortcutIconTypeLocation] userInfo:nil];
    [arrShortcutItem addObject:shoreItem3];
    UIApplicationShortcutItem *shoreItem4 = [[UIApplicationShortcutItem alloc] initWithType:@"sdfasjdfhskdjfh" localizedTitle:@"新" localizedSubtitle:@"" icon:[UIApplicationShortcutIcon iconWithType:UIApplicationShortcutIconTypeShare] userInfo:nil];
    [arrShortcutItem addObject:shoreItem4];

    [UIApplication sharedApplication].shortcutItems = arrShortcutItem;
    return YES;
}

  2.3、点击响应方法

- (void)application:(UIApplication *)application performActionForShortcutItem:(UIApplicationShortcutItem *)shortcutItem completionHandler:(void (^)(BOOL))completionHandler{
    NSLog(@"name ==%@\n type =  %@",shortcutItem.localizedTitle,shortcutItem.type);
}

  ps:系统优先加载静态方法创建的item,可以混合加载,最多4个item;

    正式发布后会有5个item,苹果统一添加个分享的item;

    有的item的图标会显现在右侧,这个和app在屏幕得位置有关;

3、Peek&Pop(应用内快速预览内容)

  Peek页面预览:给视图添加一点压力,会以弹框的方式预览目标界面;

  Pop拉出菜单:在界面预览时,如果有菜单选项,向上拖拽下面会出现菜单栏;

  继续增加压力会跳转到目标界面——也就是Peek&Pop!

  3.1、Peek

    本例在图片上添加此功能:前提一个是可以交互、二是注册registerForPreviewingWithDelegate

    [self.imageView setUserInteractionEnabled:YES];
    if (self.traitCollection.forceTouchCapability == UIForceTouchCapabilityAvailable) {
        [self registerForPreviewingWithDelegate:(id)self sourceView:self.imageView];
    }

    创建菜单栏:需要在目标ViewController界面重写- (NSArray<id<UIPreviewActionItem>> *)previewActionItems;方法

- (NSArray<id<UIPreviewActionItem>> *)previewActionItems{
    UIPreviewAction *action1 = [UIPreviewAction actionWithTitle:@"action1" style:UIPreviewActionStyleDefault handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {
        NSLog(@"action1");
    }];

    UIPreviewAction *action2 = [UIPreviewAction actionWithTitle:@"action2" style:UIPreviewActionStyleSelected handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {
        NSLog(@"action2");
    }];
    NSArray *actions = @[action1,action2];
    UIPreviewActionGroup *group1 = [UIPreviewActionGroup actionGroupWithTitle:@"Action Group" style:UIPreviewActionStyleDefault actions:actions];

    return@[action1,action2,group1];
}

    预览视图方法和跳转视图方法:

//预览
- (nullable UIViewController *)previewingContext:(id <UIViewControllerPreviewing>)previewingContext viewControllerForLocation:(CGPoint)location NS_AVAILABLE_IOS(9_0)
{
    if ([self.presentedViewController isKindOfClass:[VideoViewController class]]){
        return nil;
    }else {
        VideoViewController *contentVC = [[VideoViewController alloc] init];
        return contentVC;
    }
}

//重按进入
- (void)previewingContext:(id <UIViewControllerPreviewing>)previewingContext commitViewController:(UIViewController *)viewControllerToCommit NS_AVAILABLE_IOS(9_0)
{
    NSLog(@"重按进入");
    VideoViewController *v = [[VideoViewController alloc] init];
    [self presentViewController:v animated:YES completion:nil];
}

4、UITouch和LivePhoto(读取压力和最大压力)

  在UITouch类中有两个方法用来读取实时压力和最大压力:

// 触摸压力值
@property(nonatomic,readonly) CGFloat force NS_AVAILABLE_IOS(9_0);
// 最大触摸压力值
@property(nonatomic,readonly) CGFloat maximumPossibleForce NS_AVAILABLE_IOS(9_0);

  在本例中重写了ImageView的代理方法获取这两个数值:

- (void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    NSLog(@"=======%lf",touches.anyObject.force);
}
- (void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    NSLog(@"------%lf",touches.anyObject.maximumPossibleForce);
}

  结果:

  LivePhoto是一张图片和一段3秒的视频组成,当使用3D Touch时会播放这段视频,手指放开会结束播放。

  所以这个效果通过UITouch的上面两个属性就可以自己完成!

原文地址:https://www.cnblogs.com/xianfeng-zhang/p/9505529.html

时间: 2024-08-29 11:37:17

iOS开发之3D Touch的相关文章

iOS开发之 3D Touch 开发

在App 的开发中对于开发人员来说新设备以及新功能的适配无疑是一个很苦逼的事.在今年九月份iPhone 6S 以及 6S+ 出来之后,新的功能 3D Touch又是一个比较头疼的事.刚刚看到的时候以为是比较麻烦的东西 看着开发文档就头大(本撸主英语水平有限).但是看完官方文档之后感觉也不是很麻烦.所以就自己写了一个Demo 供大家吐槽和狂喷. 我感觉  3D Touch  的使用和  UITabBar  差不多还是一个比较简单的东西,几乎是拿过来就能用的东西. 一. 给桌面 Icon 添加 3D

李洪强IOS开发之iOS好项目收集

李洪强IOS开发之iOS好项目收集 在这里收集一些最近出现的比较实用好玩的框架或者项目,会不断更新 项目 简述 日期 SCTableViewCell 类似与QQ侧滑删除Cell的Demo 201501018 JHChainableAnimations 可读性好使用方便的动画库,语法类似与Masonry,使用链式编程 20150506 awesome-ios-chart iOS平台下的各种图表组件 20150513 DevArticles iOS Animation 主流炫酷动画框架(特效)收集整

IOS开发之copy的问题

copy的目的就是修改副本,修改原始对象和副本时不会产生干扰. 定义一个不可变属性A,再定义一个可变属性B.用B做添加删除等操作后再将B赋值给A时,有些人习惯用A = B:其实这样是不安全的. 假设有下面的一段代码: ? 1 2 3 4 5 6 7 8 9 10   int main() {    NSMutableString *strM = [NSMutableString [email protected]"123"];    NSString *str = strM;    N

iOS开发之WKWebView简单使用和常用使用场景

iOS开发之 WKWebVeiw使用 想用UIWebVeiw做的,但是突然想起来在iOS8中出了一个新的WKWebView,算是UIWebVeiw的升级版.本着对新事物的好奇,就上网查了一下,但是找了好多个都没说的多了详细,于是就问谷歌,找文档,看看使用方法,试用了一下,果然不错,记录下来,大家分享! WKWebView的特点: 性能高,稳定性好,占用的内存比较小, 支持JS交互 支持HTML5 新特性 可以添加进度条(然并卵,不好用,还是习惯第三方的). 支持内建手势, 据说高达60fps的刷

iOS开发之Auto Layout入门

随着iPhone6与iOS8的临近,适配的问题讲更加复杂,最近学习了一下Auto Layout的使用,与大家分享.  什么是Auto Layout? Auto Layout是iOS6发布后引入的一个全新的布局特性,其目的是弥补以往Autoresizing在布局方面的不足之处,以及未来面对更多尺寸适配时界面布局可以更好的适应. 为什么要用Auto Layout? Autolayout能解决不同屏幕(iPhone4,iPhone5,iPad...)之间的适配问题. 在iPhone4时代开发者只需要适

iOS开发之CocoaPods的使用

透明色:00ff00ff //设置柱状图的颜色                ColorSet cs = new ColorSet();                cs.Id = "colorset1"; #region 设置柱状图的颜色 待开发                    string strColor = oYAXIS.Color;                    switch (strColor)                    {           

iOS开发之UILabel

UILabel是iOS开发中常用的一个组件,主要用来显示内容. UILabel的主要使用如下: ? 1 2 3 4 5 6 7 8 9 10 /*尺寸*/ CGRect labelRect = CGRectMake(100, 100, 80, 40); /*初始化*/ UILabel *titleLabel = [[UILabel alloc] initWithFrame:labelRect]; /*一些属性的设置*/ titleLabel.font = [UIFont systemFontOf

iOS开发之多XIB之间相互关联

Xib link Xib 1.直接加载xib中的UIView 创建一个View1.xib, 随便设一个背景色,加一个标识UILabel, 这样好知道是这个view是哪一个view. 你可以在这个view上加作意的subview,我只是说明原理,所以这儿并没有加作何subview. 最终我的View1如下图: 由于View1会放到其它View上作为subview,所以这儿size是Freeform, Status Bar是:None. 将下面代码放到viewDidLoad中: &1这行代码就是加载

iOS开发之UISearchBar初探

iOS开发之UISearchBar初探 UISearchBar也是iOS开发常用控件之一,点进去看看里面的属性barStyle.text.placeholder等等.但是这些属性显然不足矣满足我们的开发需求.比如:修改placeholder的颜色.修改UISearchBar上面的UITextfield的背景颜色.修改UITextfield上面的照片等等. 为了实现上述的需求,最好写一个UISearchBar的子类就叫LSSearchBar吧 LSSearchBar.h如下: #import <U