热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

iOS9byTutorials学习笔记五:Multitasking

iOS9-by-Tutorials-学习笔记五:Multitasking本文版权归作者所有,如需转载请联系孟祥月CSDN博客:http:b

iOS9-by-Tutorials-学习笔记五:Multitasking


本文版权归作者所有,如需转载请联系孟祥月
CSDN博客:http://blog.csdn.net/mengxiangyue
独立博客:http://mengxiangyue.com


在WWDC 2015上,苹果推出了multitasking,这个功能允许我们同时运行两个App,比如在看视频的时候,能够同时刷微博,由于是同时运行两个App,对于硬件的要求比较高,目前苹果并没有在所有的设备上面开放这些功能。下面就简单的介绍一下multitasking。


Getting started

在书中与本章配套的有一个工程Travelog,打开这个工程,在iPad Air 2模拟器上运行一下。我们切换横竖屏,你能看到类似如下的界面:

Travelog App使用了UISpiltViewController来展示左边的列表,点击左边的列表,在右边会显示对应的详细信息。我们会更具这个App介绍一下multitasking的三种模式:
* Slide Over
* Split View
* Picture in Picture, or PIP


Slide Over

我们沿着iPad的屏幕右边缘像左边滑动,这时候会浮动出来一个App的列表,点击其中的一个App,会显示如下,这种状态就是Slide Over模式:

在这种状态下,Travelog是不能使用的,只有我们弹出的日历App是可以使用的。


Split View

注意一下在日历App左边有一个小的图标,点击那个图标后,Travelog将会和日历App同时显示在iPad的屏幕上,并且同时能够使用,这种状态就是Split View模式:


Picture in Picture, or PIP

这种模式翻译成成中文是画中画,类似于电视上的画中画的功能。一个例子是我们可以在使用FaceTime的时候,同时使用其他的App。FaceTime将会被缩放到一个小的界面中,并且浮动在你使用的App上面。


multitasking支持情况


让你的App支持multitasking

如果你的App慢如如下的条件,那么你的App就能够支持multitasking。
* 是一个universal app
* 使用SDK 9.x编译
* 支持所有的方向
* 使用launch storyboard

满足上面四个条件的APP只是能够支持multitasking,并不表示能够完美的适配。
Travelog 满足了上面的四个功能,但是它并没有完美的适配。


Orientation and size changes

在Split View 模式下面运行 Travelog,旋转iPad为竖屏方向,显示如下:

这是一个列表界面,能够看到左边有很大的空白,在后面的内容中,我们能够更好的利用这些空白区域。

旋转屏幕至横屏状态,如下:

上面的界面也是列表界面,但是master列太窄了。

打开SplitViewController.swift文件,SplitViewController是UISplitViewController的子类,并且覆写了viewDidlayoutSubviews(), 用来更新主列的最大宽度。这个方法可能不起作用,因为在横屏Split view 模式下也可能出现窄的windown。

UIKit提供了下面几个方法用于捕获你的layout的变化:
1. willTransitionToTraitCollection(_:, withTransitionCoordinator:)
2. viewWillTransitionToSize(_:, withTransitionCoordinator:)
3. traitCollectionDidChange(_:):

下面展示了Size Classes的各种状态:


上图中 R 代表 Regular 而 C 代表 Compact


根据上图可以看出,并不是所有的multitasking和方向改变都会触发size class改变,所有你不能仅仅依靠size classes去提供最好的用户体验。我们可以viewWillTransitionToSize这个方法,在size classes改变的时候,做出正确的操作。

下面实际操作一下,在SplitViewController.swift删除viewDidLayoutSubviews() 和 updateMaximumPrimaryColumnWidth()方法,添加某些方法,最终如下(看注释):

import UIKitclass SplitViewController: UISplitViewController {// 需要删除
// override func viewDidLayoutSubviews() {
// super.viewDidLayoutSubviews()
// updateMaximumPrimaryColumnWidth()
// }override func preferredStatusBarStyle() -> UIStatusBarStyle {return .LightContent}// 需要删除
// // MARK: Helper
//
// func updateMaximumPrimaryColumnWidth() {
// if UIInterfaceOrientationIsPortrait(UIApplication.sharedApplication().statusBarOrientation) {
// maximumPrimaryColumnWidth = 170.0
// } else {
// maximumPrimaryColumnWidth = UISplitViewControllerAutomaticDimension
// }
// }// 添加的override func viewDidLoad() {super.viewDidLoad()updateMaximumPrimaryColumnWidthBasedOnSize(view.bounds.size)}// 添加的// 这是一个辅助方法 用于设置主列的最大宽度func updateMaximumPrimaryColumnWidthBasedOnSize(size: CGSize) {if size.width size.width <size.height {maximumPrimaryColumnWidth &#61; 170.0} else {maximumPrimaryColumnWidth &#61; UISplitViewControllerAutomaticDimension}}// 添加的override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {super.viewWillTransitionToSize(size,withTransitionCoordinator: coordinator)updateMaximumPrimaryColumnWidthBasedOnSize(size)}}

运行程序app最终效果如下&#xff0c;能够看出来app的主列的宽度体验更好一点了。

仔细看一下没行的内容&#xff0c;能够看到我们行上的内容&#xff0c;还是有问题的。应该是我们的cell没有响应size的变化。打开LogCell.swift找到layoutSubviews()的实现&#xff0c;能够发现代码检查的是UIScreen.mainScreen().bounds.width&#xff0c;再决定cell是使用Compact view还是regular view。 UIScreen代表整个屏幕&#xff0c;不去理会multitasking的状态。你不能再依赖屏幕尺寸来判断了。更新如下代码&#xff1a;

// 修改static let widthThreshold: CGFloat &#61; 180.0
......
override func layoutSubviews() {super.layoutSubviews()// 修改
// let isTooNarrow &#61; UIScreen.mainScreen().bounds.width .widthThresholdlet isTooNarrow &#61; bounds.width <&#61; LogCell.widthThresholdcompactView.hidden &#61; !isTooNarrowregularView.hidden &#61; isTooNarrow}

修改后运行效果如下&#xff1a;


Adaptive presentation

在如下状态下面点击 Photo Library bar button&#xff0c;能够看到如下效果&#xff1a;

在上图状态下拖动中间的标志&#xff0c;使APP为5&#xff1a;5模式&#xff0c;效果如下&#xff1a;

能够注意到&#xff0c;我们没有做任何改变&#xff0c;但是我们从33%变成50%的时候&#xff0c;弹出的模态菜单变成了整个页面。这个效果是由UIPopoverPresentationController控制的&#xff0c;而我们想要的效果是是只有APP在Slide Over模式或者作为第二APP并且在33%的时候才会使用popover。我们可以设置UIPopoverPresentationController的delegate来实现我们的行为。

打开LogsViewController.swift&#xff0c;添加如下代码&#xff1a;

extension LogsViewController: UIPopoverPresentationControllerDelegate {func adaptivePresentationStyleForPresentationController( controller: UIPresentationController,traitCollection: UITraitCollection) -> UIModalPresentationStyle {//1 判断是iPadguard traitCollection.userInterfaceIdiom &#61;&#61; .Pad else {return .FullScreen}// 宽度大于320使用popoverif splitViewController?.view.bounds.width > 320 {return .None} else {return .FullScreen}}}

下面找到如下方法设置代理&#xff1a;

func presentImagePickerControllerWithSourceType(sourceType: UIImagePickerControllerSourceType) {let controller &#61; UIImagePickerController()controller.delegate &#61; selfcontroller.sourceType &#61; sourceTypecontroller.mediaTypes &#61; [String(kUTTypeImage), String(kUTTypeMovie)]controller.view.tintColor &#61; UIColor.themeTineColor()if sourceType &#61;&#61; UIImagePickerControllerSourceType.PhotoLibrary {controller.modalPresentationStyle &#61; .Popoverlet presenter &#61; controller.popoverPresentationControllerpresenter?.sourceView &#61; viewpresenter?.barButtonItem &#61; photoLibraryButtonpresenter?.delegate &#61; self // 添加}presentViewController(controller, animated: true, completion: nil)}

最终运行的效果如下&#xff1a;

算是完成了这一篇笔记吧&#xff0c;可能跟书中不完全一样&#xff0c;感觉这篇文章只是简单介绍了一下&#xff0c;如果想更多了解请查看&#xff1a;苹果文档


推荐阅读
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 在本教程中,我们将看到如何使用FLASK制作第一个用于机器学习模型的RESTAPI。我们将从创建机器学习模型开始。然后,我们将看到使用Flask创建AP ... [详细]
  • 基于词向量计算文本相似度1.测试数据:链接:https:pan.baidu.coms1fXJjcujAmAwTfsuTg2CbWA提取码:f4vx2.实验代码:imp ... [详细]
  • vue使用
    关键词: ... [详细]
  • YOLOv7基于自己的数据集从零构建模型完整训练、推理计算超详细教程
    本文介绍了关于人工智能、神经网络和深度学习的知识点,并提供了YOLOv7基于自己的数据集从零构建模型完整训练、推理计算的详细教程。文章还提到了郑州最低生活保障的话题。对于从事目标检测任务的人来说,YOLO是一个熟悉的模型。文章还提到了yolov4和yolov6的相关内容,以及选择模型的优化思路。 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文介绍了在Linux下安装Perl的步骤,并提供了一个简单的Perl程序示例。同时,还展示了运行该程序的结果。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • java drools5_Java Drools5.1 规则流基础【示例】(中)
    五、规则文件及规则流EduInfoRule.drl:packagemyrules;importsample.Employ;ruleBachelorruleflow-group ... [详细]
  • 前言:拿到一个案例,去分析:它该是做分类还是做回归,哪部分该做分类,哪部分该做回归,哪部分该做优化,它们的目标值分别是什么。再挑影响因素,哪些和分类有关的影响因素,哪些和回归有关的 ... [详细]
author-avatar
乐思GO_361
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有