Getting Started with Multitasking on iPad in iOS...

Preview:

Citation preview

© 2015 Apple Inc. All rights reserved. Redistribution or public display not permitted without written permission from Apple.

#WWDC15

Getting Started with Multitasking on iPad in iOS 9

Peter Hajas UIKit EngineerJacob Xiao UIKit EngineerKurt Revis UIKit Engineer

App Frameworks

Session 205

Multitasking Sessions

Getting Started with Multitasking on iPad in iOS 9 Presidio Tuesday 4:30PM

Multitasking Essentials for Media-Based Apps on iPad in iOS 9 Pacific Heights Wednesday 2:30PM

Optimizing Your App for Multitasking in iOS Presidio Wednesday 3:30PM

Multitasking Sessions

Getting Started with Multitasking on iPad in iOS 9 Presidio Tuesday 4:30PM

Multitasking Essentials for Media-Based Apps on iPad in iOS 9 Pacific Heights Wednesday 2:30PM

Optimizing Your App for Multitasking in iOS Presidio Wednesday 3:30PM

Getting Started with Multitasking on iPad in iOS 9

Agenda

Multitasking in your appChanges to UIKit for MultitaskingMaking the Most of Multitasking

Slide Over

Split View

Split View

Adaptivity

Designing for AdaptivityUniversal apps

iPadiPhone

RegularCompact

Designing for AdaptivityiOS 8

RegularCompact

Designing for AdaptivityiOS 8

Designing for AdaptivityiOS 8

RegularCompact

Designing for AdaptivityiOS 8

RegularCompact

iPhone 6 Plus

iPhone 6 Plus

Designing for AdaptivityiPhone 6 Plus

Compact

Designing for AdaptivityiPhone 6 Plus

Regular

iPad Multitasking

Designing for AdaptivityiPad Multitasking

Designing for AdaptivityiPad Multitasking

Compact

Designing for AdaptivityiPad Multitasking

Regular

Why adopt Multitasking?

Let users get into your appand spend more time in new ways

Adding iPad Multitasking to Your App

Adding Multitasking to Your AppNew iOS 9 apps

iPad Multitasking is enabled by default in new projects

Adding Multitasking to Your AppExisting iOS apps

Build your app with the iOS 9 SDKSupport all orientationsUse Launch Storyboards

Adding Multitasking to Your AppExisting iOS apps

Build your app with the iOS 9 SDKSupport all orientationsUse Launch Storyboards

Adding Multitasking to Your AppExisting iOS apps

Build your app with the iOS 9 SDKSupport all orientationsUse Launch Storyboards

Adding Multitasking to Your AppExisting iOS apps

Build your app with the iOS 9 SDKSupport all orientationsUse Launch Storyboards

Adding Multitasking to Your AppExisting iOS apps

Build your app with the iOS 9 SDK

Opt out with the UIRequiresFullscreen key

Support all orientationsUse Launch Storyboards

iPad Multitasking in Your AppMultitasking, how does it work?

UIScreen

UIScreen.bounds Returns the Screen Bounds

UIScreen.bounds Returns the Screen Bounds

UIScreenUIWindow

UIScreen.bounds Returns the Screen Bounds

UIWindow

UIWindow.bounds Returns the Window Bounds

UIWindow

UIWindow.bounds Returns the Window Bounds

UIWindow

UIWindow.bounds Origin Always at (0,0)

UIWindow

UIWindow

UIWindow

UIWindow

UIWindow

Horizontally Compact

Horizontally Regular

Auto Layout

Makes resizing much easier for your app to handleRight-to-left language support

Legibility Improvements

UIView.readableContentGuide• UILayoutGuide for legible region in a UIView

Legibility Improvements

UITableView.cellLayoutMarginsFollowReadableWidth• Adds margins to cells for legibility

What’s ChangedBest Practices

Jacob Xiao iOS Frameworks Engineer

What’s Changed?

Building Adaptive Apps with UIKit WWDC14

What’s Changed?

Not much!

Building Adaptive Apps with UIKit WWDC14

Orientation

Orientation

if UIInterfaceOrientationIsLandscape(interfaceOrientation) {

// ... }

Orientation

Orientation

Orientation

Orientation

Orientation

iPhone Rotation

iPhone Rotation

iPhone Rotation

iPhone Rotation

iPad Rotation

iPad Rotation

iPad Rotation

Multitasking Resize

Multitasking Resize

Orientation

if UIInterfaceOrientationIsLandscape(interfaceOrientation) {

// ... }

Bounds

if view.bounds.size.width > view.bounds.size.height {

// ... }

Size Classes

if traitCollection.horizontalSizeClass == .Regular {

// ... }

Transitions

Responding to Rotation

willRotateToInterfaceOrientation

didRotateFromInterfaceOrientation

willAnimateRotationToInterfaceOrientation

Responding to Rotation and Resizing

willTransitionToTraitCollection

viewWillTransitionToSize

Rotation

RotationSetup

RotationSetup

Create Animations

RotationSetup

Create Animations

Run Animations

RotationSetup

Create Animations

Run Animations

Cleanup

RotationSetup

Create Animations

Run Animations

Cleanup

Sizes Change

RotationwillTransitionToTraitCollection viewWillTransitionToSizeSetup

Create Animations

Run Animations

Cleanup

Sizes Change

RotationwillTransitionToTraitCollection viewWillTransitionToSizetraitCollectionDidChange

Setup

Create Animations

Run Animations

Cleanup

Sizes Change

RotationwillTransitionToTraitCollection viewWillTransitionToSize

animateAlongsideTransition

traitCollectionDidChange

Setup

Create Animations

Run Animations

Cleanup

Sizes Change

RotationwillTransitionToTraitCollection viewWillTransitionToSize

animateAlongsideTransition

completion

traitCollectionDidChange

Setup

Create Animations

Run Animations

Cleanup

Sizes Change

Multitasking Resize

Multitasking ResizeSetup

Multitasking ResizeSetup

Create Animations

Multitasking ResizewillTransitionToTraitCollection viewWillTransitionToSize

animateAlongsideTransition

completion

traitCollectionDidChange

Setup

Create Animations

Run Animations

Cleanup

Sizes Change

Multitasking ResizewillTransitionToTraitCollection

animateAlongsideTransition

completion

traitCollectionDidChangeviewWillTransitionToSize

Multitasking ResizewillTransitionToTraitCollection

animateAlongsideTransition

completion

traitCollectionDidChangeTime LimitviewWillTransitionToSize

Multitasking ResizewillTransitionToTraitCollection

animateAlongsideTransition

completion

traitCollectionDidChangeviewWillTransitionToSizeSetup

Create Animations

Run Animations

Cleanup

Sizes Change

Multitasking Resize

animateAlongsideTransition

completion

viewWillTransitionToSizeSetup

Create Animations

Run Animations

Cleanup

Sizes Change

Multitasking ResizewillTransitionToTraitCollection

animateAlongsideTransition

completion

traitCollectionDidChange

Setup

Create Animations

Run Animations

Cleanup

Sizes Change

Multitasking ResizewillTransitionToTraitCollection

animateAlongsideTransition

completion

traitCollectionDidChangeviewWillTransitionToSizeSetup

Create Animations

Run Animations

Cleanup

Sizes Change

Windows

Windows

UIWindow

Windows

UIWindow

Windows

UIWindow

Windows

UIWindow

UIWindow

Windows

UIWindow

UIWindow

Windows

UIWindow

UIWindow

Windows

UIWindow

UIWindow

Windows

SWIFT:

UIWindow(frame: UIScreen.mainScreen.bounds())

OBJECTIVE-C:

[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]

Windows

SWIFT:

UIWindow()

OBJECTIVE-C:

[[UIWindow alloc] init]

Presentation

Presentation

UIPresentationController

Presentation

UIPresentationController

A Look Inside Presentation Controllers WWDC14

Adaptive Presentation

Adaptive Presentation

Adaptive Presentation

Adaptive Presentation

UIAdaptivePresentationControllerDelegate

Adaptive Presentation

UIAdaptivePresentationControllerDelegate

adaptivePresentationStyleForPresentationController

willPresentWithAdaptiveStyle

Popover

Popover

Popover Source

popoverPresentationController.barButtonItem = sender

Popover Source

popoverPresentationController.barButtonItem = sender

OR

popoverPresentationController.sourceView = button

popoverPresentationController.sourceRect = button.bounds

Keyboard

Keyboard

Keyboard

Keyboard

UIKeyboardWillShowNotification

UIKeyboardDidShowNotification

UIKeyboardWillHideNotification

UIKeyboardDidHideNotification

UIKeyboardWillChangeFrameNotification

UIKeyboardDidChangeFrameNotification

Keyboard

Keyboard

Best Practices

Best Practices

Consider size and Size Class instead of orientation

Best Practices

Consider size and Size Class instead of orientationThink about how to respond to transition

Best Practices

Consider size and Size Class instead of orientationThink about how to respond to transitionUse adaptive presentations

Making the Most of MultitaskingDeliver a great user experience

Kurt Revis iOS Frameworks Engineer

MultitaskingDesign for Adaptivity

MultitaskingDesign for Adaptivity

Make your app Universal — iPhone and iPad

MultitaskingDesign for Adaptivity

Make your app Universal — iPhone and iPadDesign user experiences for Compact and Regular widths

MultitaskingDesign for Adaptivity

Make your app Universal — iPhone and iPadDesign user experiences for Compact and Regular widthsUse Adaptivity to change between them

MultitaskingAdapting to dynamic size changes

StrategiesGuidelines

Strategies1: Be flexible

Strategies1: Be flexible

Try all the Multitasking cases

Strategies1: Be flexible

Try all the Multitasking casesWatch your app’s UI carefully

Strategies1: Be flexible

Try all the Multitasking casesWatch your app’s UI carefullyConcentrate on layout

Strategies1: Be flexible

Slide Over

Strategies1: Be flexible

Slide OverMake it bigger

Strategies1: Be flexible

Slide OverMake it bigger

Strategies1: Be flexible

Slide OverMake it biggerFull screen

Strategies1: Be flexible

Slide OverMake it biggerFull screen

Strategies1: Be flexible

Slide OverMake it biggerFull screen Slide Over another app, and use Split View

Strategies1: Be flexible

Slide OverMake it biggerFull screen Slide Over another app, and use Split View

Strategies1: Be flexible

Slide OverMake it biggerFull screen Slide Over another app, and use Split ViewRotate

Strategies1: Be flexible

Slide OverMake it biggerFull screen Slide Over another app, and use Split ViewRotate

Strategies2: Auto Layout

Strategies2: Auto Layout

The way to make your UI flexible

Strategies2: Auto Layout

The way to make your UI flexibleYou provide views and constraints

Strategies2: Auto Layout

The way to make your UI flexibleYou provide views and constraintsAuto Layout sets your views’ frames

Strategies2: Auto Layout

The way to make your UI flexibleYou provide views and constraintsAuto Layout sets your views’ framesMargins and guides

Strategies2: Auto Layout

The way to make your UI flexibleYou provide views and constraintsAuto Layout sets your views’ framesMargins and guidesConvenience APIs

Strategies2: Auto Layout

The way to make your UI flexibleYou provide views and constraintsAuto Layout sets your views’ framesMargins and guidesConvenience APIs

Mysteries of Auto Layout, Part 1 Presidio Thursday 11AM

Mysteries of Auto Layout, Part 2 Presidio Thursday 1:30PM

Strategies2: Auto Layout

Strategies2: Auto Layout

let label = UILabel()

Strategies2: Auto Layout

let label = UILabel() let readableContentGuide = self.view.readableContentGuide

Strategies2: Auto Layout

let label = UILabel() let readableContentGuide = self.view.readableContentGuide

Strategies2: Auto Layout

let label = UILabel() let readableContentGuide = self.view.readableContentGuide

let constraints = [ label.leadingAnchor.constraintEqualToAnchor( readableContentGuide.leadingAnchor),

Strategies2: Auto Layout

let label = UILabel() let readableContentGuide = self.view.readableContentGuide

let constraints = [ label.leadingAnchor.constraintEqualToAnchor( readableContentGuide.leadingAnchor), label.trailingAnchor.constraintEqualToAnchor( readableContentGuide.trailingAnchor)]

Strategies2: Auto Layout

let label = UILabel() let readableContentGuide = self.view.readableContentGuide

let constraints = [ label.leadingAnchor.constraintEqualToAnchor( readableContentGuide.leadingAnchor), label.trailingAnchor.constraintEqualToAnchor( readableContentGuide.trailingAnchor)]

NSLayoutConstraint.activateConstraints(constraints)

Strategies3: Size Classes in Xcode

Strategies3: Size Classes in Xcode

Interface Builder (Storyboards and XIBs)

Strategies3: Size Classes in Xcode

Interface Builder (Storyboards and XIBs)• Add or remove views and constraints

Strategies3: Size Classes in Xcode

Interface Builder (Storyboards and XIBs)• Add or remove views and constraints• Change attributes of views

Strategies3: Size Classes in Xcode

Interface Builder (Storyboards and XIBs)• Add or remove views and constraints• Change attributes of views

Asset Catalogs

Strategies3: Size Classes in Xcode

Interface Builder (Storyboards and XIBs)• Add or remove views and constraints• Change attributes of views

Asset Catalogs• Use different versions of images

Strategies3: Size Classes in Xcode

Strategies3: Size Classes in Xcode

Strategies3: Size Classes in Xcode

Strategies3: Size Classes in Xcode

Strategies3: Size Classes in Xcode

Strategies3: Size Classes in Xcode

Strategies3: Size Classes in Xcode

Strategies3: Size Classes in Xcode

Strategies4: Adaptivity callbacks

Strategies4: Adaptivity callbacks

override func willTransitionToTraitCollection( newCollection: UITraitCollection, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) { }

Strategies4: Adaptivity callbacks

override func willTransitionToTraitCollection( newCollection: UITraitCollection, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) { }

Strategies4: Adaptivity callbacks

override func willTransitionToTraitCollection( newCollection: UITraitCollection, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) { }

override func viewWillTransitionToSize( size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) { }

Strategies4: Adaptivity callbacks

override func willTransitionToTraitCollection( newCollection: UITraitCollection, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) { }

override func viewWillTransitionToSize( size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) { }

Strategies4: Adaptivity callbacks

override func willTransitionToTraitCollection( newCollection: UITraitCollection, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {

Strategies4: Adaptivity callbacks

override func willTransitionToTraitCollection( newCollection: UITraitCollection, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {

Strategies4: Adaptivity callbacks

override func willTransitionToTraitCollection( newCollection: UITraitCollection, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) { super.willTransitionToTraitCollection(newCollection, withTransitionCoordinator:coordinator)

Strategies4: Adaptivity callbacks

override func willTransitionToTraitCollection( newCollection: UITraitCollection, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) { super.willTransitionToTraitCollection(newCollection, withTransitionCoordinator:coordinator)

Strategies4: Adaptivity callbacks

override func willTransitionToTraitCollection( newCollection: UITraitCollection, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) { super.willTransitionToTraitCollection(newCollection, withTransitionCoordinator:coordinator) switch newCollection.horizontalSizeClass {

Strategies4: Adaptivity callbacks

override func willTransitionToTraitCollection( newCollection: UITraitCollection, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) { super.willTransitionToTraitCollection(newCollection, withTransitionCoordinator:coordinator) switch newCollection.horizontalSizeClass {

Strategies4: Adaptivity callbacks

override func willTransitionToTraitCollection( newCollection: UITraitCollection, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) { super.willTransitionToTraitCollection(newCollection, withTransitionCoordinator:coordinator) switch newCollection.horizontalSizeClass { case .Compact: // Change your UI for a compact width case .Regular: // Change your UI for a regular width case .Unspecified: break // Do nothing } }

Strategies4: Adaptivity callbacks

override func willTransitionToTraitCollection( newCollection: UITraitCollection, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) { super.willTransitionToTraitCollection(newCollection, withTransitionCoordinator:coordinator) switch newCollection.horizontalSizeClass { case .Compact: // Change your UI for a compact width case .Regular: // Change your UI for a regular width case .Unspecified: break // Do nothing } }

Strategies4: Adaptivity callbacks

override func willTransitionToTraitCollection( newCollection: UITraitCollection, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) { super.willTransitionToTraitCollection(newCollection, withTransitionCoordinator:coordinator)

Strategies4: Adaptivity callbacks

override func willTransitionToTraitCollection( newCollection: UITraitCollection, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) { super.willTransitionToTraitCollection(newCollection, withTransitionCoordinator:coordinator)

Strategies4: Adaptivity callbacks

override func willTransitionToTraitCollection( newCollection: UITraitCollection, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) { super.willTransitionToTraitCollection(newCollection, withTransitionCoordinator:coordinator)

let animation = { (context: UIViewControllerTransitionCoordinatorContext) -> Void in // Change your UI here. It will animate from the old to the new. }

Strategies4: Adaptivity callbacks

override func willTransitionToTraitCollection( newCollection: UITraitCollection, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) { super.willTransitionToTraitCollection(newCollection, withTransitionCoordinator:coordinator)

let animation = { (context: UIViewControllerTransitionCoordinatorContext) -> Void in // Change your UI here. It will animate from the old to the new. }

Strategies4: Adaptivity callbacks

override func willTransitionToTraitCollection( newCollection: UITraitCollection, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) { super.willTransitionToTraitCollection(newCollection, withTransitionCoordinator:coordinator)

let animation = { (context: UIViewControllerTransitionCoordinatorContext) -> Void in // Change your UI here. It will animate from the old to the new. } coordinator.animateAlongsideTransition(animation, completion: nil) }

Strategies4: Adaptivity callbacks

override func willTransitionToTraitCollection( newCollection: UITraitCollection, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) { super.willTransitionToTraitCollection(newCollection, withTransitionCoordinator:coordinator)

let animation = { (context: UIViewControllerTransitionCoordinatorContext) -> Void in // Change your UI here. It will animate from the old to the new. } coordinator.animateAlongsideTransition(animation, completion: nil) }

Strategies5: High-level API

Strategies5: High-level API

Adaptive Presentation Controllers

Strategies5: High-level API

Adaptive Presentation ControllersUITableView

Strategies5: High-level API

Adaptive Presentation ControllersUITableViewUICollectionView

Strategies5: High-level API

Adaptive Presentation ControllersUITableViewUICollectionViewUIStackView

Strategies5: High-level API

Adaptive Presentation ControllersUITableViewUICollectionViewUIStackView

Mysteries of Auto Layout, Part 1 Presidio Thursday 11AM

Strategies6: Split View Controller

Split View Controller

UISplitViewController

Split View Controller

UISplitViewController

Primary UIViewController Secondary UIViewController

Split View ControllerUISplitViewController

Primary UIViewController Secondary UIViewController

Split View ControllerUISplitViewController

Primary UIViewController Secondary UIViewController

Split View ControllerUISplitViewController

Primary UIViewController Secondary UIViewController

Split View ControllerXcode template

Strategies

Be flexibleAuto LayoutSize Classes in XcodeAdaptivity CallbacksHigh-level APISplit View Controller

Strategies

AdaptivePhotos

Sample code

MultitaskingAdapting to dynamic size changes

StrategiesGuidelines

GuidelinesThe user controls your app’s size

GuidelinesThe user controls your app’s size

The app cannot prevent size changes

GuidelinesThe user controls your app’s size

The app cannot prevent size changesIt cannot cause size changes either

GuidelinesThe user controls your app’s size

The app cannot prevent size changesIt cannot cause size changes eitherSize changes can happen at any time

GuidelinesKeep the user oriented

GuidelinesKeep the user oriented

Home☐ Chores☐ Sleep

Work☐ Code☐ Fix Bugs☐ Coffee

School☐ Read☐ Write

Home☐ Chores☐ Sleep

Work☐ Code☐ Fix Bugs☐ Coffee

School☐ Read

Regular Width

Home☐ Chores☐ Sleep

Work☐ Code☐ Fix Bugs☐ Coffee

School☐ Read☐ Write

Regular Width

Home☐ Chores☐ Sleep

Work☐ Code☐ Fix Bugs☐ Coffee

School☐ Read☐ Write

Compact Width

Home☐ Chores☐ Sleep

Work☐ Code☐ Fix Bugs☐ Coffee

School☐ Read☐ Write

Compact Width

Home☐ Chores☐ Sleep

Work☐ Code☐ Fix Bugs☐ Coffee

School☐ Read

Home☐ Chores☐ Sleep

Work☐ Code☐ Fix Bugs☐ Coffee

School☐ Read

Home☐ Chores☐ Sleep

Work☐ Code☐ Fix Bugs☐ Coffee

School☐ Read☐ Write

Home☐ Chores☐ Sleep

Work☐ Code☐ Fix Bugs☐ Coffee

School☐ Read☐ Write

Home☐ Chores☐ Sleep

Work☐ Code☐ Fix Bugs☐ Coffee

School☐ Read☐ Write

Home☐ Chores☐ Sleep

Work☐ Code☐ Fix Bugs☐ Coffee

School☐ Read☐ Write

Home☐ Chores☐ Sleep

Work☐ Code☐ Fix Bugs☐ Coffee

School☐ Read☐ Write

GuidelinesKeep the user oriented

GuidelinesKeep the user oriented

Don’t make abrupt jumps

GuidelinesKeep the user oriented

Don’t make abrupt jumpsBe smart in new ways

GuidelinesKeep the user oriented

Don’t make abrupt jumpsBe smart in new waysEspecially going from large to small

GuidelinesAfter becoming inactive

GuidelinesAfter becoming inactive

Your app’s size may change

GuidelinesAfter becoming inactive

Your app’s size may changeAdaptivity methods are still called, but nothing is visible

GuidelinesAfter becoming inactive

Your app’s size may changeAdaptivity methods are still called, but nothing is visibleThe system restores the original size

1. App is active and Compact Work☐ Code☐ Fix Bugs☐ Coffee

1. App is active and Compact2. User presses Home button

Work☐ Code☐ Fix Bugs☐ Coffee

1. App is active and Compact2. User presses Home button3. System takes snapshot

Work☐ Code☐ Fix Bugs☐ Coffee

Home☐ Chores☐ Sleep

Work☐ Code☐ Fix Bugs☐ Coffee

1. App is active and Compact2. User presses Home button3. System takes snapshot4. System resizes app to Regular

Home☐ Chores☐ Sleep

Work☐ Code☐ Fix Bugs☐ Coffee

1. App is active and Compact2. User presses Home button3. System takes snapshot4. System resizes app to Regular5. System takes another snapshot

1. App is active and Compact2. User presses Home button3. System takes snapshot4. System resizes app to Regular5. System takes another snapshot6. System resizes app to Compact

Home☐ Chores☐ Sleep

1. App is active and Compact2. User presses Home button3. System takes snapshot4. System resizes app to Regular5. System takes another snapshot6. System resizes app to Compact7. User activates app

Home☐ Chores☐ Sleep

1. App is active and Compact2. User presses Home button3. System takes snapshot4. System resizes app to Regular5. System takes another snapshot6. System resizes app to Compact7. User activates app8. System shows snapshot from step 3

Home☐ Chores☐ Sleep

Work☐ Code☐ Fix Bugs☐ Coffee

1. App is active and Compact2. User presses Home button3. System takes snapshot4. System resizes app to Regular5. System takes another snapshot6. System resizes app to Compact7. User activates app8. System shows snapshot from step 39. Fades into live app

Home☐ Chores☐ Sleep

Work☐ Code☐ Fix Bugs☐ Coffee

Home☐ Chores☐ Sleep

Home☐ Chores☐ Sleep

Work☐ Code☐ Fix Bugs☐ Coffee

1. App is active and Compact2. User presses Home button3. System takes snapshot4. System resizes app to Regular5. System takes another snapshot

1. App is active and Compact2. User presses Home button3. System takes snapshot4. System resizes app to Regular5. System takes another snapshot6. System resizes app to Compact

Work☐ Code☐ Fix Bugs☐ Coffee

1. App is active and Compact2. User presses Home button3. System takes snapshot4. System resizes app to Regular5. System takes another snapshot6. System resizes app to Compact7. User activates app

Work☐ Code☐ Fix Bugs☐ Coffee

1. App is active and Compact2. User presses Home button3. System takes snapshot4. System resizes app to Regular5. System takes another snapshot6. System resizes app to Compact7. User activates app8. System shows snapshot from step 3

Work☐ Code☐ Fix Bugs☐ Coffee

1. App is active and Compact2. User presses Home button3. System takes snapshot4. System resizes app to Regular5. System takes another snapshot6. System resizes app to Compact7. User activates app8. System shows snapshot from step 39. Fades into live app

Work☐ Code☐ Fix Bugs☐ Coffee

GuidelinesAfter becoming inactive

Maintain the same appearance

GuidelinesAfter becoming inactive

Maintain the same appearanceOn deactivation:• Remember your size and state

GuidelinesAfter becoming inactive

Maintain the same appearanceOn deactivation:• Remember your size and state

On size change:• if inactive && newSize == originalSize

- Then apply the remembered state

Primary App

Secondary App

GuidelinesExternal display

GuidelinesExternal display

Only seen by the primary app

GuidelinesPerformance

GuidelinesPerformance

When the size changes, do as little work as possible

GuidelinesPerformance

When the size changes, do as little work as possibleUse completion blocks for slow work

GuidelinesPerformance

When the size changes, do as little work as possibleUse completion blocks for slow workIn animation blocks, don’t call layoutIfNeeded

GuidelinesPerformance

When the size changes, do as little work as possibleUse completion blocks for slow workIn animation blocks, don’t call layoutIfNeededUse setNeedsLayout

MultitaskingAdapting to dynamic size changes

StrategiesGuidelines

Adopting Multitasking in iOS 9Summary

Adopt Multitasking in your appUse AdaptivityYou can deliver a great user experience

More Information

DocumentationWhat’s New in iOSiOS App Programming GuideAdopting Multitasking Enhancements on iPad

Sample CodeAdaptivePhotosLister

http://developer.apple.com/ios

Technical SupportApple Developer ForumsDeveloper Technical Support

General InquiriesCurt Rothert, App Frameworks Evangelistrothert@apple.com

Related Sessions

Multitasking Essentials for Media-Based Appson iPad in iOS 9 Mission Wednesday 2:30PM

Optimizing Your App for Multitasking in iOS Presidio Wednesday 3:30PM

Cocoa Touch and Multitasking Lab Frameworks Lab B Wednesday9:00AM, 3:30PM