Address
:
[go:
up one dir
,
main page
]
Include Form
Remove Scripts
Accept Cookies
Show Images
Show Referer
Rotate13
Base64
Strip Meta
Strip Title
Session Cookies
More Web Proxy on the site http://driver.im/
Submit Search
iOS UI Component API Design
9 likes
17,754 views
Brian Gesiak
1 of 60
Download now
Downloaded 10 times
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
More Related Content
Viewers also liked
(11)
PDF
RSpec 3.0: Under the Covers
Brian Gesiak
PDF
Intel® Xeon® Phi Coprocessor High Performance Programming
Brian Gesiak
PDF
Apple Templates Considered Harmful
Brian Gesiak
PDF
やはりお前らのCore Dataの使い方も間違っている
今城 善矩
PDF
Company Scouter
Shuichi Tsutsumi
PDF
iOS Behavior-Driven Development
Brian Gesiak
PDF
StoryboardでUIを使いまわす
Masaki Fuke
PDF
UIKit DynamicsとCoreMotionを組み合わせて物体を転がしてみた
Kosuke Ogawa
PDF
アップルのテンプレートは有害と考えられる
Brian Gesiak
PDF
iOSビヘイビア駆動開発
Brian Gesiak
PPTX
技術選択とアーキテクトの役割
Toru Yamaguchi
RSpec 3.0: Under the Covers
Brian Gesiak
Intel® Xeon® Phi Coprocessor High Performance Programming
Brian Gesiak
Apple Templates Considered Harmful
Brian Gesiak
やはりお前らのCore Dataの使い方も間違っている
今城 善矩
Company Scouter
Shuichi Tsutsumi
iOS Behavior-Driven Development
Brian Gesiak
StoryboardでUIを使いまわす
Masaki Fuke
UIKit DynamicsとCoreMotionを組み合わせて物体を転がしてみた
Kosuke Ogawa
アップルのテンプレートは有害と考えられる
Brian Gesiak
iOSビヘイビア駆動開発
Brian Gesiak
技術選択とアーキテクトの役割
Toru Yamaguchi
Similar to iOS UI Component API Design
(20)
PDF
I phoneアプリ入門 第5回
Sachiko Kajishima
PDF
24時間でiOSアプリ-Twitterクライアント-の作成にチャレンジ ver1.1
聡 中川
PDF
24時間でiOSアプリ-Twitterクライアント-の作成にチャレンジ
聡 中川
PDF
UICollectionViewLayoutでカバーフローを作りたい!
sawat1203
PDF
iPhone, iPad アプリ開発勉強会#3
Hiroe Orz
KEY
1.29.user,user,user
Tonny Xu
KEY
Blocksの活用法
Hidetoshi Mori
PDF
⑭iPhoneアプリを作ってみよう!(超初心者向け)その2
Nishida Kansuke
KEY
Core Graphicsでつくる自作UIコンポーネント入門
cocopon
PDF
Ib資料20090222
Hiroyuki Fujikawa
PDF
Storyboard
Hidetoshi Mori
PDF
Saitama beginner tips50
Tomohiko Okita
PDF
UITableViewで無限CoverFlowを作る
Hidetoshi Mori
PDF
UITableViewについて
teencoders
PPTX
2012 05-19第44回cocoa勉強会発表資料
OCHI Shuji
KEY
Cocoa勉強会201208
Satoshi Oomori
PDF
Swift 3 を書くときに知っておきたい API デザインガイドライン #love_swift #akibaswift
Tomohiro Kumagai
PDF
flasherがはじめてiOS開発をしてみて
佐藤 俊太郎
KEY
軽量EvernoteクライアントSmartEverにおけるアプリ高速化の工夫と課題
Makoto Setoh
PDF
I phoneアプリ入門 第4回
Sachiko Kajishima
I phoneアプリ入門 第5回
Sachiko Kajishima
24時間でiOSアプリ-Twitterクライアント-の作成にチャレンジ ver1.1
聡 中川
24時間でiOSアプリ-Twitterクライアント-の作成にチャレンジ
聡 中川
UICollectionViewLayoutでカバーフローを作りたい!
sawat1203
iPhone, iPad アプリ開発勉強会#3
Hiroe Orz
1.29.user,user,user
Tonny Xu
Blocksの活用法
Hidetoshi Mori
⑭iPhoneアプリを作ってみよう!(超初心者向け)その2
Nishida Kansuke
Core Graphicsでつくる自作UIコンポーネント入門
cocopon
Ib資料20090222
Hiroyuki Fujikawa
Storyboard
Hidetoshi Mori
Saitama beginner tips50
Tomohiko Okita
UITableViewで無限CoverFlowを作る
Hidetoshi Mori
UITableViewについて
teencoders
2012 05-19第44回cocoa勉強会発表資料
OCHI Shuji
Cocoa勉強会201208
Satoshi Oomori
Swift 3 を書くときに知っておきたい API デザインガイドライン #love_swift #akibaswift
Tomohiro Kumagai
flasherがはじめてiOS開発をしてみて
佐藤 俊太郎
軽量EvernoteクライアントSmartEverにおけるアプリ高速化の工夫と課題
Makoto Setoh
I phoneアプリ入門 第4回
Sachiko Kajishima
Ad
Recently uploaded
(7)
PDF
20250711JIMUC総会_先進IT運用管理分科会Connpass公開資料.pdf
ChikakoInami1
PDF
PostgreSQL18新機能紹介(db tech showcase 2025 発表資料)
NTT DATA Technology & Innovation
PDF
20250711_日本IBM ミドルウエア・ユーザー研究会(JIMUC)総会_中村会長資料.pdf
ChikakoInami1
PPTX
Devcontainerのススメ(1)-Devcontainerとはどういう技術?-
iPride Co., Ltd.
PDF
20250711JIMUC総会IBM Automation_Platform最新情報_Connpass公開版.pdf
ChikakoInami1
PDF
[Hardening Designers Confernece 2025]ランサムウェアでの見えざるログ・見えるログ
kataware
PDF
20250717_Devin×GitHubCopilotで10人分の仕事は出来るのか?.pdf
Masaki Yamakawa
20250711JIMUC総会_先進IT運用管理分科会Connpass公開資料.pdf
ChikakoInami1
PostgreSQL18新機能紹介(db tech showcase 2025 発表資料)
NTT DATA Technology & Innovation
20250711_日本IBM ミドルウエア・ユーザー研究会(JIMUC)総会_中村会長資料.pdf
ChikakoInami1
Devcontainerのススメ(1)-Devcontainerとはどういう技術?-
iPride Co., Ltd.
20250711JIMUC総会IBM Automation_Platform最新情報_Connpass公開版.pdf
ChikakoInami1
[Hardening Designers Confernece 2025]ランサムウェアでの見えざるログ・見えるログ
kataware
20250717_Devin×GitHubCopilotで10人分の仕事は出来るのか?.pdf
Masaki Yamakawa
Ad
iOS UI Component API Design
1.
UIコンポーネントAPIデザイン 「パラメータ・オブジェクト」パターン Brian Gesiak 2014年4月9日 Research Student,
The University of Tokyo @modocache #potatotips
2.
内容 • 課題:カスタマイズ用のAPIをどう提供するか • 細かいところまでカスタマイズしたい •
継承より組み立てを好む • 解決策:設定オブジェクト • 設定オブジェクト ! • 課題:コールバックのAPI • ブロックやdelegateメソッドのパラメータが確定し てしまうとなかなか変えられない • 解決策:パラメータ・オブジェクト
3.
カスタマイズ用のAPIの一例 JVFloatLabeledTextField
4.
カスタマイズ用のAPIの一例 JVFloatLabeledTextField
5.
カスタマイズ用のAPIの一例 JVFloatLabeledTextField
6.
カスタマイズ用のAPIの一例 JVFloatLabeledTextField @interface JVFloatLabeledTextField :
UITextField ! @property (nonatomic, strong) NSNumber *floatingLabelYPadding UI_APPEARANCE_SELECTOR; @property (nonatomic, strong) UIFont *floatingLabelFont UI_APPEARANCE_SELECTOR; @property (nonatomic, strong) UIColor *floatingLabelTextColor UI_APPEARANCE_SELECTOR; @property (nonatomic, strong) UIColor *floatingLabelActiveTextColor UI_APPEARANCE_SELECTOR; @property (nonatomic, assign) NSInteger animateEvenIfNotFirstResponder UI_APPEARANCE_SELECTOR; ! @end
7.
カスタマイズ用のAPIの一例 JVFloatLabeledTextField @interface JVFloatLabeledTextField :
UITextField ! @property (nonatomic, strong) NSNumber *floatingLabelYPadding UI_APPEARANCE_SELECTOR; @property (nonatomic, strong) UIFont *floatingLabelFont UI_APPEARANCE_SELECTOR; @property (nonatomic, strong) UIColor *floatingLabelTextColor UI_APPEARANCE_SELECTOR; @property (nonatomic, strong) UIColor *floatingLabelActiveTextColor UI_APPEARANCE_SELECTOR; @property (nonatomic, assign) NSInteger animateEvenIfNotFirstResponder UI_APPEARANCE_SELECTOR; ! @end
8.
カスタマイズ用のAPIの一例 JVFloatLabeledTextField @interface JVFloatLabeledTextField :
UITextField ! @property (nonatomic, strong) NSNumber *floatingLabelYPadding UI_APPEARANCE_SELECTOR; @property (nonatomic, strong) UIFont *floatingLabelFont UI_APPEARANCE_SELECTOR; @property (nonatomic, strong) UIColor *floatingLabelTextColor UI_APPEARANCE_SELECTOR; @property (nonatomic, strong) UIColor *floatingLabelActiveTextColor UI_APPEARANCE_SELECTOR; @property (nonatomic, assign) NSInteger animateEvenIfNotFirstResponder UI_APPEARANCE_SELECTOR; ! @end
9.
カスタマイズ用のAPIの一例 JVFloatLabeledTextField @interface JVFloatLabeledTextField :
UITextField ! @property (nonatomic, strong) NSNumber *floatingLabelYPadding UI_APPEARANCE_SELECTOR; @property (nonatomic, strong) UIFont *floatingLabelFont UI_APPEARANCE_SELECTOR; @property (nonatomic, strong) UIColor *floatingLabelTextColor UI_APPEARANCE_SELECTOR; @property (nonatomic, strong) UIColor *floatingLabelActiveTextColor UI_APPEARANCE_SELECTOR; @property (nonatomic, assign) NSInteger animateEvenIfNotFirstResponder UI_APPEARANCE_SELECTOR; ! @end
10.
継承するのか? 継承より組み立てを好む
11.
継承するのか? • JVFloatLabeledTextFieldはUITextFieldのサブクラス 継承より組み立てを好む
12.
継承するのか? • JVFloatLabeledTextFieldはUITextFieldのサブクラス • 機能がほしければこのクラスを使うしかない 継承より組み立てを好む
13.
継承するのか? • JVFloatLabeledTextFieldはUITextFieldのサブクラス • 機能がほしければこのクラスを使うしかない •
機能を追加したければサブクラスを新たに定義す るしかない 継承より組み立てを好む
14.
継承するのか? • JVFloatLabeledTextFieldはUITextFieldのサブクラス • 機能がほしければこのクラスを使うしかない •
機能を追加したければサブクラスを新たに定義す るしかない • JVFloatLabeledTextFieldは継承ヒエラルキーに自分 をねじ込んでいる 継承より組み立てを好む
15.
継承するのか? • JVFloatLabeledTextFieldはUITextFieldのサブクラス • 機能がほしければこのクラスを使うしかない •
機能を追加したければサブクラスを新たに定義す るしかない • JVFloatLabeledTextFieldは継承ヒエラルキーに自分 をねじ込んでいる 継承より組み立てを好む • カテゴリーだったら、どのUITextFieldでも使える
16.
@interface JVFloatLabeledTextField :
UITextField ! @property (nonatomic, strong) NSNumber *floatingLabelYPadding UI_APPEARANCE_SELECTOR; @property (nonatomic, strong) UIFont *floatingLabelFont UI_APPEARANCE_SELECTOR; @property (nonatomic, strong) UIColor *floatingLabelTextColor UI_APPEARANCE_SELECTOR; @property (nonatomic, strong) UIColor *floatingLabelActiveTextColor UI_APPEARANCE_SELECTOR; @property (nonatomic, assign) NSInteger animateEvenIfNotFirstResponder UI_APPEARANCE_SELECTOR; ! @end 継承するのか? 継承より組み立てを好む
17.
@interface JVFloatLabeledTextField :
UITextField ! @property (nonatomic, strong) NSNumber *floatingLabelYPadding UI_APPEARANCE_SELECTOR; @property (nonatomic, strong) UIFont *floatingLabelFont UI_APPEARANCE_SELECTOR; @property (nonatomic, strong) UIColor *floatingLabelTextColor UI_APPEARANCE_SELECTOR; @property (nonatomic, strong) UIColor *floatingLabelActiveTextColor UI_APPEARANCE_SELECTOR; @property (nonatomic, assign) NSInteger animateEvenIfNotFirstResponder UI_APPEARANCE_SELECTOR; ! @end 継承するのか? 継承より組み立てを好む
18.
@interface JVFloatLabeledTextField :
UITextField ! @property (nonatomic, strong) NSNumber *floatingLabelYPadding UI_APPEARANCE_SELECTOR; @property (nonatomic, strong) UIFont *floatingLabelFont UI_APPEARANCE_SELECTOR; @property (nonatomic, strong) UIColor *floatingLabelTextColor UI_APPEARANCE_SELECTOR; @property (nonatomic, strong) UIColor *floatingLabelActiveTextColor UI_APPEARANCE_SELECTOR; @property (nonatomic, assign) NSInteger animateEvenIfNotFirstResponder UI_APPEARANCE_SELECTOR; ! @end 継承するのか? 継承より組み立てを好む
19.
@interface JVFloatLabeledTextField :
UITextField ! @property (nonatomic, strong) NSNumber *floatingLabelYPadding UI_APPEARANCE_SELECTOR; @property (nonatomic, strong) UIFont *floatingLabelFont UI_APPEARANCE_SELECTOR; @property (nonatomic, strong) UIColor *floatingLabelTextColor UI_APPEARANCE_SELECTOR; @property (nonatomic, strong) UIColor *floatingLabelActiveTextColor UI_APPEARANCE_SELECTOR; @property (nonatomic, assign) NSInteger animateEvenIfNotFirstResponder UI_APPEARANCE_SELECTOR; ! @end 継承するのか? 継承より組み立てを好む @interface UITextField (JVFloatLabeledTextField)
20.
@interface JVFloatLabeledTextField :
UITextField ! @property (nonatomic, strong) NSNumber *floatingLabelYPadding UI_APPEARANCE_SELECTOR; @property (nonatomic, strong) UIFont *floatingLabelFont UI_APPEARANCE_SELECTOR; @property (nonatomic, strong) UIColor *floatingLabelTextColor UI_APPEARANCE_SELECTOR; @property (nonatomic, strong) UIColor *floatingLabelActiveTextColor UI_APPEARANCE_SELECTOR; @property (nonatomic, assign) NSInteger animateEvenIfNotFirstResponder UI_APPEARANCE_SELECTOR; ! @end 継承するのか? 継承より組み立てを好む @interface UITextField (JVFloatLabeledTextField)
21.
@interface JVFloatLabeledTextField :
UITextField ! @property (nonatomic, strong) NSNumber *floatingLabelYPadding UI_APPEARANCE_SELECTOR; @property (nonatomic, strong) UIFont *floatingLabelFont UI_APPEARANCE_SELECTOR; @property (nonatomic, strong) UIColor *floatingLabelTextColor UI_APPEARANCE_SELECTOR; @property (nonatomic, strong) UIColor *floatingLabelActiveTextColor UI_APPEARANCE_SELECTOR; @property (nonatomic, assign) NSInteger animateEvenIfNotFirstResponder UI_APPEARANCE_SELECTOR; ! @end 継承するのか? 継承より組み立てを好む objc_setAssociatedObject @interface UITextField (JVFloatLabeledTextField)
22.
継承するのか? 継承より組み立てを好む
23.
継承するのか? 継承より組み立てを好む static void *JVFloatingLabelYPaddingKey
= &JVFloatingLabelYPaddingKey; ! - (void)setFloatingLabelYPadding:(NSNumber *)floatingLabelYPadding { objc_setAssociatedObject(self, JVFloatingLabelYPaddingKey, floatingLabelYPadding, OBJC_ASSOCIATION_RETAIN_NONATOMIC); } ! - (NSNumber *)floatingLabelYPadding { return objc_getAssociatedObject(self, JVFloatingLabelYPaddingKey); } ! /// Add custom setters and getters for all properties
24.
継承するのか? 継承より組み立てを好む static void *JVFloatingLabelYPaddingKey
= &JVFloatingLabelYPaddingKey; ! - (void)setFloatingLabelYPadding:(NSNumber *)floatingLabelYPadding { objc_setAssociatedObject(self, JVFloatingLabelYPaddingKey, floatingLabelYPadding, OBJC_ASSOCIATION_RETAIN_NONATOMIC); } ! - (NSNumber *)floatingLabelYPadding { return objc_getAssociatedObject(self, JVFloatingLabelYPaddingKey); } ! /// Add custom setters and getters for all properties
25.
継承するのか? 継承より組み立てを好む static void *JVFloatingLabelYPaddingKey
= &JVFloatingLabelYPaddingKey; ! - (void)setFloatingLabelYPadding:(NSNumber *)floatingLabelYPadding { objc_setAssociatedObject(self, JVFloatingLabelYPaddingKey, floatingLabelYPadding, OBJC_ASSOCIATION_RETAIN_NONATOMIC); } ! - (NSNumber *)floatingLabelYPadding { return objc_getAssociatedObject(self, JVFloatingLabelYPaddingKey); } ! /// Add custom setters and getters for all properties
26.
継承するのか? 継承より組み立てを好む static void *JVFloatingLabelYPaddingKey
= &JVFloatingLabelYPaddingKey; ! - (void)setFloatingLabelYPadding:(NSNumber *)floatingLabelYPadding { objc_setAssociatedObject(self, JVFloatingLabelYPaddingKey, floatingLabelYPadding, OBJC_ASSOCIATION_RETAIN_NONATOMIC); } ! - (NSNumber *)floatingLabelYPadding { return objc_getAssociatedObject(self, JVFloatingLabelYPaddingKey); } ! /// Add custom setters and getters for all properties
27.
継承するのか? 継承より組み立てを好む static void *JVFloatingLabelYPaddingKey
= &JVFloatingLabelYPaddingKey; ! - (void)setFloatingLabelYPadding:(NSNumber *)floatingLabelYPadding { objc_setAssociatedObject(self, JVFloatingLabelYPaddingKey, floatingLabelYPadding, OBJC_ASSOCIATION_RETAIN_NONATOMIC); } ! - (NSNumber *)floatingLabelYPadding { return objc_getAssociatedObject(self, JVFloatingLabelYPaddingKey); } ! /// Add custom setters and getters for all properties
28.
継承するのか? 継承より組み立てを好む static void *JVFloatingLabelYPaddingKey
= &JVFloatingLabelYPaddingKey; ! - (void)setFloatingLabelYPadding:(NSNumber *)floatingLabelYPadding { objc_setAssociatedObject(self, JVFloatingLabelYPaddingKey, floatingLabelYPadding, OBJC_ASSOCIATION_RETAIN_NONATOMIC); } ! - (NSNumber *)floatingLabelYPadding { return objc_getAssociatedObject(self, JVFloatingLabelYPaddingKey); } ! /// Add custom setters and getters for all properties
29.
継承するのか? 継承より組み立てを好む static void *JVFloatingLabelYPaddingKey
= &JVFloatingLabelYPaddingKey; ! - (void)setFloatingLabelYPadding:(NSNumber *)floatingLabelYPadding { objc_setAssociatedObject(self, JVFloatingLabelYPaddingKey, floatingLabelYPadding, OBJC_ASSOCIATION_RETAIN_NONATOMIC); } ! - (NSNumber *)floatingLabelYPadding { return objc_getAssociatedObject(self, JVFloatingLabelYPaddingKey); } ! /// Add custom setters and getters for all properties スケールしない
30.
設定オブジェクト カスタマイズ用のパラメータを束ねる
31.
設定オブジェクト カスタマイズ用のパラメータを束ねる
32.
設定オブジェクト カスタマイズ用のパラメータを束ねる
33.
設定オブジェクト カスタマイズ用のパラメータを束ねる
34.
設定オブジェクト カスタマイズ用のパラメータを束ねる
35.
設定オブジェクトの一例 MDCSwipeToChoose
36.
設定オブジェクトの一例 MDCSwipeToChoose
37.
設定オブジェクトの一例 MDCSwipeToChoose MDCSwipeOptions *options =
[MDCSwipeOptions new]; options.delegate = self; options. *state){ switch (state.direction) { case MDCSwipeDirectionLeft: self.webView.alpha = 0.5f - state.thresholdRatio; break; case MDCSwipeDirectionRight: self.webView.alpha = 0.5f + state.thresholdRatio; break; case MDCSwipeDirectionNone: self.webView.alpha = 0.5f; break; } }; ! [self.webView mdc_swipeToChooseSetup:options];
38.
設定オブジェクトの一例 MDCSwipeToChoose MDCSwipeOptions *options =
[MDCSwipeOptions new]; options.delegate = self; options. *state){ switch (state.direction) { case MDCSwipeDirectionLeft: self.webView.alpha = 0.5f - state.thresholdRatio; break; case MDCSwipeDirectionRight: self.webView.alpha = 0.5f + state.thresholdRatio; break; case MDCSwipeDirectionNone: self.webView.alpha = 0.5f; break; } }; ! [self.webView mdc_swipeToChooseSetup:options];
39.
設定オブジェクトの一例 MDCSwipeToChoose MDCSwipeOptions *options =
[MDCSwipeOptions new]; options.delegate = self; options. *state){ switch (state.direction) { case MDCSwipeDirectionLeft: self.webView.alpha = 0.5f - state.thresholdRatio; break; case MDCSwipeDirectionRight: self.webView.alpha = 0.5f + state.thresholdRatio; break; case MDCSwipeDirectionNone: self.webView.alpha = 0.5f; break; } }; ! [self.webView mdc_swipeToChooseSetup:options];
40.
設定オブジェクトの一例 MDCSwipeToChoose MDCSwipeOptions *options =
[MDCSwipeOptions new]; options.delegate = self; options. *state){ switch (state.direction) { case MDCSwipeDirectionLeft: self.webView.alpha = 0.5f - state.thresholdRatio; break; case MDCSwipeDirectionRight: self.webView.alpha = 0.5f + state.thresholdRatio; break; case MDCSwipeDirectionNone: self.webView.alpha = 0.5f; break; } }; ! [self.webView mdc_swipeToChooseSetup:options];
41.
設定オブジェクトの一例 MDCSwipeToChoose MDCSwipeOptions *options =
[MDCSwipeOptions new]; options.delegate = self; options. *state){ switch (state.direction) { case MDCSwipeDirectionLeft: self.webView.alpha = 0.5f - state.thresholdRatio; break; case MDCSwipeDirectionRight: self.webView.alpha = 0.5f + state.thresholdRatio; break; case MDCSwipeDirectionNone: self.webView.alpha = 0.5f; break; } }; ! [self.webView mdc_swipeToChooseSetup:options];
42.
設定オブジェクトの一例 MDCSwipeToChoose MDCSwipeOptions *options =
[MDCSwipeOptions new]; options.delegate = self; options. *state){ switch (state.direction) { case MDCSwipeDirectionLeft: self.webView.alpha = 0.5f - state.thresholdRatio; break; case MDCSwipeDirectionRight: self.webView.alpha = 0.5f + state.thresholdRatio; break; case MDCSwipeDirectionNone: self.webView.alpha = 0.5f; break; } }; ! [self.webView mdc_swipeToChooseSetup:options];
43.
設定オブジェクトの一例 MDCSwipeToChoose MDCSwipeOptions *options =
[MDCSwipeOptions new]; options.delegate = self; options. *state){ switch (state.direction) { case MDCSwipeDirectionLeft: self.webView.alpha = 0.5f - state.thresholdRatio; break; case MDCSwipeDirectionRight: self.webView.alpha = 0.5f + state.thresholdRatio; break; case MDCSwipeDirectionNone: self.webView.alpha = 0.5f; break; } }; ! [self.webView mdc_swipeToChooseSetup:options];
44.
設定オブジェクトの一例 MDCSwipeToChoose MDCSwipeOptions *options =
[MDCSwipeOptions new]; options.delegate = self; options. *state){ switch (state.direction) { case MDCSwipeDirectionLeft: self.webView.alpha = 0.5f - state.thresholdRatio; break; case MDCSwipeDirectionRight: self.webView.alpha = 0.5f + state.thresholdRatio; break; case MDCSwipeDirectionNone: self.webView.alpha = 0.5f; break; } }; ! [self.webView mdc_swipeToChooseSetup:options];
45.
設定オブジェクトの一例 MDCSwipeToChoose MDCSwipeOptions *options =
[MDCSwipeOptions new]; options.delegate = self; options. *state){ switch (state.direction) { case MDCSwipeDirectionLeft: self.webView.alpha = 0.5f - state.thresholdRatio; break; case MDCSwipeDirectionRight: self.webView.alpha = 0.5f + state.thresholdRatio; break; case MDCSwipeDirectionNone: self.webView.alpha = 0.5f; break; } }; ! [self.webView mdc_swipeToChooseSetup:options];
46.
設定オブジェクトの一例 MDCSwipeToChoose MDCSwipeOptions *options =
[MDCSwipeOptions new]; options.delegate = self; options. *state){ switch (state.direction) { case MDCSwipeDirectionLeft: self.webView.alpha = 0.5f - state.thresholdRatio; break; case MDCSwipeDirectionRight: self.webView.alpha = 0.5f + state.thresholdRatio; break; case MDCSwipeDirectionNone: self.webView.alpha = 0.5f; break; } }; ! [self.webView mdc_swipeToChooseSetup:options];
47.
パラメータ・オブジェクト ブロックのシグネチャの変化を回避する
48.
options.
*view, MDCSwipeDirection direction, CGFloat thresholdRatio){ if (direction == MDCSwipeDirectionLeft) { NSLog(@"Panning to the left..."); } }; パラメータ・オブジェクト ブロックのシグネチャの変化を回避する
49.
options.
*view, MDCSwipeDirection direction, CGFloat thresholdRatio){ if (direction == MDCSwipeDirectionLeft) { NSLog(@"Panning to the left..."); } }; パラメータ・オブジェクト ブロックのシグネチャの変化を回避する
50.
options.
*view, MDCSwipeDirection direction, CGFloat thresholdRatio){ if (direction == MDCSwipeDirectionLeft) { NSLog(@"Panning to the left..."); } }; パラメータ・オブジェクト ブロックのシグネチャの変化を回避する
51.
options.
*view, MDCSwipeDirection direction, CGFloat thresholdRatio){ if (direction == MDCSwipeDirectionLeft) { NSLog(@"Panning to the left..."); } }; パラメータ・オブジェクト ブロックのシグネチャの変化を回避する
52.
options.
*view, MDCSwipeDirection direction, CGFloat thresholdRatio){ if (direction == MDCSwipeDirectionLeft) { NSLog(@"Panning to the left..."); } }; パラメータ・オブジェクト ブロックのシグネチャの変化を回避する options. *state){ MDCSwipeDirection direction = state.direction;
53.
options.
*view, MDCSwipeDirection direction, CGFloat thresholdRatio){ if (direction == MDCSwipeDirectionLeft) { NSLog(@"Panning to the left..."); } }; パラメータ・オブジェクト ブロックのシグネチャの変化を回避する options. *state){ MDCSwipeDirection direction = state.direction;
54.
パラメータ・オブジェクト APIの微調整、バージョニングが可能 @interface MDCPanState :
NSObject ! @property (nonatomic, strong) UIView *view; @property (nonatomic, assign) MDCSwipeDirection direction; @property (nonatomic, assign) CGFloat thresholdRatio; ! @end
55.
パラメータ・オブジェクト APIの微調整、バージョニングが可能 @interface MDCPanState :
NSObject ! @property (nonatomic, strong) UIView *view; @property (nonatomic, assign) MDCSwipeDirection direction; @property (nonatomic, assign) CGFloat thresholdRatio; ! @end DEPRECATED_ATTRIBUTE;
56.
options.
*view, MDCSwipeDirection direction, CGFloat thresholdRatio){ if (direction == MDCSwipeDirectionLeft) { NSLog(@"Panning to the left..."); } }; options. *state){ MDCSwipeDirection direction = state.direction; パラメータ・オブジェクト サポートしないパラメータを少しずつ排除
57.
options.
*view, MDCSwipeDirection direction, CGFloat thresholdRatio){ if (direction == MDCSwipeDirectionLeft) { NSLog(@"Panning to the left..."); } }; options. *state){ MDCSwipeDirection direction = state.direction; パラメータ・オブジェクト サポートしないパラメータを少しずつ排除
58.
options.
*view, MDCSwipeDirection direction, CGFloat thresholdRatio){ if (direction == MDCSwipeDirectionLeft) { NSLog(@"Panning to the left..."); } }; options. *state){ MDCSwipeDirection direction = state.direction; パラメータ・オブジェクト サポートしないパラメータを少しずつ排除
59.
要約 • 継承に頼らないUIコンポーネントを好む • 設定オブジェクトで、クリーンなカスタマイズ用の APIを提供できる •
パラメータ・オブジェクトというデザイン・パター ンは、シグネチャの変化を未然に防ぐ • 特にブロックのパラメータに有用
60.
ご参考までに • 本日のスライド • http://modocache.io/ios-ui-component-api-design •
ぜひフォローして下さい • Twitter: @modocache • GitHub: https://github.com/modocache • JVFloatLabeledTextField • https://github.com/jverdi/JVFloatLabeledTextField • MDCSwipeToChoose(おいらに☆を!) • https://github.com/modocache/MDCSwipeToChoose • 「パラメータ・オブジェクト」デザイン・パターン(英語) • http://c2.com/cgi/wiki?ParameterObject
Download