3DTouch介绍(一)

原创 2018年04月17日 14:09:41

*关于3D Touch,目前能用的就是三处,
1、Home Screen Quick Actions,
就是 应用图标压力感应,弹出的菜单,这个是简单的应用场景,下面稍作介绍;
2、UIKit peek and pop & Web view peek and pop,
指的是在App内部,压力感应的预览功能,这两个我归为一类,是因为大同小异,都是预览,只是UIKit预览,要我们自定义一个预览VC,而Web view预览,使用SFSafariViewController,只需要打开webView的allowsLinkPreview属性
3、Force Properties,
结合UITouch的自定义压力感应需求的属性,这个打算有空先写个demo,然后在之后的博客中写写。。。这里不提了
下面进入正题:

1、Home Screen Quick Actions

1、静态添加入口标签
在plist文件中添加如图字段
这里写图片描述
这个大家自己YY吧
2、动态添加入口标签
我们在工程中根视图的viewDidLoad方法中添加如下代码:

// 创建标签的ICON图标。

//如果系统图标不满足需求,可以使用+ (instancetype)iconWithTemplateImageName:(NSString *)templateImageName;添加自定义图片作为标签,需要注意的是:图片必须预先添加进bundle。
let addIcon   = UIApplicationShortcutIcon(type: UIApplicationShortcutIconType.Add)
    let alarmIcon = UIApplicationShortcutIcon(type: UIApplicationShortcutIconType.Alarm)
    let cloudIcon = UIApplicationShortcutIcon(type: UIApplicationShortcutIconType.Cloud)
    let bookMIcon = UIApplicationShortcutIcon(type: UIApplicationShortcutIconType.Bookmark)
// 创建一个标签,并配置相关属性。
let addItem = UIApplicationShortcutItem
(type: "a", localizedTitle: "添加", localizedSubtitle: "", icon: addIcon, userInfo: nil)
    let alarmItem = UIApplicationShortcutItem
    (type: "b", localizedTitle: "闹钟", localizedSubtitle: "", icon: alarmIcon, userInfo: nil)
(type: "c", localizedTitle: "cloud", localizedSubtitle: "", icon: cloudIcon, userInfo: nil)
    let booMItem = UIApplicationShortcutItem
    (type: "d", localizedTitle: "书签", localizedSubtitle: "", icon: bookMIcon, userInfo: nil)
// 将标签添加进Application的shortcutItems中。
UIApplication.sharedApplication().shortcutItems = [addItem, alarmItem, cloudItem, booMItem];
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

效果图:
这里写图片描述
我们知道,这个功能的作用就是用来快速启动App中某一个特定功能,EX: 扫一扫,那么如何判断点击类型来确定App入口呢?

iOS9在AppDelegated中提供了一个新方法:

func application(application: UIApplication, performActionForShortcutItem shortcutItem: UIApplicationShortcutItem, completionHandler: (Bool) -> Void) {
    // performActionForShortcutItem作为入口标记
}
  • 1
  • 2
  • 3

如果App是从快速入口启动的,则会执行这个方法。该方法的shortcutItem参数携带了从快速入口进入app时的标签参数。

参数详情:

字段名 功能 备注
UIApplicationShortcutIemType 设置快捷item的类型 可以根据此type判断不同的item,从而能判定入口
UIApplicationShortcutItemUserInfo 设置用户信息,是一个字典类型,可以用来传值 传值到对应的入口处
UIApplicationShortcutIcon 菜单图标 -
UIApplicationShortcutItem 菜单类 -

2、Peek & Pop

这个是我非常喜欢的功能,结合其他技术,我们可以实现很diao的交互体验。
先上一个效果图吧
这里写图片描述
上滑~
这里写图片描述
下面以我的demo(使用SFSafariViewController预览当前链接)说一下从0开始怎么添加Peek & Pop到工程中:

  1. 在一个已存在的控制器ViewController中,遵循 UIViewControllerPreviewingDelegate、SFSafariViewControllerDelegate,并实现代理方法
// 我习惯写在了extension中
extension ViewController: UIViewControllerPreviewingDelegate, SFSafariViewControllerDelegate{
  /**
   UIViewControllerPreviewingDelegate  peek & pop
  */
  func previewingContext(previewingContext: UIViewControllerPreviewing, viewControllerForLocation location: CGPoint) -> UIViewController? {
 // location:手指压力的位置,是一个很有用参数,比如设定压力响应有效范围、tableView中辨别cell

   // SFSafariViewController展示url内容的预览VC
   // SFViewController是我继承SFSafariViewController写的,目的是为了扩展Peek & Pop的UIPreviewAction功能(预览状态,上移VC,下方弹出类似ActionSheet框)
    let pre = SFViewController(URL: NSURL(string:
      constellEN == "" ? "http://www.xzw.com/astro/" : "http://www.xzw.com/astro/".stringByAppendingFormat(constellEN))!,
      entersReaderIfAvailable: true)
    pre.constellEN = "http://www.xzw.com/astro/".stringByAppendingFormat(constellEN)

    /* // 当然,根据不同需求,我们可以自定义预览VC,不局限于SFSafariViewController
    let mains = UIStoryboard(name: "Main", bundle: nil)
    let pre = mains.instantiateViewControllerWithIdentifier("preVC")
    */

    // 预览VC的大小
    pre.preferredContentSize = CGSizeMake(0, 670)

    // 设置peek后的非模糊部分view的frame
    let rect = CGRectMake(0, button.frame.origin.y, self.view.frame.size.width - 20, 50)
    previewingContext.sourceRect = rect

    // 固定3D Touch的有效感应范围
    return CGRectContainsPoint(button.frame, location) ? pre : nil
  }


  func previewingContext(previewingContext: UIViewControllerPreviewing, commitViewController viewControllerToCommit: UIViewController) {
    self.showViewController(viewControllerToCommit, sender: self)
  }

  /**
 1.  SFSafariViewControllerDelegate  点击'Done' 关闭SFSafariViewController
  */
  func safariViewControllerDidFinish(controller: SFSafariViewController) {
  // 关闭SFViewController
    controller .dismissViewControllerAnimated(true) { () -> Void in   
    }
  }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  1. 新建SFViewController
class SFViewController: SFSafariViewController {
    var constellEN : String? = ""
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    }
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
// Preview action items.
  // 计算属性
  lazy var previewActions: [UIPreviewActionItem] = {

    // 创建UIPreViewAction的函数
    func previewActionForTitle(title: String, style: UIPreviewActionStyle = .Default) -> UIPreviewAction {

      let action = UIPreviewAction(title: title, style: style) { previewAction, viewController in
        // previewAction 是被点击的Action; viewController 就是预览的VC
        // 这个闭包内,可以写点击Action的响应事件
        guard let detailViewController = viewController as? SFViewController,
          item = detailViewController.constellEN else { return }

        if previewAction.title == "复制链接" {
          // 访问剪切板
          let pasteB = UIPasteboard.generalPasteboard()
          pasteB.string = item
        }
      }

      return action

    }

    // 创建多个action
    let action  = previewActionForTitle("分享")
    let action1 = previewActionForTitle("复制链接")
    let action2 = previewActionForTitle("Destructive Action", style: .Destructive)

    let subAction1 = previewActionForTitle("Sub Action 1")
    let subAction2 = previewActionForTitle("Sub Action 2")
    let groupedActions = UIPreviewActionGroup(title: "Sub Actions…", style: .Default, actions: [subAction1, subAction2] )

    return [action, action1, action2, groupedActions]
  }()

  // MARK: Preview actions
  // 重写previewActionItems(),将多个actions返回
  override func previewActionItems() -> [UIPreviewActionItem] {
    return previewActions
  }
  }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52

到这基本就实现了我们所说的Peek & Pop功能

关于Force Properties的细节,将在之后的文章中介绍,顺便看看做个关于压力的小东西,谢谢~

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jsd0915/article/details/79974084

IOS实现3DTouch功能

赶需求期间,想着别人应用都搞起3DTouch功能了,咱也来装逼一会,凸显下逼格。 废话少说,先搜索了前人的热心奉献,自己再动手丰衣足食,下面归纳总结下。 首先,想要体验3DTouch功能,必须至少得是...
  • a416863220
  • a416863220
  • 2016-04-22 10:35:11
  • 9203

iOS9 3DTouch 新特性之实现过程—OC版

一、前言 因最近入手一个6sp, 看着3DTouch 挺好玩的,就想自己实现下, 3D Touch 听上去好高端,很难开发的样子,但原来那么简单,往往看着复杂高端的的东西其实简单。因为很多都是现成...
  • yj229201093
  • yj229201093
  • 2016-07-20 15:57:12
  • 906

iOS新特性实现3DTouch开发

好久没有写过文章了,今天就给大家带来一篇比较简单的开发教程吧!目的是为了让大伙能够避开那些不必要的坑,快速高效的实现功能。今天呢来和大家讲一下iOS9的新特性3DTouch开发(iOS10都已经出了B...
  • shenjie12345678
  • shenjie12345678
  • 2016-07-27 11:00:09
  • 1978

Android实现3DTouch效果

本篇博客要做的效果图: 来个低质量动图: 这个动图效果不是很好,实际上模糊效果应该是像上面第一张图那样的,后面会放出代码,有兴趣的可以试着运行一下看看效果。  先说一...
  • Shirly_YY
  • Shirly_YY
  • 2016-12-06 15:56:00
  • 2272

3D Touch 使用心得(仿微信3D Touch)

3D Touch简介随着iOS9以及iPhone 6s和iPhone 6s plus的发布,苹果添加一种立体的用户界面: 用户在主屏幕上不需要打开APP,按压图标就可以快速访问APP提供的一些功能。...
  • jinglijun
  • jinglijun
  • 2015-12-06 16:01:57
  • 3702

iOS 3D Touch开发 很良心的版本原创!

之前一直在忙着维护项目,偶然的一天闲着玩手机玩到3Dtouch,看着效果挺不错的 于是就尝试着搜索了一下相关的文案,结果除了官网给的全英文api意外国内的基本都 是互相抄袭,我搜了37篇文章,29篇相...
  • werctzzz
  • werctzzz
  • 2015-12-17 09:51:12
  • 3251

android listview仿ios 3dTouch效果

最近项目上要求在listview上实现类似ios 3dTouch功能,现在网上搜索一番,发现该文章很好的实现了这个功能,于是在这文章的基础上我自己做了一个改进。效果如图所示:             ...
  • cuckoochun
  • cuckoochun
  • 2017-08-04 23:42:45
  • 565

iOS 检查手机的3D Touch是否可用

代码:   if (self.traitCollection.forceTouchCapability == UIForceTouchCapabilityAvailable) {        }...
  • soindy
  • soindy
  • 2015-11-18 11:42:15
  • 2073

在xcode模拟器上运行3Dtouch

第一步, git clone https://github.com/DeskConnect/SBShortcutMenuSimulator.git cd SBSho...
  • hurosezhang
  • hurosezhang
  • 2016-08-15 15:52:17
  • 1712

iOS 3DTouch 代码实现

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launc...
  • chenzheiu1210
  • chenzheiu1210
  • 2016-10-19 14:18:44
  • 467
收藏助手
不良信息举报
您举报文章:3DTouch介绍(一)
举报原因:
原因补充:

(最多只允许输入30个字)