lviv md day 2015 Костянтин Бичков "ios autolayouts – це добре!"

32
iOS Autolayouts Konstantin Bychkov @xnekoix http://www.ciklum.com

Upload: lviv-startup-club

Post on 29-Jan-2018

223 views

Category:

Business


0 download

TRANSCRIPT

Page 1: Lviv MD Day 2015 Костянтин Бичков "iOS Autolayouts – це добре!"

iOS Autolayouts

Konstantin Bychkov @xnekoix http://www.ciklum.com

Page 2: Lviv MD Day 2015 Костянтин Бичков "iOS Autolayouts – це добре!"

Main Layout approaches

Springs & StrutsAutolayoutsStackViewReactiveCocoaLayoutComponentKit

Page 3: Lviv MD Day 2015 Костянтин Бичков "iOS Autolayouts – це добре!"

Springs & Struts

frame absolute positioningautoresizing masks

Page 4: Lviv MD Day 2015 Костянтин Бичков "iOS Autolayouts – це добре!"

Springs & Struts Pros

easy to understand how it works and easy to debugworks really fast

Page 5: Lviv MD Day 2015 Костянтин Бичков "iOS Autolayouts – це добре!"

Springs & Struts Cons

messy to work with complex dynamic layoutsimperativedifferent devices screen sizes adds more complexity to implementation

Page 6: Lviv MD Day 2015 Костянтин Бичков "iOS Autolayouts – це добре!"

ReactiveCocoaLayout

Allows to describe layouts in a reactive wayhttps://github.com/ReactiveCocoa/ReactiveCocoaLayout

Page 7: Lviv MD Day 2015 Костянтин Бичков "iOS Autolayouts – це добре!"

ReactiveCocoaLayout Pros

works fastanimations through ReactiveAnimationopen-sourcedeclarative

Page 8: Lviv MD Day 2015 Костянтин Бичков "iOS Autolayouts – це добре!"

ReactiveCocoaLayout Cons

alphano Interface Builder supportobjective-c

Page 9: Lviv MD Day 2015 Костянтин Бичков "iOS Autolayouts – це добре!"

ReactiveCocoaLayout Debatable

unidirectional layout update (top-down)(easier to debug / but harder to propagate changes upstream)ReactiveCocoa

Page 10: Lviv MD Day 2015 Костянтин Бичков "iOS Autolayouts – це добре!"

ComponentKit

From Facebook known for their react.jswhich was basically an inspiration for ComponentKit

Page 11: Lviv MD Day 2015 Костянтин Бичков "iOS Autolayouts – це добре!"

ComponentKit Pros

declarativeflex-box modelopen-source

Page 12: Lviv MD Day 2015 Костянтин Бичков "iOS Autolayouts – це добре!"

ComponentKit Cons

not supported anymore (but developers promised some swift implementation)no Interface Builder support

Page 13: Lviv MD Day 2015 Костянтин Бичков "iOS Autolayouts – це добре!"

ComponentKit Debatable

objective-c++

Page 14: Lviv MD Day 2015 Костянтин Бичков "iOS Autolayouts – це добре!"

Apple Autolayouts

Based on Cassowary constraint solving toolkit developed by Greg Badros and Alan Borning.

Page 15: Lviv MD Day 2015 Костянтин Бичков "iOS Autolayouts – це добре!"

y = a * x + b

Page 16: Lviv MD Day 2015 Костянтин Бичков "iOS Autolayouts – це добре!"

attribute1 = multiplier * attribute2 + constant

Page 17: Lviv MD Day 2015 Костянтин Бичков "iOS Autolayouts – це добре!"

attribute1 = multiplier * attribute2 + constant attribute1 >= multiplier * attribute2 + constant attribute1 <= multiplier * attribute2 + constant

Page 18: Lviv MD Day 2015 Костянтин Бичков "iOS Autolayouts – це добре!"

attribute1 = multiplier * attribute2 + constant @ priority attribute1 >= multiplier * attribute2 + constant @ priority attribute1 <= multiplier * attribute2 + constant @ priority

Page 19: Lviv MD Day 2015 Костянтин Бичков "iOS Autolayouts – це добре!"

Content Hugging / Compression Resistance

override func intrinsicContentSize() -> CGSize { return CGSize( width: 320, height: UIViewNoIntrinsicMetric) }

Page 20: Lviv MD Day 2015 Костянтин Бичков "iOS Autolayouts – це добре!"

H:[view1]-(>=100@500)-[view2]H:[view1]-(<=60@499)-[view2] - Still tries to satisfy inequality

Page 21: Lviv MD Day 2015 Костянтин Бичков "iOS Autolayouts – це добре!"

Intrinsic content size width = 200 height = 400Transforms to set of constraints H:[view(>=200@(Compression Resistance Priority))] H:[view(<=200@(Hugging Priority))] V:[view(>=400@(Compression Resistance Priority))] V:[view(<=400@(Hugging Priority))]

Page 22: Lviv MD Day 2015 Костянтин Бичков "iOS Autolayouts – це добре!"

Since iOS 8

Size classes (UITraitCollection)New attributesActivate/Deactivate constraints

Page 23: Lviv MD Day 2015 Костянтин Бичков "iOS Autolayouts – це добре!"

Since iOS 9

New attributesUIStackViewAnchorsUILayoutGuide

Page 24: Lviv MD Day 2015 Костянтин Бичков "iOS Autolayouts – це добре!"

StackView

Android linear layoutYou should definitely use it.

Page 25: Lviv MD Day 2015 Костянтин Бичков "iOS Autolayouts – це добре!"

Anchors

are constraint fabric

Page 26: Lviv MD Day 2015 Костянтин Бичков "iOS Autolayouts – це добре!"

UILayoutGuide

pretty good solution for some layout problemsnot supported in Interface Builder

Page 27: Lviv MD Day 2015 Костянтин Бичков "iOS Autolayouts – це добре!"

Good Layout principles:

Necessity and SufficiencyAdaptivity

Page 28: Lviv MD Day 2015 Костянтин Бичков "iOS Autolayouts – це добре!"

Apple Auto Layout Pros

DeclarativeInterface BuilderSwift

Page 29: Lviv MD Day 2015 Костянтин Бичков "iOS Autolayouts – це добре!"

Apple Auto Layout Cons

Slower then Springs & Struts

Page 30: Lviv MD Day 2015 Костянтин Бичков "iOS Autolayouts – це добре!"

Debug Sessioncommand alias objcpo po -l objc++ -O --

command alias objcexpr expr -l objc++ -O --po view.performSelector(_autolayoutTrace)objcpo [[UIWindow keyWindow] _autolayoutTrace] // prints layouts ambiguity

objcpo [view constraintsAffectingLayoutForAxis:0] // horizontal

objcpo [view constraintsAffectingLayoutForAxis:1] // vertical[view hasAmbiguousLayout] // BOOL

[view exerciseAmbiguityInLayout] // visualizing ambiguity

expr (void)[CATransaction flush]Facebook/Chisel

Page 31: Lviv MD Day 2015 Костянтин Бичков "iOS Autolayouts – це добре!"

QA

Page 32: Lviv MD Day 2015 Костянтин Бичков "iOS Autolayouts – це добре!"

Thanks!Materialshttps://www.objc.io/issues/3-views/advanced-auto-layout-toolbox/Apple WWDC sessionsApple iOS documentation

Exampleshttps://github.com/xNekOIx/talks/tree/master/StackView