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
20
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
FastMCP OAuth Proxy with Cognito
hironobuiga
3
340
Three-Legged OAuth in AgentCore Gateway
hironobuiga
2
290
Amazon Bedrock AgentCore 認証・認可入門
hironobuiga
3
640
AgentCoreで実現するマルチテナントAIエージェント
hironobuiga
2
140
FlutterでGraphQL のuseQueryを使う
hironobuiga
0
27
FlutterでGraphQLを扱う
hironobuiga
0
25
FlutterでScrollViewとExpandedを併用し てSignIn / SignUp画面 など レイアウトを作成する
hironobuiga
0
22
Data Race and Actor
hironobuiga
0
84
20210625-meet-async-await@swift愛好会
hironobuiga
1
1.7k
Other Decks in Technology
See All in Technology
Diagnosing performance problems without the guesswork
elenatanasoiu
0
160
ブロックチェーン / Blockchain
ks91
PRO
0
110
もりもり新機能を一挙紹介! AgentCoreに入門して、AWS上にAIエージェントを構築しよう
minorun365
PRO
6
810
EventBridge Connection
_kensh
4
520
Amazon Bedrock AgentCore ワークショップ JAWS UG TOHOKU / amazon-bedrock-agentcore-workshop-jawsug-tohoku-2026
gawa
8
270
新規ゲーム開発におけるAI駆動開発のリアル
202409e2
0
2.5k
チームで実践する AI-DLC 思考の軌跡を残すチェックポイント設計
belongadmin
0
2.6k
【Gen-AX】20260530開催_JJUG CCC 2026 Spring
genax
0
420
TypeScript Compiler APIとPHP-Parserを活用し、TypeScriptとPHPで型を共有する
shuta13
0
360
AI-DLCを活用した高品質・安全なAI駆動開発実践 / AI Driven Development with AI-DLC
yoshidashingo
0
140
AI フレンドリーなエラー監視を TypeScript で実現する
shinyaigeek
2
260
電子辞書Brainをネットに繋げてみた(自力編)
raspython3
0
480
Featured
See All Featured
How to optimise 3,500 product descriptions for ecommerce in one day using ChatGPT
katarinadahlin
PRO
1
3.6k
Reality Check: Gamification 10 Years Later
codingconduct
0
2.2k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
17k
Lightning Talk: Beautiful Slides for Beginners
inesmontani
PRO
2
570
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
659
62k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
52
6k
Visualization
eitanlees
152
17k
Breaking role norms: Why Content Design is so much more than writing copy - Taylor Woolridge
uxyall
0
310
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
10
1.2k
Art, The Web, and Tiny UX
lynnandtonic
304
22k
Organizational Design Perspectives: An Ontology of Organizational Design Elements
kimpetersen
PRO
1
720
DBのスキルで生き残る技術 - AI時代におけるテーブル設計の勘所
soudai
PRO
65
55k
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