kkbox wwdc17 uikit - qq

87
WWDC17 讀書會 QQ Shih UIKit 2017/07/07

Upload: liyao-chen

Post on 22-Jan-2018

2.099 views

Category:

Technology


9 download

TRANSCRIPT

Page 1: KKBOX WWDC17 UIKit - QQ

WWDC17 讀書會

QQ Shih

UIKit

2017/07/07

Page 2: KKBOX WWDC17 UIKit - QQ

• What’s new in Cocoa Touch

• The keys to a better text input experience

• Introducing password autofill for apps

• Building apps with dynamic type

• Updating your app for iOS 11

• Advanced animations with UIKit

Page 3: KKBOX WWDC17 UIKit - QQ

What’s new in Cocoa Touch

Page 4: KKBOX WWDC17 UIKit - QQ

•Drag and Drop

Page 5: KKBOX WWDC17 UIKit - QQ

Drag and Drop Enabling drags

let drag = UIDragInteraction(delegate: self) iconView.addInteraction(drag)

UIDragInteractionDelegate • Provide data for dragged item • Customize lift animation • Customize preview

Page 6: KKBOX WWDC17 UIKit - QQ

Drag and Drop Enabling drops

let drop = UIDropInteraction(delegate: self) iconContainerView.addInteraction(drop)

UIDropInteractionDelegate • Update UI as drag moves • Receive data on drop • Customize drop animation

Page 7: KKBOX WWDC17 UIKit - QQ

Drag and Drop Easy to adopt

Introducing Drag and Drop Hall 3 Tuesday 11:20AM

Mastering Drag and Drop Executive Ballroom Wednesday 11:00AM

Drag and Drop with Collection and Table View Hall 2 Thursday 9:00AM

Data Delivery with Drag and Drop Hall 2 Thursday 10:00AM

Built-in support • TableView, CollectionView, TextView, TextField, WebView

Integration with UIPasteConfiguration

Page 8: KKBOX WWDC17 UIKit - QQ

File management

Page 9: KKBOX WWDC17 UIKit - QQ

Highly customizable

Access to local documents and cloud storage

Be sure to coordinate file access• NSFileCoordinator or UIDocument

File Management UIDocumentBrowserViewController

Building Great Document-Based Apps in iOS 11 Hall 2 Thursday 1:50PM

class UIDocumentBrowserViewController { init(forOpeningFilesWithContentTypes: [String]?) var delegate: UIDocumentBrowserViewControllerDelegate?

}

Page 10: KKBOX WWDC17 UIKit - QQ
Page 11: KKBOX WWDC17 UIKit - QQ

class UINavigationBar { var prefersLargeTitle: Bool

}

Enabling Large Titles

class UINavigationItem { var largeTitleDisplayMode: LargeTitleDisplayMode

}

Page 12: KKBOX WWDC17 UIKit - QQ

Enabling Unified Search

class UINavigationItem { var searchController: UISearchController?

}

Page 13: KKBOX WWDC17 UIKit - QQ

Safe Area Insets

class UIView {

// auto layout var safeAreaLayoutGuide: UILayoutGuide { get }

// manual layout var safeAreaInsets: UIEdgeInsets { get }

func safeAreaInsetsDidChange()

}

Page 14: KKBOX WWDC17 UIKit - QQ

class UIViewController { func preferredScreenEdgesDeferringSystemGestures() -> UIRectEdge

}

Page 15: KKBOX WWDC17 UIKit - QQ

Asset Catalogs Colors and icons

class UIColor { init?(named name: String)

}

Wide gamut color support

Wide gamut colors for icons

App thinning for icons

Page 16: KKBOX WWDC17 UIKit - QQ

Asset Catalogs PDF-backed images

Preserve vector data if• Image used at multiple sizes• Symbolic glyph that resizes with dynamic type• Tab bar image

Page 17: KKBOX WWDC17 UIKit - QQ

Localization Guide https://developer.apple.com/internationalization

Page 18: KKBOX WWDC17 UIKit - QQ

The keys to a better text input experiece

Page 19: KKBOX WWDC17 UIKit - QQ

Text Input Context Identifier

class ConversationViewController: UITableViewController, UITextViewDelegate {

// ... other code ...

override var textInputContextIdentifier: String? {

// Returning some unique identifier here allows the keyboard to remember

// which language the user was typing in when they were last communicating

// with this person.

// It can be anything, as long as it's unique to each

// recipient (here we're just returning the name)

return self.conversation?.otherParticipant

}

// ... other code ...

}

Multilingual

Page 20: KKBOX WWDC17 UIKit - QQ

Content Types for Password AutoFill

Introducing Password AutoFill for Apps WWDC 2017

NEW

Log In

UITextContentTypeUsername

UITextContentTypePassword

Page 21: KKBOX WWDC17 UIKit - QQ

Smart Quote and Smart Dash

Hyphen: 1-dash - ➜ -

En dash: 2-dash - - ➜ –

Em dash: 3-dash - - - ➜ —

SF Hello "a" “a”

Helvetica Neue "a" “a”

Lucida Grande "a" “a”Avenir "a" “a”

Myriad Set "a" “a”

NEW

Page 22: KKBOX WWDC17 UIKit - QQ

New APIs in iOS 11

Selected text

documentIdentifier handle

Ability to query for full access

NEW

Page 23: KKBOX WWDC17 UIKit - QQ

Full Access and Privacy

Value in not asking for full access

Communicating with your main app

Networking

Current location

Address book

Keyboard needs to work without it

Page 24: KKBOX WWDC17 UIKit - QQ

Introducing password autofill for apps

Page 25: KKBOX WWDC17 UIKit - QQ

Make the QuickType Bar Appear Use UITextContentType

Deploy content types to guarantee AutoFill is available

Can set in code or through Interface Builder

UITextContentType.username enables AutoFill for two-screen login

You can combine UITextContentType.username and UIKeyboardType.emailAddress

UITextContentType.password enables AutoFill for “revealed” passwords

Page 26: KKBOX WWDC17 UIKit - QQ
Page 27: KKBOX WWDC17 UIKit - QQ

Associated Domains File Where to serve the file

https://example.com/.well-known/apple-app-site-association

https://example.com/apple-app-site-association

Page 28: KKBOX WWDC17 UIKit - QQ
Page 29: KKBOX WWDC17 UIKit - QQ

Building app with dynamic type

Page 30: KKBOX WWDC17 UIKit - QQ

Goals

Text is large enough for the user to read

Text is fully readable

App UI looks beautiful

Design For Everyone WWDC 2017

Page 31: KKBOX WWDC17 UIKit - QQ

•Scaling Font Sizes

Page 32: KKBOX WWDC17 UIKit - QQ
Page 33: KKBOX WWDC17 UIKit - QQ
Page 34: KKBOX WWDC17 UIKit - QQ
Page 35: KKBOX WWDC17 UIKit - QQ
Page 36: KKBOX WWDC17 UIKit - QQ

Text Styles

Standard Sizes Accessibility Sizes

NEW

Page 37: KKBOX WWDC17 UIKit - QQ

Text Styles NEW

Page 38: KKBOX WWDC17 UIKit - QQ

Custom Fonts

label.font = UIFontMetrics.default.scaledFont(for: customFont)

NEW

Page 39: KKBOX WWDC17 UIKit - QQ

•Accommodating Large Text

Page 40: KKBOX WWDC17 UIKit - QQ
Page 41: KKBOX WWDC17 UIKit - QQ

.extraSmall .extraExtraExtraLarge

.large

traitCollection.preferredContentSizeCategoryUIApplication.shared.preferredContentSizeCategory

Page 42: KKBOX WWDC17 UIKit - QQ

Make Layout Decisions Based on Text Size

if traitCollection.preferredContentSizeCategory.isAccessibilityCategory { // Vertically stack } else { // Lay out side by side }

NEW

Page 43: KKBOX WWDC17 UIKit - QQ

Make Layout Decisions Based on Text Size

if traitCollection.preferredContentSizeCategory > .extraExtraLarge { // Vertically stack } else { // Lay out side by side }

NEW

Page 44: KKBOX WWDC17 UIKit - QQ

Default Table View Behaviors in iOS 11

Standard table view cells adapt layout for Dynamic Type

Cell heights are based on their content

NEW

Page 45: KKBOX WWDC17 UIKit - QQ

•Images

Page 46: KKBOX WWDC17 UIKit - QQ

Allow Images to Scale Up

Provide PDF at 1x scale

NEW

Page 47: KKBOX WWDC17 UIKit - QQ

Allow Images to Scale UpNEW

Page 48: KKBOX WWDC17 UIKit - QQ

Allow Bar Item Images to Scale SmoothlyNEW

Page 49: KKBOX WWDC17 UIKit - QQ

Updating your app for iOS 11

Page 50: KKBOX WWDC17 UIKit - QQ
Page 51: KKBOX WWDC17 UIKit - QQ

UIBarItem

UIBarItem.landscapeImagePhoneUIBarItem.largeContentSizeImage

Page 52: KKBOX WWDC17 UIKit - QQ

Manage margin and insets

Page 53: KKBOX WWDC17 UIKit - QQ

NEW

Here’s to the crazy ones. The misfits. The rebels. The troublemakers. The round pegs in the square holes. The ones who see things differently. They’re not fond of rules. And they have no respect for the status quo. You can quote them, disagree with them, glorify or vilify them. About the only thing you can’t do is ignore them. Because they change things. They push the human race forward. And while some may see them as the crazy ones, we see genius. Because the people who are crazy enough to think they can change the world, are the ones who do.

TitlelayoutMargins

directionalLayoutMargins

Page 54: KKBOX WWDC17 UIKit - QQ

NEW

Here’s to the crazy ones. The misfits. The rebels. The troublemakers. The round pegs in the square holes. The ones who see things differently. They’re not fond of rules. And they have no respect for the status quo. You can quote them, disagree with them, glorify or vilify them. About the only thing you can’t do is ignore them. Because they change things. They push the human race forward. And while some may see them as the crazy ones, we see genius. Because the people who are crazy enough to think they can change the world, are the ones who do.

Title

.trailing

.left

.leading

.right

Page 55: KKBOX WWDC17 UIKit - QQ

NEW

Here’s to the crazy ones. The misfits. The rebels. The troublemakers. The round pegs in the square holes. The ones who see things differently. They’re not fond of rules. And they have no respect for the status quo. You can quote them, disagree with them, glorify or vilify them. About the only thing you can’t do is ignore them. Because they change things. They push the human race forward. And while some may see them as the crazy ones, we see genius. Because the people who are crazy enough to think they can change the world, are the ones who do.

Title

.trailing = 30

Page 56: KKBOX WWDC17 UIKit - QQ

NEW

Here’s to the crazy ones. The misfits. The rebels. The

troublemakers. The round pegs in the square holes. The ones who see

things differently. They’re not fond of rules. And they have no respect

for the status quo. You can quote them, disagree with them, glorify or vilify them. About the only thing you

can’t do is ignore them. Because they change things. They push the

human race forward. And while some may see them as the crazy

ones, we see genius. Because the people who are crazy enough to

think they can change the world, are the ones who do.

כותרת

.left = 30

.trailing = 30

Page 57: KKBOX WWDC17 UIKit - QQ

NEW

Here’s to the crazy ones. The misfits. The rebels. The troublemakers. The round pegs in the square holes. The ones who see things differently. They’re not fond of rules. And they have no respect for the status quo. You can quote them, disagree with them, glorify or vilify them. About the only thing you can’t do is ignore them. Because they change things. They push the human race forward. And while some may see them as the crazy ones, we see genius. Because the

Title

systemMinimumLayoutMargins

directionalLayoutMargins

class MyViewController: UIViewController { override func viewDidLoad() { viewRespectsSystemMinimumLayoutMargins = true // default

} }

Page 58: KKBOX WWDC17 UIKit - QQ

safeAreaInsets.bottom

safeAreaInsets.top

Page 59: KKBOX WWDC17 UIKit - QQ

Safe Area

Describes area of view not occludedby ancestors

Available as insets or layout guide

Incorporates overscan compensation insets

NEW

UIView.safeAreaInsets

Page 60: KKBOX WWDC17 UIKit - QQ

Safe Area

Describes area of view not occludedby ancestors

Available as insets or layout guide

Incorporates overscan compensation insets

NEW

UIView.safeAreaLayoutGuide

Page 61: KKBOX WWDC17 UIKit - QQ

Safe Area

Describes area of view not occludedby ancestors

Available as insets or layout guide

Incorporates overscan compensation insets

NEW

UIScreen.overscanCompensationInsets

Page 62: KKBOX WWDC17 UIKit - QQ

Extending the Safe Area Insets

UIViewController.additionalSafeAreaInsets UIView.safeAreaInsetsDidChange() UIViewController.viewSafeAreaInsetsDidChange()

NEW

Page 63: KKBOX WWDC17 UIKit - QQ

TitleHere’s to the crazy ones. The misfits. The rebels. The troublemakers. The round pegs in the square holes. The ones who see things differently. They’re not fond of rules. And they have no respect for the status quo. You can quote them, disagree with them, glorify or vilify them. About the only thing you can’t do is ignore them. Because they change things. They push the human race forward. And while some may see them as the crazy ones, we see genius. Because the people who are crazy enough to think they can change the world, are the ones who do.

NEW

101 words • Modified today

adjustedContentInset.topcontentInset.top

Page 64: KKBOX WWDC17 UIKit - QQ

Safe Area Insets

class UIScrollView {

var contentInsetAdjustmentBehavior: UIScrollViewContentInsetAdjustmentBehavior

var adjustedContentInset: UIEdgeInsets { get }

}

Page 65: KKBOX WWDC17 UIKit - QQ

101 words • Modified today

NEWTitleHere’s to the crazy ones. The misfits. The rebels. The troublemakers. The round pegs in the square holes. The ones who see things differently. They’re not fond of rules. And they have no respect for the status quo. You can quote them, disagree with them, glorify or vilify them. About the only thing you can’t do is ignore them. Because they change things. They push the human race forward. And while some may see them as the crazy ones, we see genius. Because the people who are crazy enough to think they can change the world, are the ones who do.

contentLayoutGuidePage 1

frameLayoutGuide

Page 66: KKBOX WWDC17 UIKit - QQ

Self-Sizing by Default

Link on iOS 11, all estimated heights default to UITableViewAutomaticDimension

Headers, footers, and cells use self-sizing by default

iOS only—behavior is not changed on tvOS

Ensure all views have sufficient internal constraints

Return fixed sizes from delegate methods

NEW

Page 67: KKBOX WWDC17 UIKit - QQ

Opting Out of New Behavior

Set table view estimated height properties to zero

Also disables self-sizing

override func viewDidLoad() { tableView.estimatedRowHeight = 0 tableView.estimatedSectionHeaderHeight = 0 tableView.estimatedSectionFooterHeight = 0 }

NEW

Page 68: KKBOX WWDC17 UIKit - QQ

separatorInset.left = 60

class MyViewController: UITableViewController { override func viewDidLoad() { tableView.separatorInsetReference = .fromCellEdges // default

} }

Table view cell

NEW

Page 69: KKBOX WWDC17 UIKit - QQ

separatorInset.left = 60

class MyViewController: UITableViewController { override func viewDidLoad() { tableView.separatorInsetReference = .fromAutomaticInsets

} }

Table view cell

NEW

Page 70: KKBOX WWDC17 UIKit - QQ

Swipe Actions

New look-and-feel automatically for all table views

Supports full swipe-to-delete for iOS 11-linked apps

New features with API adoption • Images • Leading and trailing actions • Completion handler and cancellation

NEW

Page 71: KKBOX WWDC17 UIKit - QQ

Advanced Animations With UIKit

Page 72: KKBOX WWDC17 UIKit - QQ

UIViewPropertyAnimator Features

Custom timing

Interactive

Interruptible

Responsive

Page 73: KKBOX WWDC17 UIKit - QQ

UIViewPropertyAnimator

let animator = UIViewPropertyAnimator(duration: 2.5, curve: .linear) { circle.frame = circle.frame.offsetBy(dx: 100, dy: 0) } animator.startAnimation()

0 100x

Page 74: KKBOX WWDC17 UIKit - QQ

Progress 1.0

0.0 1.0

0.5

0.5 Time

Ease In Ease Out

.easeIn

1.0

0.0 1.0

0.5

0.5

.easeOut

Timing Curves

Page 75: KKBOX WWDC17 UIKit - QQ

UICubicTimingParameters(controlPoint1: CGPoint(x: 0.75, y: 0.1), controlPoint2: CGPoint(x: 0.9, y: 0.25))

(0.75, 0.1)

(0.9, 0.25)

Custom Curves

Progress

Custom Ease In

1.0

0.0 1.0

0.5

0.5 Time

Page 76: KKBOX WWDC17 UIKit - QQ

•Interactively Animating

Page 77: KKBOX WWDC17 UIKit - QQ

var animator: UIViewPropertyAnimator!

func handlePan(recognizer: UIPanGestureRecognizer) { switch recognizer.state { case .began: animator = UIViewPropertyAnimator(duration: 1, curve: .easeOut, animations: { circle.frame = circle.frame.offsetBy(dx: 100, dy: 0) }) animator.pauseAnimation() case .changed: let translation = recognizer.translation(in: circle) animator.fractionComplete = translation.x / 100 case .ended: animator.continueAnimation(withTimingParameters: nil, durationFactor: 0) } }

Page 78: KKBOX WWDC17 UIKit - QQ

1.0

0.0 1.0

0.5

0.5

animator.fractionComplete = translation.x / distance

Progress

Time

Page 79: KKBOX WWDC17 UIKit - QQ

1.0

0.0 1.0

0.5

0.5

animator.fractionComplete = translation.x / distance

Progress

Time

Page 80: KKBOX WWDC17 UIKit - QQ

1.0

0.0 1.0

0.5

0.5

Progress

Time

animator.continueAnimation(withTimingParameters: nil, durationFactor: 0)

running true

fractionComplete 10%

animationState .active

Page 81: KKBOX WWDC17 UIKit - QQ

•New Animator Behaviors

Page 82: KKBOX WWDC17 UIKit - QQ

UIViewPropertyAnimator New in iOS 11

var scrubsLinearly: Bool var pausesOnCompletion: Bool

NEW

Page 83: KKBOX WWDC17 UIKit - QQ

.Inactive

Animations finish

.pausesOnCompletion

.Active

Start / pause

animator.addObserver(self, forKeyPath: "running", options: [.new], context: nil)

Page 84: KKBOX WWDC17 UIKit - QQ

Starting as Paused

let animator = UIViewPropertyAnimator(duration: 1, curve: .easeIn) animator.startAnimation() // ... animator.addAnimations { // will run immediately circle.frame = circle.frame.offsetBy(dx: 100, dy: 0) }

No escaping for animation blocks

NEW

Page 85: KKBOX WWDC17 UIKit - QQ

.cornerRadius Now animatable in UIKit

CALayer var .cornerRadius: CGFloat

circle.clipsToBounds = true UIViewPropertyAnimator(duration: 1, curve: .linear) { circle.layer.cornerRadius = 12 }.startAnimation()

NEW

Page 86: KKBOX WWDC17 UIKit - QQ

.maskedCorners New in iOS 11

CALayer var .maskedCorners: CACornerMask

circle.layer.maskedCorners = [.layerMinXMinYCorner, .layerMaxXMinYCorner]

NEW

Page 87: KKBOX WWDC17 UIKit - QQ

Thank You