2020/09/20 iOSDC Japan 2020 day 1
ʮiOSΤϯδχΞͩ͠ɺAndroidΞϓϦ࡞ΕΔͰ͠ΐʁʯiOSDC Japan 2020@akatsuki174
View Slide
ࣗݾհ
• ਢ౻ຘʢ@akatsuki174ʣ• iOS→AndroidΤϯδχΞ• גࣜձࣾTimersॴଐ• ࠷ۙiOSࣄͰͬͯΔ• Αͬͯ͘ΔɺiPhone XͱPixel 3• iOSDC Japan 2020 core staff
ࠓͷ
࣍• iOS/AndroidͷUIͰҧ͏ͱ͜Ζ• Swiftͱൺֱͭͭ͠KotlinΛֶ΅͏• ActivityɺFragmentΛཧղ͠Α͏• Α͘͏ListViewͱRecyclerViewΛΖ͏• ؆୯ͳUI͕ΊΔΑ͏ʹͳΖ͏• ࠷ݶͷσόοά͕Ͱ͖ΔΑ͏ʹͳΖ͏
ͳΜͱͳ͘Ͱ͖ΔΑ͏ʹͳΔ͜ͱ• iOS/Androidͷҧ͍͕Θ͔Δ• Kotlinίʔυ͕ಡΊΔΑ͏ʹͳΔ• AndroidΞϓϦͷ࡞Γํ͕Θ͔Δ• ෆ۩߹ͷಛఆ͕Ͱ͖ΔΑ͏ʹͳΔ
ࠓͷࢿྉ
ࠓͷࢿྉ• SpeakerDeckʹ্͛ͯ·͢• TwitterͰྲྀͯ͠·͢
iOS/AndroidͷUIͰҧ͏ͱ͜Ζ
ࣅͯΔ͚Ͳɺҧ͏• iOS/AndroidͰࣅͯΔͷʹ͍ͭͯઆ໌• ࣅͯͯࡉ෦͕ҟͳ͍ͬͯͨΓ͢ΔͷͰ҆қʹஔ͖͑ΒΕͳ͍͜ͱ
ը໘ભҠ• iOS• ϓογϡભҠ͕ج࣠ɻ֊Λ۷ΔΠϝʔδɻ• ঢ়گʹΑͬͯɺϞʔμϧભҠ• Android• ϖʔδΛੵΈॏͶΔΠϝʔδɻ
ΔϘλϯͷ༗ແ• iOS• ΄΅ඞ͍͍ͣͭͯΔ• Android• ͍ͭͯͳ͍͜ͱ͋Δ• ʹΔϘλϯ͕͋Δ
J04 "OESPJE
ը໘λΠτϧͷҐஔ• iOS• தԝ• ϥʔδλΠτϧͩͱࠨ• Android• ࠨ
ཁૉબ• iOS• ϦετɺυϥϜϩʔϧɺΞΫγϣϯγʔτ• Android• νΣοΫϘοΫεɺϥδΦϘλϯɺυϩοϓμϯϦετɺϘτϜγʔτ
Ϧετͷҹ• iOS• Disclosure IndicatorΛ͚ͨΓ͢Δ• Android• ͚ͳ͍ํ͕Ұൠతʁ
બ• iOS• υϥϜϩʔϧ• iOS 14͔ΒΧϨϯμʔܕ• Android• ΧϨϯμʔܕ
"OESPJEJ04
ϑϩʔςΟϯάΞΫγϣϯϘλϯ• ͦͷը໘ͷओΞΫγϣϯϘλϯ• iOSͰ͍ͬͯΔྫͪΒ΄Β
γϟυ• ϚςϦΞϧσβΠϯʹӨͷষ͕͋Δ• Z࣠ɺಈ͖ͷํΛ֮ͤ͞Δ• Өͷೱ͞ߴ͞ɺଞͱͷؔʹΑܾͬͯ·Δ
https://material.io/design/environment/light-shadows.html#shadowsᶃᶄᶅ
φϏήʔγϣϯυϩϫʔ• iOS• كʹͦΕͬΆ͍ͷ͕͋Δ• Android• ը໘ࠨ͔ΒεϥΠυͯ͠දࣔͰ͖Δϝχϡʔ
ࢀߟʹͳΔαΠτ• consim• iOS/Androidͷը໘ΛൺֱͰ͖ΔαΠτ• https://consim.design/• ʮAndroidiOSͱಉ͡σβΠϯͰʂʯͱݴΘΕͨͱ͖ͷରԠҊ• https://qiita.com/ogapants/items/8a551ed3b16bcf0cc3ed
Swiftͱൺֱͭͭ͠KotlinΛֶ΅͏
Kotlinͱ• JetBrains͕։ൃͨ͠ΦϒδΣΫτࢦɹɹɹϓϩάϥϛϯάݴޠ• Google I/O 2017ͰAndroidνʔϜ͕KotlinΛެࣜʹαϙʔτ͢Δ͜ͱΛൃද• Javaͷࢿ࢈ͷଟ͘Λྲྀ༻Ͱ͖Δ• 1ͭͷϓϩδΣΫτʹJavaͱKotlinͷࠞࡏՄ
KotlinͱSwift• ΘΓͱॻ͖ํ͕ࣅͯΔ• جຊจ๏Ͱࣅ͍ͯΔͷΛհ
ϓϩύςΟએݴ
Φϓγϣφϧ
Ξϯϥοϓ
ؔ
ྻૢ࡞
Ϋϥε֦ு
ΠϯλʔϑΣʔεɺϓϩτίϧ
ͦͷଞ
ActivityɺFragmentΛཧղ͠Α͏
ActivityͱFragment• MVCͰݴ͏ͱ͜ΖͷControllerΈ͍ͨͳͷ• ϥΠϑαΠΫϧΛ͍࣋ͬͯΔ
Activityͱ• ௨ৗɺ1ͭͷActivityͰ1ͭͷը໘Λ࣮͢Δ• ≒ UIViewController
https://developer.android.com/guide/components/activities/activity-lifecycle?hl=ja
"DUJWJUZੜ࣌"DUJWJUZ͔ΒΕΑ͏ͱ͍ͯ͠ΔɻӬଓԽॲཧ͜͜ͰɻϢʔβ͕ΠϯλϥΫγϣϯΛ࣮ࢪͰ͖Δঢ়ଶ"DUJWJUZ͕ݟ͑ͳ͘ͳͬͨͱ͖https://developer.android.com/guide/components/activities/activity-lifecycle?hl=ja
ActivityͷϨΠΞτ• Activity#onCreate(Bundle)ͷதͰActivity#setContentView(int)Λݺͼग़͢• intϨΠΞτϑΝΠϧͷid
Fragmentͱ• ActivityʹΈࠐΜͰ͏• 1ͭͷActivityʹෳͷFragmentΛΈ߹ΘͤɹΒΕΔ• ଟղ૾ରԠ࣌ʹศར• ෳͷActivityͰFragmentΛ࠶ར༻Ͱ͖Δ
https://developer.android.com/guide/components/fragments?hl=ja#Creating
https://developer.android.com/guide/components/fragments?hl=ja#Creating'SBHNFOU͕"DUJWJUZʹΈࠐ·Εͨঢ়ଶ'SBHNFOU͕࣋ͭ7JFXΛߏங'SBHNFOU͕"DUJWJUZ͔ΒΓ͞ΕΔ
https://developer.android.com/guide/components/fragments?hl=ja#Design
Α͘͏ListViewͱRecyclerViewΛΖ͏
ListViewͱ• Androidͷॳظ͔Β༻ҙ͞Ε͍ͯΔΫϥε• γϯϓϧͳҰཡදࣔ
ొਓͷΠϝʔδ%BUB4PVSDF "EBQUFS -JTU7JFX$VSTPS"SSBZ-JTUFUD
ListViewʢ࣮ʣ
ListViewʢϨΠΞτʣ
RecyclerViewͱ• ListViewΛ֦ுͯ͠ॊೈੑΛͨͤͨվྑ൛• εϫΠϓɺD&DͳͲΛ͢ΔͳΒͬͪ͜• ϔομʔɺϑολʔͷΈଘࡏ͠ͳ͍• ۠ΓઢࣗͰ࣮͢Δඞཁ͕͋Δ
ొਓͷΠϝʔδ%BUB4PVSDF"EBQUFS7JFX)PMEFS3FDZDMFS7JFX-BZPVU.BOBHFS
RecyclerViewʢຊମʣ
RecyclerViewʢAdapterʣ
RecyclerViewʢViewHolderʣ
RecyclerViewʢϨΠΞτʣ
؆୯ͳUI͕ΊΔΑ͏ʹͳΖ͏
AndroidͷϨΠΞτͷ࡞Γํ• xmlͰهड़ɺ͘͠GUIͰ࡞ʢStoryboard, xibΈ͍ͨͳ͔Μ͡ʣ• ͍ͣΕʹͯ͠xml͕ੜ͞ΕΔ
LayoutsͱWidgets• LayoutͰΛࢦఆ͠ɺ෦ͱͳΔWidgetΛɹฒ͍ͯ͘• WidgetʹButton, ImageView, TextView,ListViewͳͲ͕͋Δ
-BZPVU8JEHFU-BZPVU
͞·͟·ͳϓϩύςΟ• LayoutɺWidgetiOSͱಉ͡Α͏ʹɺ༷ʑͳɹઃఆΛՃ͑Δ͜ͱ͕Ͱ͖Δ• ͪΖΜLayout/WidgetʹΑͬͯઃఆͰ͖ΔɹϓϩύςΟҟͳΔ• ͜͜ͰදతͳͷΛհ
id• ݴ༿௨Γɺࣝผࢠ• ಉҰϑΝΠϧͰҰҙͳ໊લʹͳ͍ͬͯΕɹྑ͍• xmlͰৼͬͨidΛݩʹKotlinϑΝΠϧ͔Βݺͼɹग़͕͠Ͱ͖Δ
width/height• ݴ༿௨Γɺ෯ͱߴ͞• `match_parent`ͩͱͷViewʹର͍ͯͬ͠ͺ͍ʹ͕Δ• `wrap_content`༰ʹ߹Θͤͯௐઅ͞ΕΔ• ͪΖΜઈରࢦఆՄ
ओͳLayoutͷछྨ• LinearLayout• ॎorԣ1ྻʹཁૉΛฒΔ• UIStackViewͬΆ͍͔Μ͡• ConstraintLayout• ཁૉʹ੍Λ͚ɺҐஔΛ૬ରతʹܾΊΔ
͓·͚ɿϓϨϏϡʔTips
༨ஊɿJetpack Compose• Google I/O 2019Ͱൃද͞ΕͨɺUIπʔϧΩοτ• SwiftUIͷΑ͏ʹɺએݴతʹUIΛߏஙͰ͖Δ
https://developer.android.com/jetpack/compose?hl=ja
࠷ݶͷσόοά͕Ͱ͖ΔΑ͏ʹͳΖ͏
2௨Γհ• ϒϨʔΫϙΠϯτΛுΔํ๏• Ϗϡʔ֊ΛѲ͢Δํ๏
ϒϨʔΫϙΠϯτͷுΓํ
͜Μͳέʔε͋Γ·ͤΜ͔ʁ• RecyclerViewͷpositionͳͲɺมΘΓΏ͘ΛѲ͍ͨ͠• ͍͍ͪͪϒϨʔΫϙΠϯτͰࢭ·ͬͯ΄͘͠ɹͳ͍• ίʔυʹLog.dॻ͍ͯ࠶Ϗϧυ͢Δͷ໘
ղܾͰ͖·͢• Evaluate and logΛ׆༻͢Ε࠶ϏϧυͤͣɹϩάΛग़ྗͰ͖Δ• ίʔυ͍͡Δඞཁ͕ͳ͍
Ϗϡʔ֊ͷݟํ• Layout InspectorΛ͏
·ͱΊ
·ͱΊ• iOSͷੈքΛ͍ͬͯΕAndroidͦ͜·Ͱɹ͘͠ͳ͍ʂʂʂ
એ
• αʔόʔαΠυΤϯδχΞ (PHP, Golang, AWS)• AndroidΤϯδχΞ (Kotlin)• iOSΤϯδχΞ (Swift)TimersͰݱࡏΤϯδχΞશ৬छ࠾༻தʂৄ͘͠”Timers”Ͱݕࡧ
͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠ʂ