以及如何创造 3D Touch,本次我们来商量 3D Touch 的其余一个情节 –

3D Toouch

Peek Pop

在前边几期快报中,我们介绍了 3D Touch 的骨干内容,以及如何成立 3D Touch
桌面疾速菜单。本次大家来商讨 3D Touch 的其余二个内容 – Peek & Pop
操作。

在前面几期快报中,大家介绍了 3D Touch 的主导内容,以及哪些创制 3D Touch
桌面火速菜单。本次大家来研究 3D Touch 的此外1个内容 – Peek & Pop
操作。

所谓 Peek & Pop 其实就是 iOS 9 中为大家提供的一种预览效用,通过 3D
Touch
来刺激它的调用。比如大家在看短信照旧邮件等音信的时候,通过按压列表中得内容,大家就可见取得3个预览视图。然后再持续大力按压,大家就足以从预览界面直接进去到内容页面。

所谓 Peek & Pop 其实就是 iOS 9 中为大家提供的一种预览功用,通过 3D
Touch
来激励它的调用。比如我们在看短信依然邮件等消息的时候,通过按压列表中得内容,大家就可见取得三个预览视图。然后再持续努力按压,大家就足以从预览界面直接进入到内容页面。

Peek & Pop 操作,也是 WWDC 中示范 3D Touch
的重点方面。它的落成其实也并不复杂,大家团结的 APP 中可以透过新的 API
很随便的落到实处那么些效应。

Peek & Pop 操作,也是 WWDC 中示范 3D Touch
的要紧方面。它的完毕其实也并不复杂,大家温馨的 APP 中可以透过新的 API
很轻易的落实这么些成效。

上面大家就来看看吧,首先我们定义多个 UIViewController:

上边大家就来看看啊,首先大家定义一个 UIViewController:

@interface ViewController : UIViewController<UITableViewDelegate, UITableViewDataSource, UIViewControllerPreviewingDelegate>


@end
class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, UIViewControllerPreviewingDelegate {

  let tableView = UITableView()

  let news = ["SwiftCafe 快报 - 3D Touch 实践之桌面快捷方式第二篇","SwiftCafe 快报 - TIOBE 10月编程语言排行 Swift 即将超越 Objective-C","SwiftCafe 快报 - iOS 9 新特性之 3D Touch"]

  override func viewDidLoad() {
      super.viewDidLoad()


  }

}

这个 ViewController 完成了多少个 ProtocolUITableViewDelegate,
UITableViewDataSource, UIViewControllerPreviewingDelegate

这个 ViewController 已毕了五个 ProtocolUITableViewDelegate,
UITableViewDataSource, UIViewControllerPreviewingDelegate

前三个相信大家都相比较纯熟了,都和 UITable
相关,用于大家来得列表消息。而最终贰个 Protocol
UIViewControllerPreviewingDelegate 就比较关键了。它是完成 Peek &
Pop
操作的重中之重。

前多少个相信我们都相比熟谙了,都和 UITable
相关,用于我们来得列表新闻。而最后2个 Protocol
UIViewControllerPreviewingDelegate 就相比较主要了。它是兑现 Peek &
Pop
操作的重点。

理所当然,我们还定义了几个属性 tableViewnews,它们只是用于消息显示。

当然,我们还定义了五个属性 tableViewnews,它们只是用来新闻展现。

接着就是 UITableView
相关的代办方法的贯彻,都比较熟识,我们一带而过即可:

接着就是 UITableView
相关的代办方法的落实,都相比较熟习,大家一带而过即可:

// MARK: TableView Delegate
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {

    return news.count;

}

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {

    return 1;

}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    NSString *cellIdentifier = @"cellIdentifier";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];

    if (cell == nil) {

        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];

    }

    cell.textLabel.text = news[indexPath.row];

    return cell;

}
// MARK: TableView Delegate
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

    return news.count

}

func numberOfSectionsInTableView(tableView: UITableView) -> Int {

    return 1

}

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    let cellIdentifier = "cellIdentifier"

    var cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier)

    if cell == nil {

        cell = UITableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: cellIdentifier)

    }

    cell?.textLabel?.text = news[indexPath.row]

    return cell!

}

单单是规定哪些展现 UItableView 相关的音讯。

偏偏是规定哪些显示 UItableView 相关的音讯。

接下来我们兑现 viewDidLoad 方法,对整个控制器举办开始化工作:

下一场大家贯彻 viewDidLoad 方法,对一切控制器举办初叶化工作:

- (void)viewDidLoad {

    [super viewDidLoad];

    news = @[@"SwiftCafe 快报 - 3D Touch 实践之桌面快捷方式第二篇",
             @"SwiftCafe 快报 - TIOBE 10月编程语言排行 Swift 即将超越 Objective-C",
             @"SwiftCafe 快报 - iOS 9 新特性之 3D Touch"];

    self.title = @"3D Touch - Peek & Pop 示例";
    self.navigationItem.backBarButtonItem.title = @"返回";

    mainTableView = [[UITableView alloc] init];
    mainTableView.delegate = self;
    mainTableView.dataSource = self;

    self.navigationController.navigationBar.translucent = NO;

    mainTableView.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height);
    [self.view addSubview:mainTableView];

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

        [self registerForPreviewingWithDelegate:self sourceView:self.view];

    }



}
override func viewDidLoad() {
    super.viewDidLoad()

    self.title = "3D Touch - Peek & Pop 示例"
    self.navigationItem.backBarButtonItem?.title = "返回"
    tableView.dataSource = self
    tableView.delegate = self

    self.navigationController?.navigationBar.translucent = false

    tableView.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)
    self.view.addSubview(tableView)

    if traitCollection.forceTouchCapability == UIForceTouchCapability.Available {

        registerForPreviewingWithDelegate(self, sourceView: view)

    }

}

本条形式的前半有些,也基本都以一对 UI
成分的发轫化工作。相比较重大的是以此法子的后半局地,也等于:

其一艺术的前半有的,也基本都是一些 UI
成分的开头化工作。相比根本的是那几个方法的后半片段,相当于:

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

    [self registerForPreviewingWithDelegate:self sourceView:self.view];

}
if traitCollection.forceTouchCapability == UIForceTouchCapability.Available {

    registerForPreviewingWithDelegate(self, sourceView: view)

}

本条论断的效益是检测当前设备是还是不是援助 3D Touch,若是帮忙,就调用
registerForPreviewingWithDelegate(self, sourceView: view)
方法,将视图控制器的主视图注册为 3D Touch Peek & Pop 的主体。

这么些论断的作用是检测当前配备是不是帮助 3D Touch,借使支持,就调用
registerForPreviewingWithDelegate(self, sourceView: view)
方法,将视图控制器的主视图注册为 3D Touch Peek & Pop 的主体。

那儿大家运营程序,就足以看出列表内容的突显了:

此刻咱们运转程序,就足以见到列表内容的变现了:

Peek 预览

UI 列表界面

怎么着,列表出现了,但那是大家大力按压列表项上的始末,并没有出现预期的结果。

Peek Pop

接下去,大家继续落到实处 3D Touch 操作处理局地,还记得大家面前提到的
UIViewControllerPreviewingDelegate 么,关键就在于这一个 Protocol
中的三个法子:

在面前几期快报中,我们介绍了 3D Touch 的基本内容,以及怎么着创制 3D Touch
桌面迅速菜单。这一次大家来商量 3D Touch 的其余二个故事情节 – Peek & Pop
操作。

- (UIViewController *)previewingContext:(id<UIViewControllerPreviewing>)previewingContext viewControllerForLocation:(CGPoint)location {

    NSIndexPath *index =  [mainTableView indexPathForRowAtPoint:location];

    UITableViewCell *cell = [mainTableView cellForRowAtIndexPath:index];

    if(cell != nil ){

        DetailViewController *detailViewController = [[DetailViewController alloc] init];
        detailViewController.text = cell.textLabel.text;
        return detailViewController;

    }

    return nil;

}

- (void)previewingContext:(id<UIViewControllerPreviewing>)previewingContext commitViewController:(UIViewController *)viewControllerToCommit {

    [self showViewController:viewControllerToCommit sender:self];

}

所谓 Peek & Pop 其实就是 iOS 9 中为大家提供的一种预览作用,通过 3D
Touch
来激发它的调用。比如大家在看短信只怕邮件等音讯的时候,通过按压列表中得内容,大家就可以获取3个预览视图。然后再持续开足马力按压,大家就可以从预览界面直接进去到情节页面。

那七个点子中,第多少个点子
func previewingContext(previewingContext: viewControllerForLocation:)
是用于相应中度按压前边世预览窗口的。当我们高度按压主列表的条款时,大家就会创立三个
DetailViewController 并用它来彰显预览内容。

Peek & Pop 操作,也是 WWDC 中示范 3D Touch
的严重性方面。它的落到实处其实也并不复杂,我们安危与共的 APP 中得以经过新的 API
很随便的贯彻这么些功用。

而第2个措施
func previewingContext(previewingContext: commitViewController:)
用于,当用户已经经过高度按压激发出预览界面的时候,继续大力按压后,正式的进入详情页面。我们调用
showViewController 方法,来进入详情页面。

下边大家就来探视啊,首先大家定义1个 UIViewController:

贯彻完那八个主意,大家就足以像 WWDC 演示的那么,在我们团结的 APP
中响应 3D Touch 预览事件啦。有没有痛感很酷~

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, UIViewControllerPreviewingDelegate {

  let tableView = UITableView()

  let news = ["SwiftCafe 快报 - 3D Touch 实践之桌面快捷方式第二篇","SwiftCafe 快报 - TIOBE 10月编程语言排行 Swift 即将超越 Objective-C","SwiftCafe 快报 - iOS 9 新特性之 3D Touch"]

  override func viewDidLoad() {
      super.viewDidLoad()


  }

}

而详尽界面控制器的完结也急需大家做一些操作,大家来看一下
DetailViewController 的实现:

这个 ViewController 已毕了多少个 ProtocolUITableViewDelegate,
UITableViewDataSource, UIViewControllerPreviewingDelegate

@interface DetailViewController : UIViewController

@property (nonatomic, strong) NSString *text;

@end

#import "DetailViewController.h"

@implementation DetailViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    self.title = @"SwiftCafe 快报";
    self.navigationItem.backBarButtonItem.title = @"返回";

    UITextView *textView = [[UITextView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];
    textView.font = [UIFont systemFontOfSize:24];
    textView.text = self.text;
    [self.view addSubview:textView];

}

- (NSArray<id<UIPreviewActionItem>> *)previewActionItems {

    UIPreviewAction *itemShare = [UIPreviewAction actionWithTitle:@"分享" style:UIPreviewActionStyleDefault handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {

        UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"分享" message:@"分享内容" delegate:nil cancelButtonTitle:@"确定" otherButtonTitles: nil];

        [alertView show];

    }];

    return @[itemShare];

}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}


@end

前几个相信大家都相比较纯熟了,都和 UITable
相关,用于我们浮现列表音信。而结尾2个 Protocol
UIViewControllerPreviewingDelegate 就相比首要了。它是兑现 Peek &
Pop
操作的首要性。

DetailViewControllerviewDidLoad 方法达成对 UI
举行了有个别基本早先化操作,相比简单,不多废话。

理所当然,大家还定义了三个属性 tableViewnews,它们只是用于消息突显。

previewActionItems 方法,大家可以稍加关切。

接着就是 UITableView
相关的代办方法的兑现,都比较熟谙,大家一带而过即可:

我们在通过按压列表条目后,会弹出类似那样的预览视图:

// MARK: TableView Delegate
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

    return news.count

}

func numberOfSectionsInTableView(tableView: UITableView) -> Int {

    return 1

}

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    let cellIdentifier = "cellIdentifier"

    var cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier)

    if cell == nil {

        cell = UITableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: cellIdentifier)

    }

    cell?.textLabel?.text = news[indexPath.row]

    return cell!

}

而那个预览视图,大家出来继续按压,进而打开真正的详情视图以外,大家仍是可以透过发展滑入手指,打开这几个预览视图的操作界面,那样大家就可以不确实的进去详情页面,来对该条款举行局地一定的操作了,比如分享,删除,等等。

仅仅是明确什么浮现 UItableView 相关的音讯。

小编们那边达成的 previewActionItems
方法,正是为预览视图提供这几个操作选项用的。每多个操作选项,都是三个
UIPreviewAction 类。

然后大家贯彻 viewDidLoad 方法,对全部控制器进行起先化工作:

接下去,大家得以运作这几个示例,并按压后迈入滑动,就可以打开预览视图的操作选项界面了:

override func viewDidLoad() {
    super.viewDidLoad()

    self.title = "3D Touch - Peek & Pop 示例"
    self.navigationItem.backBarButtonItem?.title = "返回"
    tableView.dataSource = self
    tableView.delegate = self

    self.navigationController?.navigationBar.translucent = false

    tableView.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)
    self.view.addSubview(tableView)

    if traitCollection.forceTouchCapability == UIForceTouchCapability.Available {

        registerForPreviewingWithDelegate(self, sourceView: view)

    }

}

越来越多出色内容可关怀微信公众号:
swift-cafe

以此办法的前半片段,也基本都以有个别 UI
成分的初叶化工作。相比首要的是以此主意的后半有的,相当于:

if traitCollection.forceTouchCapability == UIForceTouchCapability.Available {

    registerForPreviewingWithDelegate(self, sourceView: view)

}

这几个判断的效用是检测当前配备是或不是扶助 3D Touch,如若支持,就调用
registerForPreviewingWithDelegate(self, sourceView: view)
方法,将视图控制器的主视图注册为 3D Touch Peek & Pop 的主体。

此刻我们运维程序,就可以看出列表内容的显现了:

peek-1.jpg

哪些,列表出现了,但那是我们尽力按压列表项上的情节,并不曾出现预期的结果。

接下去,我们继续完毕 3D Touch 操作处理局地,还记得我们目前提到的
UIViewControllerPreviewingDelegate 么,关键就在于那个 Protocol
中的三个办法:

func previewingContext(previewingContext: UIViewControllerPreviewing, viewControllerForLocation location: CGPoint) -> UIViewController? {

    guard let indexPath = tableView.indexPathForRowAtPoint(location),
    cell = tableView.cellForRowAtIndexPath(indexPath)
        else {return nil}

    let detailViewController = DetailViewController()
    detailViewController.text = cell.textLabel!.text!
    return detailViewController
}

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

那多个主意中,第二个章程
func previewingContext(previewingContext: viewControllerForLocation:)
是用于相应高度按压前边世预览窗口的。当大家中度按压主列表的条条框框时,我们就会创立1个
DetailViewController 并用它来突显预览内容。

而首个艺术
func previewingContext(previewingContext: commitViewController:)
用于,当用户已经经过中度按压激发出预览界面的时候,继续开足马力按压后,正式的进去详情页面。我们调用
showViewController 方法,来进入详情页面。

兑现完那七个法子,大家就可以像 WWDC 演示的那么,在我们温馨的 APP
中响应 3D Touch 预览事件啦。有没有觉得很酷~

而详尽界面控制器的兑现也急需大家做一些操作,大家来看一下
DetailViewController 的实现:

class DetailViewController: UIViewController {

    var text:String = ""

    override func viewDidLoad() {
        super.viewDidLoad()

        self.title = "SwiftCafe 快报"
        self.navigationItem.backBarButtonItem?.title = "返回"

        let textView = UITextView(frame: CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height))
        textView.font = UIFont.systemFontOfSize(24)
        textView.text = text
        self.view.addSubview(textView)

    }

    override func previewActionItems() -> [UIPreviewActionItem] {

        let itemShare = UIPreviewAction(title: "分享", style: UIPreviewActionStyle.Default) {
            previewAction, viewController in

            let alertView = UIAlertView(title: "分享", message: "分享内容", delegate: nil, cancelButtonTitle: "确定")
            alertView.show()

        }

        return [itemShare]

    }

}

DetailViewControllerviewDidLoad 方法落成对 UI
进行了有的着力开头化操作,相比较简单,不多废话。

previewActionItems 方法,我们可以稍加关怀。

咱俩在经过按压列表条目后,会弹出类似那样的预览视图:

图片 1

Peek 预览

而以此预览视图,大家出来继续按压,进而打开真正的详情视图以外,大家仍是可以通过提升滑入手指,打开那一个预览视图的操作界面,那样大家就可以不真的的进去详情页面,来对该条款进行局部特定的操作了,比如分享,删除,等等。

我们那边已毕的 previewActionItems
方法,正是为预览视图提供那个操作选项用的。每1个操作选项,都以一个
UIPreviewAction 类。

接下去,大家可以运转那些示例,并按压后向上滑动,就可以打开预览视图的操作选项界面了:

图片 2

Peek 操作

关于 3D Touch 的越来越多内容,还足以参照往期快报:

何以,列表现身了,但那是我们力图按压列表项上的始末,并没有出现预期的结果。

接下去,我们连续落到实处 3D Touch 操作处理局地,还记得我们眼下提到的
UIViewControllerPreviewingDelegate 么,关键就在于那么些 Protocol
中的两个方法:

func previewingContext(previewingContext: UIViewControllerPreviewing, viewControllerForLocation location: CGPoint) -> UIViewController? {

    guard let indexPath = tableView.indexPathForRowAtPoint(location),
    cell = tableView.cellForRowAtIndexPath(indexPath)
        else {return nil}

    let detailViewController = DetailViewController()
    detailViewController.text = cell.textLabel!.text!
    return detailViewController
}

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

那多少个办法中,第三个点子
func previewingContext(previewingContext: viewControllerForLocation:)
是用于相应高度按压后边世预览窗口的。当大家中度按压主列表的条款时,大家就会成立壹个
DetailViewController 并用它来体现预览内容。

而第三个措施
func previewingContext(previewingContext: commitViewController:)
用于,当用户已经经过中度按压激发出预览界面的时候,继续全力按压后,正式的进去详情页面。大家调用
showViewController 方法,来进入详情页面。

落实完那八个方法,大家就足以像 WWDC 演示的那样,在大家协调的 APP
中响应 3D Touch 预览事件啦。有没有觉得很酷~

而详细界面控制器的兑现也亟需大家做一些操作,大家来看一下
DetailViewController 的实现:

class DetailViewController: UIViewController {

    var text:String = ""

    override func viewDidLoad() {
        super.viewDidLoad()

        self.title = "SwiftCafe 快报"
        self.navigationItem.backBarButtonItem?.title = "返回"

        let textView = UITextView(frame: CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height))
        textView.font = UIFont.systemFontOfSize(24)
        textView.text = text
        self.view.addSubview(textView)

    }

    override func previewActionItems() -> [UIPreviewActionItem] {

        let itemShare = UIPreviewAction(title: "分享", style: UIPreviewActionStyle.Default) {
            previewAction, viewController in

            let alertView = UIAlertView(title: "分享", message: "分享内容", delegate: nil, cancelButtonTitle: "确定")
            alertView.show()

        }

        return [itemShare]

    }

}

DetailViewControllerviewDidLoad 方法已毕对 UI
进行了一些着力先导化操作,相比简单,不多废话。

previewActionItems 方法,大家可以稍加关切。

大家在通过按压列表条目后,会弹出类似那样的预览视图:

Peek 预览

而以此预览视图,大家出来继续按压,进而打开真正的详情视图以外,我们仍是可以透过升高滑入手指,打开这一个预览视图的操作界面,那样大家就可以不着实的进入详情页面,来对该条目进行局地特定的操作了,比如分享,删除,等等。

作者们那里完毕的 previewActionItems
方法,正是为预览视图提供那么些操作选项用的。每1个操作选项,都是1个
UIPreviewAction 类。

接下去,大家能够运转那么些示例,并按压后上扬滑动,就足以打开预览视图的操作选项界面了:

Peek 操作

关于 3D Touch 的越来越多内容,还是能参照往期快报:

更加多精彩内容可关切微信公众号:
swift-cafe

图片 3