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
30
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
320
FastMCP OAuth Proxy with Cognito
hironobuiga
4
390
Three-Legged OAuth in AgentCore Gateway
hironobuiga
2
330
Amazon Bedrock AgentCore 認証・認可入門
hironobuiga
3
680
AgentCoreで実現するマルチテナントAIエージェント
hironobuiga
2
210
FlutterでGraphQL のuseQueryを使う
hironobuiga
0
33
FlutterでGraphQLを扱う
hironobuiga
0
29
FlutterでScrollViewとExpandedを併用し てSignIn / SignUp画面 など レイアウトを作成する
hironobuiga
0
31
Data Race and Actor
hironobuiga
0
98
Other Decks in Technology
See All in Technology
少人数データチームのDevin活用実践事例
runandy16
2
140
会計事務所と顧問先の契約関係をOIDC・OAuthで表現する
terara
0
580
hookで自作する Claude Code の「実況ボード」
shinyasaita
2
290
『自分で判断できるか』を基準に、プロダクトのハンズオン研修でAI利用の線を引いてみた / Where We Drew the Line on AI in Hands-on Training
honyanya
1
780
いま好きなこと 最初はそんなに好きじゃなかった #tamagawadev
nishiuma
1
150
Bet AI Day 2026丨How We Bet AI: AIとともに働く場をつくる
layerx
PRO
0
1.6k
Bet AI Day 2026丨バクラク Autopilot、業務システムの再設計
layerx
PRO
1
780
[RSJ26] Building a VLA Model Based on Self-Distilled Classification
keio_smilab
PRO
0
160
Does an AI Watermark Survive Translation?
machinetranslation
0
510
Contract One Engineering Unit 紹介資料
sansan33
PRO
0
20k
人気商品が「ちゃんと買える」をつくる ー ECの負荷改善
ykagano
1
180
いかに伝えるか 〜新卒エンジニアの教育のための、ライトノベル活用の一例
ikedon
1
150
Featured
See All Featured
Embracing the Ebb and Flow
colly
88
5.2k
Being A Developer After 40
akosma
91
590k
Self-Hosted WebAssembly Runtime for Runtime-Neutral Checkpoint/Restore in Edge–Cloud Continuum
chikuwait
0
760
SEO in 2025: How to Prepare for the Future of Search
ipullrank
3
3.8k
WCS-LA-2024
lcolladotor
0
820
A Modern Web Designer's Workflow
chriscoyier
698
190k
Mind Mapping
helmedeiros
PRO
1
340
We Have a Design System, Now What?
morganepeng
55
8.3k
How to Get Subject Matter Experts Bought In and Actively Contributing to SEO & PR Initiatives.
livdayseo
0
180
How GitHub (no longer) Works
holman
316
150k
Designing Powerful Visuals for Engaging Learning
tmiket
1
520
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.9k
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