Upload
hoanganh
View
230
Download
0
Embed Size (px)
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 [email protected]
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