plugin-103 cocoa auto layout

64
These are confidential sessions—please refrain from streaming, blogging, or taking pictures Session 103 Cocoa Autolayout Ken Ferry Cocoa Frameworks 1

Upload: nicolas-candiano

Post on 20-Feb-2015

216 views

Category:

Documents


5 download

TRANSCRIPT

Page 1: Plugin-103 Cocoa Auto Layout

These are confidential sessions—please refrain from streaming, blogging, or taking pictures

Session 103

Cocoa Autolayout

Ken FerryCocoa Frameworks

1

Page 2: Plugin-103 Cocoa Auto Layout

Layout

2

Page 3: Plugin-103 Cocoa Auto Layout

Springs and Struts

3

Page 4: Plugin-103 Cocoa Auto Layout

AutolayoutSprings and Struts

4

Page 5: Plugin-103 Cocoa Auto Layout

Autolayout

5

Page 6: Plugin-103 Cocoa Auto Layout

Autolayout

6

Page 7: Plugin-103 Cocoa Auto Layout

Benefits

• Reduced need for in-code layout—IB goes further

• Improved in-code layout• Design flexibility• Localization• Resolution independence

7

Page 8: Plugin-103 Cocoa Auto Layout

Basics

Runtime

Layering

Debugging

Transition

Agenda

8

Page 9: Plugin-103 Cocoa Auto Layout

Interface Builder: Simplicity and expressivenessDemo

Kevin CatheyInterface Builder

9

Page 10: Plugin-103 Cocoa Auto Layout

Guide -> NSLayoutConstraint

10

Page 11: Plugin-103 Cocoa Auto Layout

y = m·x + b

11

Page 12: Plugin-103 Cocoa Auto Layout

view1.attr1 = m·view2.attr2 + b=

12

Page 13: Plugin-103 Cocoa Auto Layout

view1.attr1 = m·view2.attr2 + b=

acceptButton.left = cancelButton.right + 12

13

Page 14: Plugin-103 Cocoa Auto Layout

view1.attr1 = m·view2.attr2 + b=≥≤

@ priority

14

Page 15: Plugin-103 Cocoa Auto Layout

[NSLayoutConstraint constraintWithItem: attribute: relatedBy: toItem: attribute: multiplier: constant: ]

15

Page 16: Plugin-103 Cocoa Auto Layout

[NSLayoutConstraint constraintWithItem:acceptButton attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEquals toItem:cancelButton attribute:NSLayoutAttributeRight multiplier:1.0 constant:12]

16

Page 17: Plugin-103 Cocoa Auto Layout

ASCII Art!

17

Page 18: Plugin-103 Cocoa Auto Layout

Cancel Accept

18

Page 19: Plugin-103 Cocoa Auto Layout

Cancel Accept

19

Page 20: Plugin-103 Cocoa Auto Layout

[cancelButton]-[acceptButton]

20

Page 21: Plugin-103 Cocoa Auto Layout

[NSLayoutConstraint constraintsWithVisualFormat:@”[cancelButton]-[acceptButton]”_

options:0 metrics:nil views:viewsDictionary];

21

Page 22: Plugin-103 Cocoa Auto Layout

[cancelButton _]-[acceptButton]

22

Page 23: Plugin-103 Cocoa Auto Layout

[cancelButton _]- [acceptButton ]-

23

Page 24: Plugin-103 Cocoa Auto Layout

[cancelButton(72)]-12-[acceptButton(50)]

24

Page 25: Plugin-103 Cocoa Auto Layout

[cancelButton(72)]-12-[acceptButton(50)]

viewpredicate

connection

25

Page 26: Plugin-103 Cocoa Auto Layout

Standard Space

Inequality, Priority

Connection to Superview

Vertical Layout

Flush Views, Equal Widths

Multiple Predicates

Combination

[button]-[textField]

[wideView(>=60@700)]

|-5-[contentView]-5-|

V:[topView]-10-[bottomView]

[redBox][yellowBox(==redBox)]

[flexibleView(>=30,<=80)]

|-[Find]-[FindNext]-[FindField(>=20)]-|

Visual Format Language

[button]-[textField]

8 pts

26

Page 27: Plugin-103 Cocoa Auto Layout

Standard Space

Inequality, Priority

Connection to Superview

Vertical Layout

Flush Views, Equal Widths

Multiple Predicates

Combination

[button]-[textField]

[wideView(>=60@700)]

|-5-[contentView]-5-|

V:[topView]-10-[bottomView]

[redBox][yellowBox(==redBox)]

[flexibleView(>=30,<=80)]

|-[Find]-[FindNext]-[FindField(>=20)]-|

Visual Format Language

wideView

60 pts[wideView(>=60@700)]

27

Page 28: Plugin-103 Cocoa Auto Layout

Standard Space

Inequality, Priority

Connection to Superview

Vertical Layout

Flush Views, Equal Widths

Multiple Predicates

Combination

[button]-[textField]

[wideView(>=60@700)]

|-5-[contentView]-5-|

V:[topView]-10-[bottomView]

[redBox][yellowBox(==redBox)]

[flexibleView(>=30,<=80)]

|-[Find]-[FindNext]-[FindField(>=20)]-|

Visual Format Language

contentView 5 pts5 pts

superview

|-5-[contentView]-5-|

28

Page 29: Plugin-103 Cocoa Auto Layout

Standard Space

Inequality, Priority

Connection to Superview

Vertical Layout

Flush Views, Equal Widths

Multiple Predicates

Combination

[button]-[textField]

[wideView(>=60@700)]

|-5-[contentView]-5-|

V:[topView]-10-[bottomView]

[redBox][yellowBox(==redBox)]

[flexibleView(>=30,<=80)]

|-[Find]-[FindNext]-[FindField(>=20)]-|

Visual Format Language

topView

10 pts

bottomView

V:[topView]-10-[bottomView]

29

Page 30: Plugin-103 Cocoa Auto Layout

Standard Space

Inequality, Priority

Connection to Superview

Vertical Layout

Flush Views, Equal Widths

Multiple Predicates

Combination

[button]-[textField]

[wideView(>=60@700)]

|-5-[contentView]-5-|

V:[topView]-10-[bottomView]

[redBox][yellowBox(==redBox)]

[flexibleView(>=30,<=80)]

|-[Find]-[FindNext]-[FindField(>=20)]-|

Visual Format Language

redBox yellowBox

[redBox][yellowBox(==redBox)]

30

Page 31: Plugin-103 Cocoa Auto Layout

Standard Space

Inequality, Priority

Connection to Superview

Vertical Layout

Flush Views, Equal Widths

Multiple Predicates

Combination

[button]-[textField]

[wideView(>=60@700)]

|-5-[contentView]-5-|

V:[topView]-10-[bottomView]

[redBox][yellowBox(==redBox)]

[flexibleView(>=30,<=80)]

|-[Find]-[FindNext]-[FindField(>=20)]-|

Visual Format Language

flexibleView

30 pts80 pts

[flexibleView(>=30,<=80)]

31

Page 32: Plugin-103 Cocoa Auto Layout

Standard Space

Inequality, Priority

Connection to Superview

Vertical Layout

Flush Views, Equal Widths

Multiple Predicates

Combination

[button]-[textField]

[wideView(>=60@700)]

|-5-[contentView]-5-|

V:[topView]-10-[bottomView]

[redBox][yellowBox(==redBox)]

[flexibleView(>=30,<=80)]

|-[Find]-[FindNext]-[FindField(>=20)]-|

Visual Format Language

superview

8 pts8 pts 20 pts20 pts20 pts

|-[Find]-[FindNext]-[FindField(>=20)]-|

32

Page 33: Plugin-103 Cocoa Auto Layout

viewsDictionary

[NSLayoutConstraint constraintsWithVisualFormat:@”[cancelButton]-[acceptButton]”_

options:0 metrics:nil views: ];viewsDictionary

33

Page 34: Plugin-103 Cocoa Auto Layout

(gdb) po viewsDictionary{ acceptButton = "<NSButton: 0x4004c8660>"; cancelButton = "<NSButton: 0x4004a9ec0>";}

34

Page 35: Plugin-103 Cocoa Auto Layout

Basics

Runtime

Layering

Debugging

Transition

Agenda

35

Page 36: Plugin-103 Cocoa Auto Layout

Constraints at Runtime

-[NSView addConstraint:]-[NSView removeConstraint:] Superview

Button Button

36

Page 37: Plugin-103 Cocoa Auto Layout

Phases of Display

Display

37

Page 38: Plugin-103 Cocoa Auto Layout

Phases of Display

Display

38

Page 39: Plugin-103 Cocoa Auto Layout

Phases of Display

DisplayLayoutUpdate Constraints

39

Page 40: Plugin-103 Cocoa Auto Layout

Display

-[NSWindow displayIfNeeded]

-[NSView displayIfNeeded]

-[NSView drawRect:]

-[NSView needsDisplay]

-[NSView setNeedsDisplay:]

Update Constraints

-[NSWindow updateConstraintsIfNeeded]

-[NSView updateConstraintsForSubtreeIfNeeded]

-[NSView updateConstraints]

-[NSView needsUpdateConstraints]

-[NSView setNeedsUpdateConstraints:]

Phases of Display

Layout

-[NSWindow layoutIfNeeded]

-[NSView layoutSubtreeIfNeeded]

-[NSView layout]

-[NSView needsLayout]

-[NSView setNeedsLayout:]

40

Page 41: Plugin-103 Cocoa Auto Layout

Layout PhaseCalls -[NSView setFrame:]

• Code should modify constraints, not frames

41

Page 42: Plugin-103 Cocoa Auto Layout

Mutation and Animation

[NSAnimationContext!beginGrouping];[[NSAnimationContext!currentContext]!setDuration:1.0];[[constraint!animator]!setConstant:800];[NSAnimationContext!endGrouping];

42

Page 43: Plugin-103 Cocoa Auto Layout

Basics

Runtime

Layering

Debugging

Transition

Agenda

43

Page 44: Plugin-103 Cocoa Auto Layout

View vs Controller Responsibilities Reworking the layering

• setFrame: is monolithic■ If view state changes, layout never updates

• Controller layer has to know a lot about visual design of views

44

Page 45: Plugin-103 Cocoa Auto Layout

Baselines

• NSView:-(CGFloat)baselineOffsetFromBottom;

45

Page 46: Plugin-103 Cocoa Auto Layout

Alignment Rect

46

Page 47: Plugin-103 Cocoa Auto Layout

Alignment Rect

• NSView:- (NSEdgeInsets)alignmentRectInsets;

47

Page 48: Plugin-103 Cocoa Auto Layout

Intrinsic Content Size

• Intrinisic Content Size declares size of content■ Invalidate when attributes change

• Inverts classic Cocoa sizeToFit■ Greatly reduces burden on controller layer■ Lets view layer vary independently■ Makes work done in Interface Builder go further

48

Page 49: Plugin-103 Cocoa Auto Layout

Intrinsic Content Size

• External controller knows more about importance

-setContentCompressionResistancePriority:forOrientation:

-setContentHuggingPriority:forOrientation:

49

Page 50: Plugin-103 Cocoa Auto Layout

Intrinsic Content Size vs Fitting Size

Intrinsic Content Size Fitting Size

Override Call

Feeds data into layout system

Takes data out of layout system

50

Page 51: Plugin-103 Cocoa Auto Layout

Basics

Runtime

Layering

Debugging

Transition

Agenda

51

Page 52: Plugin-103 Cocoa Auto Layout

Working with Autolayout in codeDemo

Ken FerryCocoa Frameworks

52

Page 53: Plugin-103 Cocoa Auto Layout

Debugging

• Find bad view frame-NSShowAllViews YES

-[NSView _subtreeDescription]

• Bad view frame -> bad constraint-[NSView constraintsAffectingLayout:forOrientation:]

-[NSWindow visualizeConstraints:]

• Bad constraint -> bad code■ Instruments template, “Cocoa Layout”

53

Page 54: Plugin-103 Cocoa Auto Layout

Debugging

54

Page 55: Plugin-103 Cocoa Auto Layout

Basics

Runtime

Layering

Debugging

Transition

Agenda

55

Page 56: Plugin-103 Cocoa Auto Layout

Transition-[NSView translatesAutoresizingMaskIntoConstraints]

56

Page 57: Plugin-103 Cocoa Auto Layout

TransitionAutolayout activates lazily

LayoutUpdate Constraints Display

57

Page 58: Plugin-103 Cocoa Auto Layout

TransitionAutolayout activates lazily

LayoutUpdate Constraints Display

58

Page 59: Plugin-103 Cocoa Auto Layout

TransitionAutolayout activates lazily

LayoutUpdate Constraints Display

59

Page 60: Plugin-103 Cocoa Auto Layout

Review• Reduced need for in-code layout

■ Constraints accommodate dynamic content

• Improved in-code layout■ ASCII art, improved layering

• Design flexibility■ Baselines, alignment rect, intrinsic content size

• Localization■ Dynamic content, intrinsic content size

• Expressiveness■ Peer to peer relationships, inequalities, priority

60

Page 61: Plugin-103 Cocoa Auto Layout

Bill DudneyCocoa [email protected]

Autolayout Documentation, Sample Code, and Release NotesLog in and search for ‘Autolayout’ on Mac Dev Centerhttps://developer.apple.com/library/prerelease/mac/search/?q=Autolayout

Programming With ConstraintsThe Cassowary Linear Arithmetic Constraint Solving Algorithm http://www.cs.washington.edu/research/constraints/cassowary/

Apple Developer Forumshttp://devforums.apple.com

More Information

61

Page 62: Plugin-103 Cocoa Auto Layout

Using Interface Builder in Xcode Pacific HeightsTuesday 2:00PM

Related Sessions

62

Page 63: Plugin-103 Cocoa Auto Layout

Labs

Cocoa Lab App Frameworks Lab ATuesday 2:00-6:00PM

Cocoa and Autolayout Lab App Frameworks Lab AWednesday 9:00-11:00AM

Cocoa, Full Screen, and Aqua Lab App Frameworks Lab AWednesday 2:00-6:00PM

Cocoa, Auto Save, File Coordination, and Resume Lab App Frameworks Lab AThursday 2:00-4:00PM

63

Page 64: Plugin-103 Cocoa Auto Layout

64