2018/09/02 (日) iOSDC Japan 2018 その他関連資料はここらへんからたどれます。 http://akatsuki174.hatenablog.com/entry/20180820/1534723200
Auto LayoutΤϥʔஅॴ~ൃڰ͠ͳ͍ͨΊͷσόοάख๏~@akatsuki174iOSDC Japan 2018 2018/09/02()
View Slide
ࣗݾհ
• ਢ౻ຘʢ@akatsuki174ʣ• גࣜձࣾZaim / iOSΤϯδχΞ• iOSDC Japan 2018 ίΞελοϑ࠙ձͷຊञͷҰ෦ϫγ͕બΜͩ
ࠓͷ༰
͜Μͳ͓Έղܾ͠·͢• Τϥʔग़ͯΔ͚ͲԿ͔ΒखΛ͚͍͍͔ͯΘ͔Βͳ͍• ଞਓ͕࡞ͬͨϨΠΞτͷվम͕ා͍• ༏ઌͱ͔දࣔ/ඇදࣔͱ͔ෳࡶͰΘ͚͕Θ͔Βͳ͍• σόοάख๏͕ϚϯωϦԽ͖ͯͯ͠ɺܹ͕΄͍͠
࣍
• ࣄྫͱͱʹσόοάख๏ΛֶͿ• ίϯιʔϧϩάಡΉܥ• ϏδϡΞϧ͔Βஅ͢Δܥ• LLDB͏ܥ• ղܾͷࢳޱΛݟ͚ͭΔίπ
ࠓͷܗࣜ
• ϥΠϒσόοΪϯάͰਐΊ·͢• ͨ·ʹྫ͕ద͡Όͳ͍ͭɻڐͯ͠ɻ• εϥΠυࣗମεΫγϣ͖Ͱ͍͋͛ͯ·͢• αϯϓϧίʔυ• ฤͱղฤ͕͋Γ·͢• ղઆiOSDCޙՃ͍͖ͯ͠·͢• https://github.com/akatsuki174/AutoLayoutDebugSampleޭͨ͠Βഥखʂશ൛εϥΠυຕ
Let’s Debugging ٩( •̀ω•́)و
ίϯιʔϧϩάಡΉܥ
CASE 1.WarningΛؤுͬͯಡΉαϯϓϧίʔυ8BSOJOH7JFXΑΓɻ
WarningൃੜͷϚʔδϯ
Demo͜ͷষͷ͔͜͜ΒઌɺσϞͷεΫγϣΛషΓ͚ͨͷͰ͢
্͔ΒॱʹϩάͷҙຯΛ௫͏ʮಉ࣌ʹຬͨͤͳ੍͍͕͋ͬͨΑɻͨͿΜ͜ͷதͷগͳ͘ͱ1ͭͷ੍͕͍Βͳ͍͔ͭͩΒɺఆ֎ͷ੍Λݟ͚ͭͯɺ੍ͷ͚֎͠Λͯ͠Ͷɻʯ
ո͍͠ՕॴपลͷAuto Layoutใ͕දࣔ͞Ε͍ͯΔɻ͜ΕΛͺͬͱݟͯΘ͔ΔͳΒͦΕʹӽͨ͜͠ͱͳ͍ɻ্͔ΒॱʹϩάͷҙຯΛ௫͏
্͔ΒॱʹϩάͷҙຯΛ௫͏ͳΜͱͳ͘ɺਫฏํʹؔ͢Δهड़͕ଟͦ͏Ͱ͢ɻʮUIView-Encapsulated-Layout-xxxʯγεςϜ͕ੜ੍ͨ͠Ͱɺม͑Δ͜ͱͰ͖·ͤΜɻ1ͭͷϙΠϯτʹͳΓ·͢ɻ
ʮ͍͍͔Μ͡ʹදࣔ͢ΔͨΊʹ͜ͷ੍յͤͯ͞Βͬͨʂʯ͜ΕΛݟΔͱɺ͍͍ͩͨɾਫฏ / ਨͲͪΒͷ੍͕ؒҧ͍ͬͯΔͷ͔ɾͲͷपล͕ؒҧ͍ͬͯΔͷ͔͕Θ͔Δɻ্͔ΒॱʹϩάͷҙຯΛ௫͏
ʮσόοΨͰΩϟον͢ΔʹUIViewAlertForUnsatisfiableConstraintsͰγϯϘϦοΫϒϨʔΫϙΠϯτΛுͬͯͶɻUIConstraintBasedLayoutDebuggingΧςΰϦͷதʹ͋Δϝιουʹཱͭͱࢥ͏Αɻʯ্͔ΒॱʹϩάͷҙຯΛ௫͏
γεςϜͲ͔ͬͷUIView.width = 320ͷ੍Λউखʹ࡞ͬͨγεςϜUIProgressView.width = 355ͷ੍Λউखʹյ͓ͨ͠ɺͦ͏͍͑…ৼΓฦͬͯΈΔ
ৼΓฦͬͯΈΔ• ࠓ࣮ߦ͍ͯ͠ΔͷiPhone SEαΠζ• SEαΠζͷԣ෯320• ͜Εʹରͯ͠UIProgressView.width = 355 + ࠨӈϚʔδϯ͕ɹ֬อͰ͖ΔΘ͚͕ͳ͍…
ϨΠΞτΛݟ͢ແବʹԣ෯ͷ੍͕͍͍ͯͨͷͰআղܾ
CASE 2.WTF Auto Layout?Λ͏αϯϓϧίʔυ$PWFS7JFXΑΓɻ
WTF Auto Layout?https://www.wtfautolayout.com/
ղੳͰ͖ͳ͍͜ͱ͋Δ
࡞Γ͍ͨϨΠΞτ ←View←Label
Warningൃੜ
໌Β͔ʹ͓͔͍͠ʂʂ
͜ͷ੍͕ҙਤ௨Γ͡Όͳ͔ͬͨΒtranslatesAutoresizingMaskIntoConstraintsΛfalseʹͯ͠ΈͯͶʂ
ղܾ
CASE 3.IdentifierΛ͚ͯݟ͘͢͢Δαϯϓϧίʔυ$PWFS7JFXΑΓɻ
Veiwʹର͚ͯ͠Δ߹
੍ʹର͚ͯ͠Δ߹
CASE 4.੍Λग़ྗ͢Δαϯϓϧίʔυ4UBDL7JFXΑΓɻ
constraints()ΛͬͯΈΔ• ͋Δviewʹର͍͍ͯͯ͠Δ੍Λऔಘ͢Δ͜ͱ͕Ͱ͖Δ• ͱΓ͋͑ͣΑ͘Θ͔Μͳ͍ɺϫʔχϯάग़ͯͳ͍͚Ͳɹ ͳΜ͔͓͔͍࣌͠ʹͬͯΈΔ
constraintsAffectingLayout(for:)ΛͬͯΈΔ• ͋Δviewʹର͍͍ͯͯ͠Δ੍Λɺ࣠Λࢦఆͯ͠ɹऔಘ͢Δ͜ͱ͕Ͱ͖Δ• ҉తͳ੍ؚ·ΕΔ• ӨڹΛ༩͑Δશͯͷ੍͕औಘͰ͖Δอূͳ͍
͜ͷෳࡶͳviewͰࢼͯ͠ΈΑ͏stack view͍ͬͺ͍ͬͯ·͢
ࢼ͠ʹԿΤϥʔ͕ग़͍ͯͳ͍࣌ʹҰ൪Լʹ͋Δstack viewʹͲΜͳ੍͕͍͍ͯΔ͔ΛݟͯΈΔ
Ϙλϯλοϓ࣌ʹϒϨʔΫϙΠϯτͰࢭΊͯҰ൪Լͷstack viewͷconstraintsΛग़ྗɻਫฏ / ਨ྆ํͷ੍͕ग़ྗ͞ΕΔɻ
ಛఆͷ2ͭͷviewʹؔΘΔ੍ΛऔΓग़͍ͨ͠ͳΒ͜ΜͳϝιουΛ࡞͓ͬͯ͘ͱศར
Ұ൪Լͷstack viewͱself.viewؒʹ͋Δ੍Λग़ྗ
ͷviewͷਫฏํͷ੍͚ͩग़ྗ͍ͨ͠߹งғؾ͜Μͳ͔Μ͡
ͨͩ͠• ਫฏ / ਨ྆ํʹؔΘΔ੍͕·͔ͣͬͨ߹ɺɹ ͜ΕΛΔͱٯʹΘ͔Γʹ͍͘ɹ ྫʣAspect RatioͳͲ
CASE 5.γϯϘϦοΫϒϨʔΫϙΠϯτ
γϯϘϦοΫϒϨʔΫϙΠϯτͱ• ಛఆͷ݅ʹϚονͨ࣌͠ʹॲཧΛετοϓͯ͘͠ΕΔ• σόοάίϚϯυΛࠐΉ͜ͱͰ͖Δ• ৗతʹᐆດͳϨΠΞτͷݕΛ͍ͨ࣌͠ɺϫʔχϯάͷɹՕॴΛಛఆ͍ͨ࣌͠ʹ͏ͱྑ͍ʁ• Auto LayoutͷσόοάʹݶΒ͍ͣΖ͍Ζ͍ಓ͋Δ
γϯϘϦοΫϒϨʔΫϙΠϯτͷՃ
γϯϘϦοΫϒϨʔΫϙΠϯτͷઃఆexpr -l objc++ -O -- [[UIWindow keyWindow] _autolayoutTrace]"EE"DUJPOΛΫϦοΫͯ͠ૠೖ
ϒϨʔΫϙΠϯτࠐΜͩ··࣮ߦᐆດͳϨΠΞτ͕ඳը͞ΕΔ࣌ʹετοϓͯ͠ίϚϯυ͕࣮ߦ͞ΕΔ
ϓϥΠϕʔτϝιου͏ܥ
͜͜Ͱݴ͏ϓϥΠϕʔτϝιουͬͯʁ• Objective-Cʹ͓͚ΔɺϨΠΞτΛσόοά͢Δͷʹɹ ศརͳϝιουͨͪ• SwiftͰ͏ʹ࠶ఆٛɺϒϦοδ͢Δඞཁ͕͋Δ• ϦϦʔεϏϧυʹؚΊΔͱϦδΣΫτ͞ΕΔՄೳੑ͕͋ΔͷͰɹ ҙ͕ඞཁ
ผ్#SJEHJOH)FBEFSΛ༻ҙ͢Δ
CASE 6.hasAmbiguousLayoutΛ͏
hasAmbiguousLayout• ո͍͠viewʹରͯ͜͠ͷϝιουΛ͏• ੍ʹΑͬͯҐஔ͕Ұҙʹͳ͍ͬͯͳ͍ͱ͖ʹtrueΛฦ͢• શͯͷᐆດͳϨΠΞτΛݕͰ͖ΔΘ͚Ͱͳ͍• σόοάͷΈʹ༻͍Δ͜ͱ• αϒϏϡʔ·Ͱ࠶ؼతʹௐΔϝιουΛ࡞Δͱɺɹ ͲΕ͕ᐆດ͔ௐͯ͘͢ศར
͕ࣗᐆດ͔Ͳ͏͔νΣοΫࣗͷࢠϏϡʔ͕ᐆດ͔Ͳ͏͔νΣοΫ
ৄ͍͠ใΛΓ͔ͨͬͨΒ[UIView _autolayoutTrace]ΛͬͯͶ
$PWFS7JFXʹᐆດͳ੍͕͋ΔΑ
ཁ͢Δʹ6*-BCFM͕ո͍͠Α
ͨͩ…• ίʔυͰAuto LayoutΛͬͨͱ͖ʹߴ֬Ͱtrue͕ฦͬͯɹ ͘ΔΑ͏ͳؾ͕ͯ͠ɺ͍·͍͕ͪ݅Θ͔Βͳ͔ͬͨ• ࠷ॳframe(0, 0, 0, 0)͚ͩͲޙ͔ΒtranslatesAutoresizingMaskIntoConstraintsΛfalseʹͯ͠ɹ αΠζΛ͋ͯΔ߹true͕ฦͬͯདྷͯ͠·͏• ͪͳΈʹStoryboard্Ͱ໌Β͔ʹΤϥʔ͕ग़͍ͯΔͱ͖ɹ ੍͕ᐆດͰfalseΛฦ͢͜ͱ͋Δ༷ࢠ
ཧͱͯ͠• ͖ͬ͞࡞ͬͨhasAmbiguityϝιουΛͬͯɺɹ XCTAssert(self.hasAmbiguity(), “Ambiguous Layout”)ͷΑ͏ʹɹϢχοτςετΛΔͱྑ͍
ิͱͯ͠• exerciseAmbiguityInLayout()ϝιουͱ߹Θͤͯ͏ͱྑ͍• exerciseAmbiguityInLayoutᐆດͳ੍Λ࣋ͭviewͷɹ frameΛɺ੍Λຬͨ͢ൣғͰϥϯμϜʹมߋͯ͘͠ΕΔ
αϒϏϡʔ·Ͱ࠶ؼతʹ࣮ߦλΠϚʔͰ܁Γฦ࣮͠ߦUIViewʹ͜ΜͳϝιουΛ࡞Δͱศར
CASE 7.recursiveDescriptionΛ͏
recursiveDescriptionͱ• ֘ͷviewͷ࠷ऴతͳϨΠΞτͷϑϨʔϜͱ֊ใΛɹ ࠶ؼతʢ=recursiveʣʹදࣔͯ͘͠ΕΔ• Auto Layoutใೖ͍ͬͯͳ͍• Ճͨͣ͠ͷview͕දࣔ͞Ε͍ͯͳ͍ɺͳΜ͔มͳͱ͜Ζʹɹ දࣔ͞Ε͍ͯΔɺͳͲͷ߹ʹ͏ͱྑ͍
͜ͷը໘Ͱࢼͯ͠ΈΔ(lldb) po [[UIWindow keyWindow] recursiveDescription]
WJFXͷ֊ߏ͕Θ͔ΔҰ෦ͷϓϩύςΟ͕Θ͔Δ
CASE 8._autolayoutTraceΛ͏
_autolayoutTraceͱ• viewͷ֊ใͱͦͷϨΠΞτ੍͕ఆٛʹΑͬͯɹ ࣮ߦ͞Ε͍ͯΔ͔Ͳ͏͔Λදࣔ• ᐆດͳϨΠΞτपลʹԿ͕ى͍ͬͯ͜Δͷ͔ΛѲ͍͢͠
͜ͷը໘Ͱࢼͯ͠ΈΔ(lldb) po [[UIWindow keyWindow] _autolayoutTrace]
ˎҹ͕͍͍ͯΔͷ"VUP-BZPVUʹΑͬͯඳը͞Εͨͷ
ʴҹ͕͍͍ͯΔͷ"VUP-BZPVUΛ༻͍ͣඳըͨ͠ͷ
˔ҹ͕͍͍ͯΔͷϨΠΞτΤϯδϯͷϗετ
CASE 9._printHierarchyΛ͏
_printHierarchyͱ• viewͷ֊ใͰͳ͘ɺview controllerͷ֊ใΛɹදࣔ͢Δ͜ͱ͕Ͱ͖Δ
͜ͷը໘Ͱࢼͯ͠ΈΔ(lldb) po [[[UIWindow keyWindow] rootViewController] _printHierarchy]
͜ͷը໘ͷ͜ͱ
ʛͰ͋ΕDIJMEWJFXDPOUSPMMFSTʴͰ͋ΕϞʔμϧ
CASE 10._ivarDescriptionΛ͏
_ivarDescriptionͱ• ֘ͷΦϒδΣΫτ͕࣋ͭΠϯελϯεͱͦͷΛɹ දࣔ͢Δ͜ͱ͕Ͱ͖Δ• Πϯελϯεͷੜɺॴ༗ͷ࣌Ͱؒҧ͍ͬͯΔͳͲͷཧ༝Ͱɹ ࠓ·ͰͷϝιουͰϨΠΞτใΛ֬ೝͯ͠ɹ͏·͘ղ໌Ͱ͖ͳ͍߹ͳͲʹ͏
• ͍͍ྫ͕ࢥ͍ු͔ͳ͔ͬͨͷͰ࣮ࢪྫলུ
ϏδϡΞϧ͔Βஅ͢Δܥ
CASE 11.cellͷߴ͞Λٙ͏αϯϓϧίʔυ7FSUJDBM-BCFMTΑΓɻ
࡞Γ͍ͨϨΠΞτ֤ཁૉؒʹͷ伱ؒΛͨͤΔ
Τϥʔൃੜϫʔχϯάϩάग़͍ͯͳ͍ɻ੍ಛʹ͓͔͘͠ͳ͍ɻ
4UPSZCPBSE্ͷDFMMͷߴ͞Λมߋͨ࣌͠Ͱ3PX)FJHIU͕$VTUPNʹͳͬͯߴ͕͞ઃఆ͞ΕΔcellϨΠΞτΛ࡞Δ࣌…
DFMMͷߴ͞Λमਖ਼੍ or ߴ͞Λमਖ਼͢Ε…Τϥʔղফղܾ
CASE 12.ϏϡʔσόοΨʔΛ͏αϯϓϧίʔυ.VMUJ)JFSBSDIZ7JFXΑΓɻ
࡞Γ͍ͨϨΠΞτgray viewΛണ͕͢
Կ͔͕͓͔͍͠gray viewΛണ͕͢֊ΛѲ͢Δͷ͕ྑͦ͞͏ʁ
ϏϡʔσόοΨʔىಈͪΌΜͱHSBZͷϏϡʔͷ্ʹ͔ͬͬͯΔͬΆ͍ʁʁϏϡʔσόοΨʔͰ֬ೝ
debug navigatorͰ֬ೝࢠؔʹͳ͍ͬͯͳ͔ͬͨ
view֊Λमਖ਼ࢠؔʹͨ͠
CASE 13.contentHuggingPriorityΛௐ͢Δαϯϓϧίʔυ1SJPSJUZ7JFXΑΓɻ
࡞Γ͍ͨϨΠΞτ5FYU'JFMEͰ͖Δ͚ͩ෯Λ͘औΔ
Կ͔͕͓͔͍͠5FYU'JFME͕ΊͬͪΌখ͍͞
Կ͔͕͓͔͍͠1SJPSJUZӠʑݴΘΕͯΔ
contentHuggingPriorityͱ• େ͖͘ͳΓʹ͘͞ / ίϯςϯπʹԊ͏༏ઌ• Hug = ԊͬͯਐΉͱ͍͏ҙຯ• ͜ͷ͕খ͍͞ͱଞͷ੍ʹӨڹ͞Εͯେ͖͘ͳΓ͘͢ͳΔ• ݻ༗αΠζΑΓେ͖ͳαΠζ͕ࢦఆ͞Εͨͱ͖ʹΘΕΔ
contentHuggingPriorityͷΛνΣοΫ੍ͷ༏ઌΛΘ͟ͱ͘͠ͳ͍ݶΓɺίϯςϯπͷେ͖͞ʹ͔͔ΘΒ੍͕ͣ༏ઌ͞ΕΔ→Button͕৳ͼͯ͠·ͬͨ
ղܾ͢ΔʹTextFieldͰ͖Δ͚ͩ͘औΓ͍͕ͨButton࠷ݶͷେ͖͞Ͱ͍͍ͷͰButtonͷcontentHuggingPriorityΛ্͛Δ
CASE 14.contentCompressionResistancePriorityΛௐ͢Δαϯϓϧίʔυ1SJPSJUZ7JFXΑΓɻ
࡞Γ͍ͨϨΠΞτiPhone 8 PlusiPhoneSE෯͕Γͳ͘ͳͬͨΒͬͪ͜ͷϥϕϧΛলུͯ͠ௐઅ࠷ͷԣ෯֬อ
iPhoneSEԿ͔͕͓͔͍ͬͪ͜͠ͷϥϕϧ͕লུ͞Εͯ͠·͍ͬͯΔiPhone 8 Plus
contentCompressionResistancePriorityͱ• খ͘͞ͳΓʹ͘͞ / ѹॖ߅༏ઌ• ͜ͷ͕খ͍͞ͱଞͷ੍ʹӨڹ͞Εͯখ͘͞ͳΓ͘͢ͳΔ• ݻ༗αΠζΑΓখ͍͞αΠζ͕ࢦఆ͞Εͨͱ͖ʹΘΕΔ
contentCompressionResistancePriorityͷΛνΣοΫʮYeahʯϥϕϧͷํΛ༏ઌతʹॖΊͯ΄͍͠ͷͰɺʮYeahʯϥϕϧͷcontentCompressionResistancePriorityͷ༏ઌΛԼ͛Δͱྑͦ͞͏
LLDB͏ܥ
CASE 15.͍Ζ͍ΖͬͯΈΔαϯϓϧίʔυ&RVBM8JEUI7JFXΑΓɻ
࡞Γ͍ͨϨΠΞτ֤7JFXͷԣ෯֤7JFXͷؒʹಁ໌ͳ4QBDFS7JFXΛஔiPhone 8 PlusͩͬͨΒͳ͔ͬͨ
Կ͔͕͓͔͍͠Ұݟେৎͦ͏͚ͩͲiPhone SEαΠζͩͱμϝͩͬͨʘ8BSOJOHʗ
Ͳ͕͓͔͍͜͠ʁਫฏํͷ੍͕͓͔͍͜͠ͱ͕Θ͔ΔXJEUI MFBEJOH.BSHJOUSBJMJOH.BSHJO
͔ͯͲΕ͕ͲͷViewʁidentifier͚Δͷ໘ͩ͠ผͷํ๏Ͱ۠ผ͠Α͏
ํ๏1ɿLLDB্ͰΦϒδΣΫτΛૢ࡞͢Δ̍·ͣϏϡʔσόοΨʔΛىಈͯ͠LLDB͕͑Δঢ়ଶʹ͢Δ
ํ๏1ɿLLDB্ͰΦϒδΣΫτΛૢ࡞͢Δ̍lWJFXXJEUIΛյͨͥ͠zյ͞ΕͨWJFXΛผ͢ΔͨΊʹ৭Λ͚ͯΈΑ͏
ํ๏1ɿLLDB্ͰΦϒδΣΫτΛૢ࡞͢Δ̍ඞཁͳϑϨʔϜϫʔΫΛJNQPSU--%#ͷݴޠΛ4XJGUʹ
ํ๏1ɿLLDB্ͰΦϒδΣΫτΛૢ࡞͢Δ̍VOTBGF#JU$BTUΛͬͯϙΠϯλ͔ΒΦϒδΣΫτΛऔಘΦϒδΣΫτԽ͍ͨ͠ͷͷΞυϨεΛࢦఆ
ํ๏1ɿLLDB্ͰΦϒδΣΫτΛૢ࡞͢Δ̍ΦϒδΣΫτԽͨ͠WJFXͷഎܠ৭Λʹ
ํ๏1ɿLLDB্ͰΦϒδΣΫτΛૢ࡞͢Δ̍ը໘ΛϦϑϨογϡͯ͠มߋΛө
ํ๏1ɿLLDB্ͰΦϒδΣΫτΛૢ࡞͢Δ̍͜ͷWJFXͷXJEUIͷ੍͕յΕͨΒ͍͠ʂ
ํ๏̎ɿLLDB্ͰΦϒδΣΫτΛૢ࡞͢Δ̎ΦϒδΣΫτԽ͍ͨ͠ͷͷΞυϨεΛࢦఆ
ํ๏̎ɿLLDB্ͰΦϒδΣΫτΛૢ࡞͢Δ̎WJFXͷഎܠ৭Λʹ
ํ๏̎ɿLLDB্ͰΦϒδΣΫτΛૢ࡞͢Δ̎͜ͷWJFXͷXJEUIͷ੍͕յΕͨΒ͍͠ʂσόοάऴྃ
ํ๏̏ɿtext filterΛ͏ΞυϨεΛUFYUpMUFSʹίϐϖʂ֘͢ΔΦϒδΣΫτʹ৭͕͍ͭͨʂ
ԫ৭viewͷwidthΛݟͯΈΔͱ…͔֬ʹXJEUIͷ੍͕յΕ͍ͯΔ
༧͍ͯͨ͠ϨΠΞτSEͷԣ෯320ɺ֤Viewͷ෯͕100ͰleadingMarginɺtrailingMargin͕0ʹͳͬͯΔ͔ΒɺViewؒͷSpacerView͕ॖ·ΕͪΌΜͱऩ·ΔͷͰʁʁ
ͯΏ͏͔…ͳΜͰleadingʹ伱͕ؒͰ͖ͯΔΜͩΖ͏ʁʁ→ϏϡʔσόοΨʔͰɹ֬ೝͯ͠ΈΑ͏
Storyboard্Ͱ੍Λ֬ೝ͢Δํ๏̍TIPX$POTUSBJOUT੍ͷ༰
Storyboard্Ͱ੍Λ֬ೝ͢Δํ๏੍̎ΛӈΫϦοΫͰ༰Λग़ྗ
superview͕͓͔͍͠ʁʁಛʹͳͦ͞͏
Կ͕͓͔͍͠Μͩʁʁ͋ΕɺtrailingMargin͔ͬͯͯ͠͠…ʁ
3FMBUJWFUPNBSHJOʹνΣοΫ͕ೖ͍ͬͯΔͭ·ΓQU͕ܭࢉʹೖ͍ͬͯΔԿ͕͓͔͍͠Μͩʁʁ
Relative to marginͷνΣοΫΛ֎ͯ͠…3FMBUJWFUPNBSHJOͷνΣοΫΛ֎ͯ͠DPOTUBOUΛʹ
ʂ ղܾ
CASE 16.facebook / chiselΛ͏
facebook / chiselͱ• LLDBΛͬͨσόοάΛศརʹͯ͘͠ΕΔίϚϯυ܈• HomebrewͰΠϯετʔϧͰ͖Δ• ίϚϯυΛΧελϚΠζ͢Δ͜ͱՄೳ
Πϯετʔϧํ๏$ brew update$ brew install chisel$ echo "command script import /usr/local/Cellar/chisel/1.8.0/libexec/fblldb.py" >> ~/.lldbinit-Xcode※ύεదٓมߋ͍ͯͩ͘͠͞ɻXcode࠶ىಈ
͍ํ(lldb) helpΛଧͯίϚϯυͷҰཡ͕ग़ͯ͘ΔͷͰͦΕʹै͍ͬͯ·͢ɻͪΖΜࠓ·Ͱ͍ͬͯͨίϚϯυ͑·͢ɻ͜͜Ͱ͍͔ͭ͘ϐοΫΞοϓͯ͠հ͠·͢ɻ
pviews• viewͷ֊ߏΛදࣔͯ͘͠ΕΔ• ҾʹviewͷΞυϨεΛࢦఆ͢ΔͱͦͷviewҎԼͷ֊ߏΛɹදࣔͯ͘͠ΕΔ• recursiveDescriptionͷ݁ՌΛϑΟϧλϦϯάͨ͠ͷ
pviews֘ͷWJFX্ʹͭͷWJFX͕͋Δ͜ͱ͕Θ͔Δ
border• Ϗϡʔɺ͘͠ϨΠϠʔʹରͯ͠ઢΛදࣔͯ͘͠ΕΔ• ઌͷ৭෯ΦϓγϣϯͰࢦఆ͢Δ͜ͱ͕Ͱ͖Δ• Կ֊Լͷview·ͰઢΛ͚Δ͔Λ-d(depth)Ͱࢦఆ͢Δɹ͜ͱ͕Ͱ͖Δ• ৭͕͍͓ͯΒͣڥ͕Θ͔Γʹ͍͘viewΛ֬ೝ͢Δ࣌ͳͲʹɹ͑ͦ͏
borderEFQUIͱΞυϨεΛࢦఆ
borderϏϡʔσόοΨʔղআޙͷ༷ࢠ࠶ϏϡʔσόοΨʔىಈ
ղܾͷࢳޱΛݟ͚ͭΔίπ
ݻఆͰͳ͍ͱ͜ΖΛνΣοΫ͢Δ• શ෦ݻఆͰࢦఆ͍ͯ͠ΕϨΠΞτ่Εͳ͍ͣ• ਖ਼͘͠Մมʹͳ͍ͬͯΔ͔νΣοΫ͠Α͏
ʹͳΔviewͷαΠζ͕ద͔֬ೝ͢Δ• cellͱ͔xibߴ͕ࣗ͞༝ʹม͑ΒΕΔ͕ɺ͋·ΓʹɹϑϦʔμϜͩͱதͷཁૉͷ੍ͱטΈ߹Θͳͯ͘ΤϥʔʹͳΔ• ͷviewϓϨϏϡʔͷͰͳ͘σβΠϯͷҰ෦ͳͷͰɹͪ͜͜ΌΜͱέΞ͢Δ
༏ઌΛઃఆͯ͠ͳ͍͔֬ೝ͢Δ• ༏ઌ͕ग़ͯ͘ΔͱͻͱͰ੍͕ਖ਼͍͠ͷ͔ؒҧͬͯΔͷ͔ɹ͕Θ͔Γʹ͍͘• Storyboard্ͰҰ༏ઌΛΘ͟ͱͣΒͯ͠ௐઅ͠ɺɹऴΘͬͨΒݩʹͨ͠Γ͍͍͔ͯ͠
ෳͷͰ֬ೝ͢Δ• Auto LayoutͰ࡞͍ͬͯΔ ≠ શͯͷαΠζͰਖ਼͍͠• ϓϨϏϡʔΛΓସ͑Α͏
੍่͕Ε͍ͯΔ࣠ΛѲ͢Δ• ଟ͘ͷϫʔχϯάʹک͑ͣɺํΛݟۃΊΑ͏• ͕࣠Θ͔Εॱʹݟͯղܾ͍͢͠• ྆࣠ؒҧͬͯͨΒAspect RatioMultiplierɺɹEqual Width / HeightΛٙ͏
ຊʹඞཁͳ੍Λߟ͑Δ• σβΠϯΛ͞Εͨ࣌ʹɺͲΕ͕αΠζʹґଘ͠ͳ͍ɹͳͷ͔Λߟ͑Δ• ඞཁͰ͋ΕσβΠφʔʹ֬ೝ͢Δ
Ұ͔ΒΈ͢• ࠷ऴखஈ• طଘͷσβΠϯͷมߋࢥΘ͵͏͔ͬΓΛট͘• ߹ʹΑͬͯࣗͰશ෦Έͨ͠ํ͕ૣ͍͔͠Εͳ͍
transformΛ͍ͬͯͳ͍͔֬ೝ͢Δ• transformͰͷมAuto LayoutͷܭࢉʹҰӨڹ͠ͳ͍• Auto LayoutͰະม࣌ͷۣܗ͕ߟྀ͞ΕΔ
ඳըํ๏͕ಛघͰͳ͍͔֬ೝ͢Δ• جຊతʹviewڥքʹஔ͞ΕΔ͕ɺάϥϑΟοΫɹΤϯδϯͦͷݶΓͰͳ͍• ඳը͕ಛघͳ߹ɺϑϨʔϜͱҟͳΔੇ๏ͷྖҬʹඳը͢Δɹ͜ͱ͕͋Δ• viewͷclipsToBoundsΛtrueʹ͢Δ͔ϑϨʔϜͷੇ๏Λม͑ΕɹൃݟͰ͖Δ
·ͱΊ
• Auto Layout่ΕͷݪҼΛ୳Δํ๏͍ͭ͋͘Δ• ʮঢ়ʯʹ߹ͬͨਖ਼͍͠ʮʯ͕Ͱ͖Ε͏ා͘ͳ͍• ࠓհͨ͠༰໌͔Β͑ΔͷͰͥͻͬͯͶ
ؔ࿈ࢿྉ
• σόοάͷͨΊʹView֊ΛѲ͢Δ• https://qiita.com/akatsuki174/items/45d4bd7cb150defbf116• AutoLayoutͷσόοάΛ͢Δʢ1ʣ• https://qiita.com/akatsuki174/items/6935bb6ff64f4df51c5a• Debugging your layout ([WWDC2015] Mysteries of AutoLayout, Part 2ΑΓ)• https://qiita.com/akatsuki174/items/66c6a92ab52b458f5414
• Auto LayoutͷϫʔχϯάղಡʹʮWTF?ʯ͕ศར• https://qiita.com/akatsuki174/items/ccf394c03677ac62191e• Auto Layoutͷσόοάʹཱͭϝιου/ϓϩύςΟू• https://qiita.com/akatsuki174/items/550f885c002fb881674c
ࢀরจݙ
• Mysteries of Auto Layout, Part 2 (WWDC 2015)• https://developer.apple.com/videos/play/wwdc2015/219/• Α͘Θ͔ΔAuto Layout• גࣜձࣾϦοΫςϨίϜ. ᬒ ༤հ ஶ. ॴ ༑ଠ म.
એ
ϦϞʔτ͋ΔΑʂτʔΫ͓Ԡืͯ͠ΔΑʂ
͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠ʂʘථΑΖ͘͠ʗ