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
あなたのアプリ、✨リブランディング✨できますか? / iosdc2020
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
monoqlo
September 20, 2020
Technology
1.7k
9
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
あなたのアプリ、✨リブランディング✨できますか? / iosdc2020
iOSDC 2020 2020/09/20 LT
monoqlo
September 20, 2020
More Decks by monoqlo
See All by monoqlo
入門 SwiftUI Alignment Guide / iOSDC2022
monoqlo
11
6.3k
Hey Siri!マルチプラットフォームでのSiriショートカットの地雷を教えて / iOSDC2021
monoqlo
0
880
実践 CallKit/PushKit ときどき🐛退治 / iOSDC 2019
monoqlo
4
4.1k
「QRコード読み取り?楽勝ですよ😙」=>「AVFoundationを信じたおれがバカだった😇」 / iOSDC 2018
monoqlo
10
31k
WWDC2016のススメ
monoqlo
0
140
Other Decks in Technology
See All in Technology
白金鉱業Meetup_Vol.24_「AIエージェントは分けるほど良い」は本当か? / Is it true that “the more you divide AI agents, the better”?
brainpadpr
1
270
"何を作るか"を任される エンジニアは、どう育つのか
yutaokafuji
1
580
Claude Code×Terraform IaC テンプレート駆動開発
itouhi
1
490
日本 Fintech 未来予測レポート 2027〜2028年(オリジナル版)
8maki
0
1.4k
失敗を経て、Harness Engineering で 大切にしたいことを考える / Learning from Failure: What Matters in Harness Engineering
bitkey
PRO
1
290
Oracle AI Database@Azure:サービス概要のご紹介
oracle4engineer
PRO
6
1.9k
作って終わりにしない タイミーのセマンティックレイヤー育成の現在地
chanyou0311
3
2.1k
スキルと MCP ツール、責務をどう分けるか? AI が迷わないインターフェース設計の戦略
cdataj
1
920
Agentic Web
dynamis
1
200
エンジニアリング戦略の作り方 / Crafting Engineering Strategy
iwashi86
19
6.4k
就職⽀援サービスにおけるキャリアアドバイザーのシフトスケジューリング
recruitengineers
PRO
1
130
EventBridge Connection
_kensh
5
690
Featured
See All Featured
Navigating Algorithm Shifts & AI Overviews - #SMXNext
aleyda
1
1.3k
From π to Pie charts
rasagy
0
200
Bootstrapping a Software Product
garrettdimon
PRO
307
120k
Color Theory Basics | Prateek | Gurzu
gurzu
0
360
[RailsConf 2023] Rails as a piece of cake
palkan
59
6.7k
Measuring & Analyzing Core Web Vitals
bluesmoon
9
860
The Cost Of JavaScript in 2023
addyosmani
55
10k
Optimizing for Happiness
mojombo
378
71k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
287
14k
Redefining SEO in the New Era of Traffic Generation
szymonslowik
1
330
We Analyzed 250 Million AI Search Results: Here's What I Found
joshbly
1
1.4k
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
11
940
Transcript
@monoqloʢͷ͘Ζʣ ͋ͳͨͷΞϓϦɺ ✨ϦϒϥϯσΟϯά✨Ͱ͖·͔͢ʁ iOSDC TOKYO 2020
None
20209݄1
20209݄1
None
None
ৼΓฦͬͯΈΔͱ…
201911݄27 10ϲ݄લ
None
201812݄5 ͞Βʹ1લ
λΫϕϧϦϦʔε͔Β8ϲ݄ޙ
ຖϦχϡʔΞϧ ͯ͠ΔΜ͚
དྷϦχϡʔΞϧ ͋ΔͷͰ…
ϦϒϥϯσΟϯά ʹޮ͘ॲํᝦબ⚕
ॳ
ϦϒϥϯσΟϯάͰ৭Λ શ෦ม͑Δͷ͕ͭΒͯ͘… ৭Λࢦఆ͍ͯ͠Δ Storyboard150΄Ͳ… ॳ
⚕ʮαϙʔτOSόʔδϣϯ͍ͭ͘Ͱ͔͢ʯ ʮ࣮iOS 10Ҏ߱Ͱͯ͠…ʯ ⚕ʮॏͰ͢ɻ͍·͙͢আ͠·͠ΐ͏ɻʯ
StoryboardΛ͏ͳΒαϙʔτ͢ΔͷiOS 11Ҏ߱ʹ Asset CatalogͰ৭ཧΛ ॲํᝦ
None
None
Asset Catalog্ͷ৭Λมߋ͢Δͱ Ϗϧυ͞ΕͨΞϓϦStoryboard্ͷ৭ΓସΘΔ
ͪͳΈʹ…
ͪͳΈʹ…
ͪͳΈʹ…
ͪͳΈʹ…
ͪͳΈʹ…
ͪͳΈʹ…
ؾʹͳΔਓ͋ͱͰ εϥΠυݟ͍ͯͩ͘͞
ྍ#2
ը૾ͷࠩ͠ସ͕͑ඞཁͳΜͰ͕͢ɺ Կࠩ͠ସ͕͑ൃੜ͍ͯͯ͠… ྍ#2
⚕ʮͪͳΈʹը૾໊ͬͯͪΌΜͱཧͰ͖ͯ·͔͢ʁʯ ʮσβΠφʔ͕ͭͬͯ͘͘Εͨը૾ʹɺͪ͜ΒͰదʹ ໊લ͚ͭͯొ͢Δ͜ͱ͋Γ·͢Ͷʯ ⚕ʮΊͪΌͪ͘ΌඇޮͳͷͰΊ͍ͯͩ͘͞ʯ
ॲํᝦ ໋໊نଇࡦఆ ex. ΞΠίϯͳΒ ic_xxx_yyy , ΠϥετͳΒ illust_xxx_yyy ͱ͔ Zeplin͔ΒͷҰׅΤΫεϙʔτͰߋ৽
టष͘৽چը૾໊ରԠද.csvͭͬͯ͘ɺεΫϦϓτॻ͍ͯஔ͖͑ͨΓ͚ͨ͠Ͳɺ͕࣌ؒͳ͍ͷͰͦͷলུ
None
None
None
ͨͩ͠…
ଥڠͱඞཁ
લఏ ը૾αΠζม͑ͳ͍ ϨΠΞτʹӨڹ͕͋Δͷݸผʹࠩ͠ସ͑
1ͭͷ໊લʹରͯ͠1ͭͷը૾͔͠ొͰ͖ͳ͍
1ͭͷ໊લʹରͯ͠1ͭͷը૾͔͠ొͰ͖ͳ͍
1ͭͷ໊લʹରͯ͠1ͭͷը૾͔͠ొͰ͖ͳ͍ ͑ͳ͍
• Appearance μʔΫϞʔυରԠͰ͖ͳ͍… • Slicing Contents.jsonͷimages͕·Δ͝ͱஔ͖ΘΔͷͰϦηο τ͞ΕΔ ಛʹͭΒ͍ͷ
"images" : [ { - "idiom" : "universal", - "filename"
: "company_noimage_outlined.pdf" + "filename" : "company_noimage_outlined.pdf", + "idiom" : "universal" } "images" : [ { - "filename" : "radio_unselected.pdf", - "idiom" : "universal" + "idiom" : "universal", + "filename" : "radio_unselected.pdf" } ΤΫεϙʔτͰ༨ܭͳdiff͕ൃੜ
େͷը૾ࠩ͠ସ͕͑ඞཁʹͳͬͯ… ݕࡧͰ͖Δ͠ը૾Λݟ͚ͭΔͷ͕؆୯ ·Δ͝ͱஔ͖͑Δ͚ͩͰྑ͍ ը૾Λݟ͚ͭΔͷཧେมʢiOSͱAndroidͰ ἧ͍ͬͯͳ͍͠…ʣ ͻͱͭͻͱͭஔ͖͑Δͷखؒ
ྍ#3
࣮࣌ʹ ϑΥϯταΠζΛ ؒҧ͕͑ͪͰ… ྍ#3
⚕ʮσβΠϯࢦఆͬͱڽࢹ͍ͯͩ͘͠͞ʯ ʮͭΒ͍ɻԿݸݟͯΔͱήγϡλϧτ่յ͠·͢…ʯ ⚕ʮΘ͔Δʯ ʮ> Θɹ͔ɹΔ <ʯ ⚕ʮͰ֤αΠζʹ໊લΛ͚ͭͯΈ͍͔͕ͯͰ͠ΐ͏ʯ
ॲํᝦ ֤ϑΥϯταΠζ͝ͱʹɺ૬ରతʹαΠζײͷΘ͔Δ໋໊
title, subTitle, headline, body,… ͏ʔΜ… ࠔΓͦ͏ͳέʔε • ʮ͜͜… subTItle… ͳͷ͔ʁʯ
• ʮ৽͍͠ཁૉΛͲΜͲΜ͍͖ͯͦ͠͏…ʯ
title, subTitle, headline, body,… ͏ʔΜ… ࠔΓͦ͏ͳέʔε • ʮ͜͜… subTItle… ͳͷ͔ʁʯ
• ʮ৽͍͠ཁૉΛͲΜͲΜ͍͖ͯͦ͠͏…ʯ
None
None
ੜ໊͖Λ࠾༻ • ϝδϟʔͳੜ͖ͷେ͖͞ɺ૬ରతʹΠϝʔδ͍͢͠ < • ෯Λ͓͚࣋ͨͤͯɺதؒʹ૿ͨ͘͠ͳͬͯରԠͰ͖Δ • ֆจࣈͰදݱͰ͖Δੜ͖ͳΒࢹೝੑྑ͍ mouse rabbit
dog monkey sheep bear elephant
None
None
None
public enum TextStyle { case mouse(FontWeight = .regular) // 12
case rabbit(FontWeight = .regular) // 13 case dog(FontWeight = .regular) // 14 case monkey(FontWeight = .regular) // 17 case sheep(FontWeight = .regular) // 19 case bear(FontWeight = .regular) // 23 case elephant(FontWeight = .regular) // 33 internal var font: UIFont { // ֤caseͷϑΥϯτΛฦ͢ return .systemFont(ofSize: size, weight: weight) } } ίʔυ্ͷϑΥϯτఆٛʢεϥΠυ༻ʹ؆ུԽͯ͠·͢ʣ public enum FontWeight { case regular case heavy fileprivate var value: UIFont.Weight { switch self { case .regular: return .regular case .heavy: return .heavy } } }
⚕ 3ͭհͨ͠ΜͰ͕͢…
ۓٸ֎དྷ One more thing…
Ծը૾ͷ··ϦϦʔε ͦ͠͏ʹͳͬͯ͠·ͬͯ… ۓٸ ֎དྷ
⚕ʮීஈͷ༷ࢠΛڭ͑ͯΒ͑·͔͢ʯ ʮΞϓϦͷผͷը૾ΛͱΓ͋͑ͣηοτ͓͍ͯͨ͠ ΓɺσβΠϯ্ͷԾը૾͕͋ΕͦΕΛೖΕͨΓ…ʯ ⚕ʮΕͯແཧͳ͍Ͱ͢ͶɻίϯύΠϥͷྗΛआΓ· ͠ΐ͏ʯ
ॲํᝦ σόοάϏϧυͰͷΈఆٛ͞ΕΔUIImageͷextension
#if DEBUG extension UIImage { @available(iOS, deprecated, message: "temporary() is
temporary image. it needs to be fixed") func temporary() -> UIImage { return self } } #endif UIImage+Temporary
Debug Release
ࣗݾհ
@monoqloʢͷ͘Ζʣ • Mobility Technologies Ͱಇ͍ͯΔਓ • 1ϲ݄લ͔ΒFF14ΛΏΔ;ΘϓϨΠத @ElementalDC/Atomos Ξόλʔ͕͔Θ͍ͯ͘ϩάΠϯ͢Δͨͼ ʹQoL্͕Δ☺
@monoqloʢͷ͘Ζʣ • Mobility Technologies Ͱಇ͍ͯΔਓ • 1ϲ݄લ͔ΒFF14ΛΏΔ;ΘϓϨΠத @ElementalDC/Atomos Ξόλʔ͕͔Θ͍ͯ͘ϩάΠϯ͢Δͨͼ ʹQoL্͕Δ☺
APPENDIX
iOS 10ҎԼΛ αϙʔτͯ͠ΔΞϓϦ ௐͯΈ·ͨ͠
32/100 ແྉAppϥϯΩϯάϕετ100 2020/09/19࣌
None
ը૾ҰׅΤΫεϙʔτ࣮ݱʹ͚ͨటष͍ࣄલ४උ JNBHF@OBNFTDTW JDPO@DBODFM@UBYJ JD@DBODFMUBYJ@NBJODPMPS JDPO@DBTI JD@DBTI@NBJODPMPS JDPO@DIFDL@TFMFDUFE JD@DIFDL@DJSDMF@pMM@NBJODPMPS JDPO@DIFDL JD@DIFDL@DJSDMF@PVUMJOFE@EJTBCMF
DBSECSBOE@VOLOPXO@9- JD@DSFEJUDBSE@pMM@YM@HSBZ DPVQPO JMMVTU@DPVQPO@CBOOFS ৽چը૾໊ରԠද.csvΛ࡞ ஔεΫϦϓτΛͭͬͯࠩ͘͠ସ͑
require "csv" if ARGV.count != 2 then puts "Ҿͷ͕ਖ਼͋͘͠Γ·ͤΜɻ" puts
"ୈ1Ҿʹ ஔ͍ͨ͠ը૾໊ҰཡcsvϑΝΠϧ ͷpathΛɺୈ2Ҿʹ Storyboard/xib ؚ͕·ΕΔσΟϨΫτϦͷpathΛ༩͍͑ͯͩ͘͞ɻ" exit end image_names_path = ARGV[0] if File.extname(image_names_path) != ".csv" then puts "ୈ1Ҿʹࢦఆ͞ΕͨϑΝΠϧcsvϑΝΠϧͰ͋Γ·ͤΜɻਖ਼͍͠ϑΝΠϧΛࢦఆ͍ͯͩ͘͠͞ɻ" exit end root_path = ARGV[1] image_names = CSV.read(image_names_path) image_names.each { |names| old_name = names[0] new_name = names[1] next if new_name.nil? || old_name.nil? puts "#{old_name} => #{new_name}" [ ["<image name=\"#{old_name}\"", "<image name=\"#{new_name}\""], ["value=\"#{old_name}\"", "value=\"#{new_name}\""], ["image=\"#{old_name}\"", "image=\"#{new_name}\""], ["R.image.#{old_name}()", "R.image.#{new_name}()"] ].each { |texts| command = "grep -lr '#{texts.first}' #{root_path} | xargs sed -i '' -e 's/#{texts.first}/#{texts.last}/g'" system(command) } } puts "Completed!" ը૾໊ ৽چ ஔεΫϦϓτ.rb
ϏοτϚοϓͱϕΫλʔScreenΛ͚Δ
None
PNGʹPDFʹ͍ͨ͠ը૾ؚ· Εͯ͠·͏ͷͰɺ ͍ࠞͬͯ͟ΔͱPNG͚ͩͷҰׅ ΤΫεϙʔτ͕Ͱ͖ͳ͍
࠷ޙʹେͳ͜ͱ
σβΠφʔͱڠྗ͠Α͏
• ܰඍͳ৭/ը૾मਖ਼ͳΒσβΠφʔࣗΒ֬ೝͰ͖Δମ੍Λͭ͘Δ • ৭ͬͯඍௐ͕ͪ͠ • ΤϯδχΞ͕Ϗϧυͯͨ͠͠Γݟͤʹ͍͔ͳͯ͘ྑ ͍ͷͰߴޮ • GitHubͷwikiʹඇΤϯδχΞ͚ϏϧυϚχϡΞϧඋ •
λʔϛφϧॳ༻Ͱɺgitͷ͕ࣝͳͯ͘ɺϏϧυͰ͖Δ ֬ೝαΠΫϧΛૣ͘ճ͢͜ͱॏཁ