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
IBDesignable を活用する
Search
iganin
January 22, 2019
Technology
26
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
IBDesignable を活用する
2019/01/22 あるあるLT 登壇資料
iganin
January 22, 2019
More Decks by iganin
See All by iganin
On-behalf-of Token exchange with AgentCore Identity
hironobuiga
2
290
FastMCP OAuth Proxy with Cognito
hironobuiga
3
360
Three-Legged OAuth in AgentCore Gateway
hironobuiga
2
310
Amazon Bedrock AgentCore 認証・認可入門
hironobuiga
3
670
AgentCoreで実現するマルチテナントAIエージェント
hironobuiga
2
180
FlutterでGraphQL のuseQueryを使う
hironobuiga
0
32
FlutterでGraphQLを扱う
hironobuiga
0
27
FlutterでScrollViewとExpandedを併用し てSignIn / SignUp画面 など レイアウトを作成する
hironobuiga
0
28
Data Race and Actor
hironobuiga
0
88
Other Decks in Technology
See All in Technology
現場との対話から始める “作る前に問い直す”業務改善
mochico50
1
190
Jitera Company Deck
jitera
0
260
GoでCコンパイラを作った話
repunit
0
150
変更し続けられるシステムをどう保つか — AI時代のSSoTという設計原則
kawauso
1
1k
なぜ、あなたのAPIは使われないのか? AX時代の設計原則、ガードレール、運用体制
yokawasa
1
200
Devsumi 2026 Summer 人もAIも使える共通基盤を事業の加速装置にする~デザインシステム運用に学ぶ組織レバレッジ~ 渡辺 凌央
legalontechnologies
PRO
1
280
[Droidcon Orlando '26] The Android Lens: Applying Mobile Forensics to AI Performance
amanda_hinchman
1
100
ここは地獄!つらい朝会を体験することで、チームとしてのより良い振る舞いに気づくワークショップ / The stand-up meeting from hell in the game industry
scrummasudar
0
210
全員がリーダーである世界へ キリマンジャロ登頂とシェアド・リーダー
jinwatanabe
0
120
どこまでAIに任せるか 〜確率論と決定論の境界決定〜
shukob
0
430
アップデートで何が変わった?デモで学んで使いこなすIBM Bob2.0
muehara
0
220
複数プロダクト組織のAIネイティブ化における戦略 / AICon2026_kude
rakus_dev
0
300
Featured
See All Featured
Bootstrapping a Software Product
garrettdimon
PRO
307
120k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
231
55k
Building an army of robots
kneath
306
46k
Information Architects: The Missing Link in Design Systems
soysaucechin
0
1k
Ten Tips & Tricks for a 🌱 transition
stuffmc
0
150
svc-hook: hooking system calls on ARM64 by binary rewriting
retrage
2
370
Exploring anti-patterns in Rails
aemeredith
3
450
The browser strikes back
jonoalderson
0
1.4k
Mobile First: as difficult as doing things right
swwweet
225
10k
Getting science done with accelerated Python computing platforms
jacobtomlinson
2
340
WENDY [Excerpt]
tessaabrams
11
38k
Prompt Engineering for Job Search
mfonobong
0
380
Transcript
IBDesignable を活用する 2019/01/22 - あるあるLT
Self Introduction 伊賀裕展(いが ひろのぶ) iOS Engineer ( + Android, Serverside Kotlin,
Flutterを少し) Twitter: @iganin_dev GitHub: https://github.com/HironobuIga Qiita: https://qiita.com/iganin
話の流れ 1. 最近開発していて個人的に起こっていること 2. アンチパターンと思われる解消方法 3. IBDesignable, IBInspectableを使う 4. IBDesignable,
IBInspectable使用時の問題点 5. 問題点の解消 6. まとめ
最近開発していて 左の画面UI • 有限要素 ◦ そのほかの動植物 -> 上限要素数5とします • 全体をスクロールさせたい
このような場合に従来TableViewで作成していた画面を ScrollView + StackView で作成することが増えてきました
問題点 • Storyboardに直接UIコンポーネントを置くと Interface Builder上のViewのネストが深くなる • 増殖するIBOutlet…. • 増えていくIBOutletへの値をセットするコード ...
• 低下するViewの再利用性... • Storyboard上で確認できない layerプロパティ
たまにやるパターン 先ほどのCardViewが対象 1. ViewをXibベースで作成 2. StoryboardにベースのViewだけ置く 3. コードで1を2のベースに貼り付ける IBでのUI生成の利点がなくなってしまう •
コンパイルせずにUIを見れる • 様々なパターンをUI上で試せる
IBDesignableを使用する IBDesignable • Interface Builder上でIBDesignableで定義したViewを表示できる • 上記対象のViewのクラス定義に @IBDesignableを付与する IBInspectable •
Interface Builder上でIBInspectableとしたプロパティを変更できる ◦ UIViewのBackgroundColorなどのイメージ • 対象のプロパティの @IBInspectableを付与する
具体的な実装 1. 分離したクラス定義に @IBDesignableを付与 (※minimum実装ならここまで) 2. Storyboard上から修正を加えたいプロパティを IBInspectableを使用して定義 a. set,
get 経由でborderColorや cornerRadiusも設定可能 b. didSet内でViewの更新処理を入れたり
具体的な実装 1. 分離したクラス定義に @IBDesignableを付与 (※minimum実装ならここまで) 2. Storyboard上から修正を加えたいプロパティを IBInspectableを使用して定義 a. set,
get 経由でborderColorや cornerRadiusも設定可能 b. didSet内でViewの更新処理を入れたり 3. 初期化のタイミングで実行している処理を prepareForInterfaceBuilderに記述 a. viewの角丸、 borderなど b. awakeFromNib等はIB上では実行されな いため
改修結果 • ネストが減った
改修結果 • ネストが減った • IBOutletが減った • 値セットのコード量が減った ◦ 各Viewコンポーネントへ細分化された •
Viewの再利用性が高まった
いい感じに見えます ….が
IBDesignableの問題点 Interface Builderの挙動が遅くなる、不安定になる • IBDesignableを使用しているとコードの修正を行った後に、 Interface Builder上でビルドが走るようにな り、挙動が遅く、不安定になります Interface Builder上で確認できないことが多い
• 使っているとわかりますが、 Interface Builder上で表示されないことが結構な割合であります
なぜ起きるか ビルドターゲットがアプリモジュールと同じ場合、 Storyboardのプレビュー作成時にアプリ全体のビルドが走るため ※Storyboardのプレビュー作成時のタイミングでStoryboard内に含まれる IBDesignableクラスを集めて、それらが含まれるモジュールを全てビルドします
解決する 方針 1. IBDesignableのView要素をEmbededFrameworkに切り出す 2. 別ビルドターゲットとなることで、Storyboard表示時のIBDesignableのビルドは IBDesignableが含まれるモジュール内のみになる 3. アプリと同一のモジュールに含まれていた時に比べ、Storyboard表示時の速度が 改善する
Embedded Framework化 インターネット上にいくつかの記事がありますが、概要は以下です。 1. File > New > Target >
Cocoa Touch Frameworkを追加 2. 使用元のEmbedded Framework, Linked Frameworks and Librariesに追加 ◦ おそらくですが、1の段階で自動的になっています 3. 分離したいクラスファイルを該当のフォルダへ移動 4. 分離したクラスのターゲットを変更 5. 該当クラスのファイル内のアクセス修飾子を変更 ◦ internal -> public or openに。 ◦ internal=同一モジュール内のみで参照可能 ◦ public=モジュール外からも参照可能。継承は不可。 ◦ open=モジュール外から参照可能。継承も可能。
まとめ • IBDesignable, IBInspectableを使用してViewの再利用性を高める • Embeded FrameworkにIBDesignable要素を分離することでInterface Builder をより効率的に使用できるようにする
参考リポジトリ 参考用にサンプルのプロジェクトを作成しています。 https://github.com/HironobuIga/IBDesignable_Sample