Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Layout without Auto Layout
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Elvis Shi
May 23, 2017
Programming
440
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Layout without Auto Layout
Elvis Shi
May 23, 2017
More Decks by Elvis Shi
See All by Elvis Shi
為什麼你並不需要ViewModel / No, you don't need a ViewModel
lovee
1
510
@Environment(\.keyPath)那么好我不允许你们不知道! / atEnvironment keyPath is so good and you should know it!
lovee
0
520
ゼロから始めるPreferenceの実装 / Let's implement Preferences from scratch
lovee
0
160
Kotlin エンジニアへ送る:Swift 案件に参加させられる日に備えて~似てるけど色々違う Swift の仕様 / from Kotlin to Swift
lovee
1
400
個人アプリを2年ぶりにアプデしたから褒めて / I just updated my personal app, praise me!
lovee
0
760
How did I build an Open-Source SwiftUI Toast Library
lovee
1
180
SwiftUIで使いやすいToastの作り方 / How to build a Toast system which is easy to use in SwiftUI
lovee
3
1.3k
SwiftUIで二重スクロール作ってみた / When I tried to make a dual-scroll-ish view in SwiftUI
lovee
1
390
Observation のあれこれ / A brief introduction about Observation
lovee
3
450
Other Decks in Programming
See All in Programming
Flow は今どうなっているか
mizdra
PRO
0
710
「人を評価する AI」の設計と実装
ryoyanara
0
240
片田舎のおっさん、 Swift Buildのダイアモンド問題解決の不具合修正PRを出すが、解決方法がキャッシュをしないようにすることであり、ビルド時間が伸びると言われてマージされないので高速化もする/swiftbuild
yimajo
0
280
Cloudflare is Agents
chimame
0
180
jsmini JavaScript Engine を作ってみた話
yosuke_furukawa
PRO
0
350
Webエンジニアなのにブラウザの仕組みがわからないので、Pythonで自作してみた
tatsuki12
4
1.1k
ドリフトを絶対に許さない(?)CDK運用 / CDK Ops with Zero Tolerance for Drifts (?)
akihisaikeda
1
230
DynamoDBの基礎を振り返りながらベクトル検索機能を理解する
musan
2
200
AIに既存システムを理解させる技術 ~レガシーを見捨てないハーネスエンジニアリング入門~
ochtum
0
150
リアルな遅延を測る仕様
kota_yata
1
130
引き算の組織 ― アウトカムとAIに全振りするために辞めたこと ― / Organization by Subtraction
hirokiyamamoto14
PRO
0
300
関東Kaggler会_NVIDIA_Nemotron_コンペ_振り返り
rick_ds
0
720
Featured
See All Featured
VelocityConf: Rendering Performance Case Studies
addyosmani
331
25k
Test your architecture with Archunit
thirion
2
2.4k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
360
30k
Fireside Chat
paigeccino
42
4k
HTML-Aware ERB: The Path to Reactive Rendering @ RubyCon 2026, Rimini, Italy
marcoroth
4
490
How to train your dragon (web standard)
notwaldorf
97
6.8k
Stewardship and Sustainability of Urban and Community Forests
pwiseman
0
490
Site-Speed That Sticks
csswizardry
13
1.5k
Neural Spatial Audio Processing for Sound Field Analysis and Control
skoyamalab
0
410
Noah Learner - AI + Me: how we built a GSC Bulk Export data pipeline
techseoconnect
PRO
0
400
How To Speak Unicorn (iThemes Webinar)
marktimemedia
1
560
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
162
16k
Transcript
Layout without Auto Layout for SwiftѪձ vol19
override init() { super.init() emplyedBy = "MAGES. 5pb. Game div"
job = "iOS Developer" twitter = "@lovee" qiita = "@lovee" github = "el-hoshino" additionalInfo = "HITMAN ಈը໘ന͗ͯ͢ਐḿμϝͰ͢ʘ(^o^)ʗ" class Speaker: Developer { } }
গͰ ࣗ༝ʹൃදͰ͖Δ Swift Ѫձʹ ѹతײँ !
ࠓ·Ͱͷ Auto Layout dis
ࠓ·Ͱͷ Auto Layout dis
▸ Θ͔ΓͮΒ͍ ▸ σόοάͮ͠Β͍ ▸ ώΤϥϧΩʔ͕ͳ͍←͜Ε "VUP-BZPVUƎƇŧƉčἠದƑۋམƊżĎ Why Not Auto
Layout?
▸ Θ͔ΓͮΒ͍ ▸ σόοάͮ͠Β͍ ▸ ώΤϥϧΩʔ͕ͳ͍←͜Ε ▸ SnapKit ͱ͔Λ͏ख͋Δ͚ͲͬͺԶ AutoLayout
͕ ݏ͍ͩʂ Why Not Auto Layout?
▸ UIView ͷ layoutSubviews ΛΦʔόʔϥΠυ ▸ subviews ͷ frame Λઃఆ
▸ transform Λઃఆͨ͠߹ bounds.size / center ͷํΛઃఆ ▸ ࣗͷ frame ࣗͰઃఆ͠ͳ͍ʂ ▸ ඞཁʹԠͯ͡ setNeedsLayout() ͔ layoutIfNeeded() ΛݺͿ ▸ layoutSubviews() Λݺͳ͍ʂ ίʔυͰϨΠΞτͷεεϝ
▸ ඳըαΠΫϧͰ UIView ͷ layout ϑϥάΛࢹ ▸ layout ϑϥάΛཱͨͤΔ ▸
࣍ͷඳըαΠΫϧͰϑϥάཱ͕͍ͬͯΔ͜ͱ͕֬ೝ͞ΕɺlayoutSubviews() ͕ݺΕΔ ▸ layout ϑϥάΛཱͨͤΔखஈɿ ▸ ࣗͷ initʢͨΓલʣ ▸ ࣗͷ addSubviewʢͨΓલʣ ▸ subview ͷ frame ͷ setʢʮsubviewʯ ʹҙʂʣ ▸ setNeedsLayout() ΛݺͿ ▸ ͦͷଞ ▸ layoutIfNeeded() ΛݺͿͱ layout ϑϥάཱ͕͍ͬͯΕ͙͢ϨΠΞτ͢Δ ▸ ͭ·Γཱͬͯͳ͚ΕϨΠΞτ͠ͳ͍ʂ ▸ Ξχϝʔγϣϯͷ߹ setNeedsLayout() ݺΜͩޙΞχϝʔγϣϯઃఆʹ layoutIfNeeded() Λݺ͍͍ ※ࢀߟɿhttp://blog.logichigh.com/2011/03/16/when-does-layoutsubviews-get-called/ ϨΠΞτͷྲྀΕʢུ֓ʣ
▸ ඳըαΠΫϧͰ UIView ͷ layout ϑϥάΛࢹ ▸ layout ϑϥάΛཱͨͤΔ ▸
࣍ͷඳըαΠΫϧͰϑϥάཱ͕͍ͬͯΔ͜ͱ͕֬ೝ͞ΕɺlayoutSubviews() ͕ݺΕΔ ▸ layout ϑϥάΛཱͨͤΔखஈɿ ▸ ࣗͷ initʢͨΓલʣ ▸ ࣗͷ addSubviewʢͨΓલʣ ▸ subview ͷ frame ͷ setʢʮsubviewʯ ʹҙʂʣ ▸ setNeedsLayout() ΛݺͿ ▸ ͦͷଞ ▸ layoutIfNeeded() ΛݺͿͱ layout ϑϥάཱ͕͍ͬͯΕ͙͢ϨΠΞτ͢Δ ▸ ͭ·Γཱͬͯͳ͚ΕϨΠΞτ͠ͳ͍ʂ ▸ Ξχϝʔγϣϯͷ߹ setNeedsLayout() ݺΜͩޙΞχϝʔγϣϯઃఆʹ layoutIfNeeded() Λݺ͍͍ ※ࢀߟɿhttp://blog.logichigh.com/2011/03/16/when-does-layoutsubviews-get-called/ ϨΠΞτͷྲྀΕʢུ֓ʣ
ࣗͷ frame ࣗͰઃఆ͠ͳ͍ʂ ▸ UIKit ͷΈ্ɺࣗͷ frame ͷมߋϏϡʔͷ layout ϑϥάΛཱͨͤΔ͜ͱʹͳΓɺϏϡʔͷ
layout ઃఆͰ· ͨࣗͷ frame มߋ͕ߦΘΕΔͷͰɺඇޮ͚ͩͰͳ͘ɺ ߹ʹΑͬͯແݶϧʔϓʹͳΔڪΕ͋Δɻ ▸ ઃܭ্ɺࣗͷ frame ͋͘·Ͱ͔Βݟͨ߹ͷॴͱ େ͖͞ͳͷͰɺมߋͷݖݶΛ͖࣋ͭࣗͰͳ͘ɻ ϨΠΞτͷྲྀΕʢུ֓ʣ
layoutSubviews ͷΦʔόʔϥΠυ͕ਏ͍ ▸ UIView ΛαϒΫϥε͠ͳ͍ͱ͍͚ͳ͍ ▸ UIView ΛαϒΫϥεͯ͠ subview ͱ
layout ใͷؔ࿈͚͕؆୯ʹͰ ͖ΔͱݶΒͳ͍ ▸ subview Λ UIView ͷϓϩύςΟʔͱͯ͠ઃఆ͠ͳ͚ΕͳΒͳ͍ ▸ ͳͷʹଟ͘ͷ߹ subview Λ࡞ΔͷࣗͰͳ͍ʢओʹ UIViewControllerʣ ▸ layoutSubviews() ϝιου͕ΒΜͰಡΈͮΒ͍"
NotAutoLayout ※Download from here: https://github.com/el-hoshino/NotAutoLayout
None
None
None
NotAutoLayout ͷεεϝ 1.NotAutoLayout ରԠͷϏϡʔΛ࡞Δ 2.Ϗϡʔ͕ Layout Λ࡞Δ 3.ࢠϏϡʔΛՃͯ͠ઌ΄Ͳ࡞ͬͨ Layout ʹؔ࿈͚ͤ͞Δ
NotAutoLayout ରԠͷϏϡʔΛ࡞Δ let baseView = LayoutView(frame: CGRect(x: 0, y: 0,
width: 320, height: 568)) class BaseView: LayoutView { // ... } let baseView = BaseView(frame: CGRect(x: 0, y: 0, width: 320, height: 568)) public class BaseView: UIScrollView, LayoutControllable { public var layoutInfo: [LayoutControllable.Hash: [LayoutMethod]] = [:] public var orderInfo: [LayoutControllable.Hash : Int] = [:] public var zIndexInfo: [LayoutControllable.Hash: Int] = [:] public var layoutOptimization: LayoutOptimization = .sequence override public func layoutSubviews() { super.layoutSubviews() self.layoutControl() } // ... } let baseView = BaseView(frame: CGRect(x: 0, y: 0, width: 320, height: 568))
Ϗϡʔ͕ Layout Λ࡞Δ let layout = Layout.makeRelative(frame: CGRect(x: 0.2, y:
0.2, width: 0.6, height: 0.6)) let layout = Layout.makeInsets(insets: UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 10)) let layout = Layout.makeCustom { (boundSize) -> Frame in return Frame(x: 0, from: .center, y: boundSize.height * 0.2, from: .top, width: 300, height: boundSize.height * 0.8) } ͳͲͳͲ…
ࢠϏϡʔΛՃͯ͠ઌ΄Ͳ࡞ͬͨ Layout ʹؔ࿈͚ͤ͞Δ baseView.addSubview(subview, constantLayout: layout) baseView.addSubview(subview, constantLayout: layout, order:
0, zIndex: -1)
DEMO
Frame ܕ ▸ CGRect ܕͱࣅͨΑ͏ͳͷ ▸ CGRect ʹʮج४ʢReferencePointʣʯͱ͍͏֓೦ΛՃ ▸ ج४ʹʮ.leftTopʯʮ.middleCenterʯͳͲͷ
9 ύλʔϯ Frame(x: 0, from: .center, y: 20, from: .top, width: 320, height: 480) ※NotAutoLayout Ͱʮج४ʯϏϡʔͱࢠϏϡʔ྆ํʹద༻͢Δɻ
Frame ܕ Frame(x: 0, from: .center, y: 20, from: .top,
width: 320, height: 480) 0 20 Frame(x: -20, from: .right, y: 0, from: .bottom, width: 320, height: 480) 0 -20 Frame(x: 0, from: .left, y: 0, from: .top, width: 320, height: 480) 0 0
ଞʹͨ͘͞Μ͋ΔͷͰ ͥͻݟͯΈ͍ͯͩ͘͞