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
UIAppearanceを通して カスタムViewクラスを弄る
Search
ninjinkun
February 12, 2014
Technology
2k
4
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
UIAppearanceを通して カスタムViewクラスを弄る
ninjinkun
February 12, 2014
More Decks by ninjinkun
See All by ninjinkun
買収から2ヶ月でシステム統合した話
ninjinkun
0
180
Designer's and Engineer's Thinking Styles
ninjinkun
0
320
Launchable Webinar テストを効率化して生産性を上げる方法
ninjinkun
2
620
ディープリンクの 設計と実装 - iOSDC2017
ninjinkun
18
11k
スマートフォンアプリ開発における共創的な開発チーム
ninjinkun
61
19k
ReSwiftでアプリの状態管理 / Reactive Swift Meetup
ninjinkun
9
17k
フリルのアプリ開発今昔物語
ninjinkun
3
2.3k
プロトタイピング合宿によるデザインリニューアル
ninjinkun
1
3.2k
デザイナーが仕事をしやすいアプリエンジニアを考える
ninjinkun
4
760
Other Decks in Technology
See All in Technology
8bit CPU 2026
koba789
7
3k
dbt in Microsoft Fabric
ryomaru0825
0
300
Introduction to Bill One Development Engineer
sansan33
PRO
0
480
Claude Codeの体系的な理解と知識のフック
oikon48
8
6.1k
MCPを待つな、パスキーを拡げよう(OAuth/OIDC Numa (Immersion) Workshop 2026)
oidfj
PRO
0
360
ブラウザで変わるID連携(OAuth/OIDC Numa (Immersion) Workshop 2026)
oidfj
PRO
0
360
顧客の要望は2次情報である 〜アンテナを張るFDEの構造論〜
noriakioji
5
1k
1.5時間を無駄にして学んだwsl2におけるaptとsnapの選択と仕組み
yosaka0123
0
470
サービス内で複数のOP・ASを連鎖させる(OAuth/OIDC Numa (Immersion) Workshop 2026)
oidfj
PRO
0
350
名刺メーカーDevグループ 紹介資料
sansan33
PRO
0
1.2k
[ホンマでっか SRE] あなたはなぜ SRE に?
_awache
0
430
EUDIWの枠組みを出発点に民間エコシステムの在り方を考える(OAuth/OIDC Numa (Immersion) Workshop 2026)
oidfj
PRO
0
350
Featured
See All Featured
Why You Should Never Use an ORM
jnunemaker
PRO
61
10k
Thoughts on Productivity
jonyablonski
76
5.3k
コードの90%をAIが書く世界で何が待っているのか / What awaits us in a world where 90% of the code is written by AI
rkaga
63
45k
Bridging the Design Gap: How Collaborative Modelling removes blockers to flow between stakeholders and teams @FastFlow conf
baasie
0
670
Paper Plane (Part 1)
katiecoart
PRO
1
10k
AI Search: Where Are We & What Can We Do About It?
aleyda
0
7.8k
Unlocking the hidden potential of vector embeddings in international SEO
frankvandijk
0
900
The Anti-SEO Checklist Checklist. Pubcon Cyber Week
ryanjones
0
220
Collaborative Software Design: How to facilitate domain modelling decisions
baasie
1
290
Navigating Algorithm Shifts & AI Overviews - #SMXNext
aleyda
1
1.6k
SEO in 2025: How to Prepare for the Future of Search
ipullrank
3
3.8k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
31
10k
Transcript
6*"QQFBSBODFΛ௨ͯ͠ ΧελϜ7JFXΫϥεΛ࿔Δ ninjinkun
ࠓ͓͍͑ͨ͜͠ͱ w ΧελϜ7JFXΫϥεΛ࡞Δͷʹ6*"QQFBSBODF͕ศར
6*"QQFBSBODFͱ w 6*"QQFBSBODFΛ࣮͍ͯ͠ΔΦϒδΣΫτͷσϑΥ ϧτϓϩύςΟΛมߋͰ͖ΔΈ w 6*7JFX6*"QQFBSBODFΛ࣮͍ͯ͠Δ w ࣗͰఆٛͨ͠ϓϩύςΟมߋͰ͖Δ
ϘλϯΛ࡞Δ w ઢ͖ͷϘλϯΛ͍͍ͨ w ৭ͷόϦΤʔγϣϯ͕͋Δ ྫ͑͜ΜͳγνϡΤʔγϣϯ
ϘλϯΛ࡞Δ w ը૾Ͱ͕ΜΔ w #VUUPO#VJMEFSΛͭ͘Δ w YJC TUPSZCPBSEͰ͑ͳ͍ w ϕʔεΫϥεΛ࡞ͬͯࢠΫϥεͰΦʔόʔϥΠυ͢Δ
w ϕʔεΫϥεΛ࡞ͬͯࢠΫϥεΛ6*"QQFBSBODFͰૢ ࡞͢Δ ߟ͑ΒΕΔํ๏
ϘλϯΛ࡞Δ w ͖ϘλϯͷϕʔεΫϥεΛ࡞Δ ϕʔεΫϥεΛ࡞ͬͯࢠΫϥεΛ6*"QQFBSBODFͰૢ࡞͢Δ @interface NJKBaseButton : UIButton ! @property
(nonatomic) UIColor *borderColor UI_APPEARANCE_SELECTOR; @property (nonatomic) CGFloat borderWidth UI_APPEARANCE_SELECTOR; @property (nonatomic) CGFloat cornerRadius UI_APPEARANCE_SELECTOR; ! @end
@implementation NJKBaseButton ! - (id)initWithFrame:(CGRect)frame { … } ! -
(id)initWithCoder:(NSCoder *)aDecoder { … } ! - (void)setupViews { self.layer.masksToBounds = YES; ! // avoid storybord overriding UIColor *color = [[[self class] appearance] titleColorForState:UIControlStateNormal]; if (color) { [self setTitleColor:color forState:UIControlStateNormal]; } } ! - (void)setBorderColor:(UIColor *)borderColor { _borderColor = borderColor; self.layer.borderColor = borderColor.CGColor; } ! - (void)setBorderWidth:(CGFloat)borderWidth { _borderWidth = borderWidth; self.layer.borderWidth = borderWidth; } ! - (void)setCornerRadius:(CGFloat)cornerRadius { _cornerRadius = cornerRadius; self.layer.cornerRadius = cornerRadius; } ! @end
ϘλϯΛ࡞Δ w ϕʔεΫϥεΛܧঝͯ͠৭͖ͭϘλϯͷΫϥεΛ࡞Δ w ΫϥεΛ࡞Δ͚ͩͰ࣮ۭ ϕʔεΫϥεΛ࡞ͬͯࢠΫϥεΛ6*"QQFBSBODFͰૢ࡞͢Δ @interface NJKBlueButton : NJKBaseButton
@end ! @interface NJKBlueLineButton : NJKBaseButton @end ! @interface NJKGreenButton : NJKBaseButton @end ! ! @implementation NJKBlueButton @end ! @implementation NJKBlueLineButton @end ! @implementation NJKGreenButton @end
ϘλϯΛ࡞Δ w ৭ͷఆٛ6*"QQFBSBODFΛ௨ͯ͠ผͷίʔυͰࢦఆ ͢Δ ϕʔεΫϥεΛ࡞ͬͯࢠΫϥεΛ6*"QQFBSBODFͰૢ࡞͢Δ @implementation NJKTheme ! + (void)initialize
{ [[NJKBaseButton appearance] setCornerRadius:4.0]; ! ! [[NJKBlueButton appearance] setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal]; ! ! [[NJKBlueLineButton appearance] setBorderWidth:1.0]; [[NJKBlueLineButton appearance] setTitleColor:[UIColor blueColor] forState:UIControlStateNormal]; [[NJKBlueLineButton appearance] setBorderColor:[UIColor blueColor]]; } ! @end
@implementation NJKTheme ! + (void)initialize { ! [[NJKBaseButton appearance] setCornerRadius:4.0];
! ! [[NJKBlueButton appearance] setTitleColor:[UIColor colorWithString:@"#ffffff"] forState:UIControlStateNormal]; [[NJKBlueButton appearance] setBackgroundImage:[UIImage imageWithColor:[UIColor colorWithString:@"#3498DB"]] forState:UIControlStateNormal]; [[NJKBlueButton appearance] setBackgroundImage:[UIImage imageWithColor:[UIColor colorWithString:@"#2980B9"]] forState:UIControlStateHighlighted]; ! ! [[NJKBlueLineButton appearance] setBorderWidth:1.0]; [[NJKBlueLineButton appearance] setTitleColor:[UIColor colorWithString:@"#3498DB"] forState:UIControlStateNormal]; [[NJKBlueLineButton appearance] setTitleColor:[UIColor colorWithString:@"#ffffff"] forState:UIControlStateHighlighted]; [[NJKBlueLineButton appearance] setBorderColor:[UIColor colorWithString:@"#3498DB"]]; [[NJKBlueLineButton appearance] setBackgroundImage:[UIImage imageWithColor:[UIColor colorWithString:@"#3498DB"]] forState:UIControlStateHighlighted]; ! } ! @end
ϝϦοτ w ࣮ͱςʔϚ͕Ͱ͖Δ w Ϙλϯ࣮Ϋϥε w ςʔϚΫϥε w )5.-$44ͷؔ w
1JYBUF /6* /JNCVT
'"2 w ଟஈܧঝʹͳΔ͚Ͳʜ w ΦʔόʔϥΠυͯ͠ৼΔ͍Λม͍͑ͯΔ༁Ͱͳ͍ w ม͑ΔͷॳظͷΈ w ܧঝͱݴ͏ΑΓ໊લΛม͍͑ͯΔ͚ͩ
·ͱΊ w ΧελϜ7JFXΛ6*"QQFBSBODF͔Βૢ࡞͢Δͱ ࣮ͱςʔϚ͕Ͱ͖ͯḿΔ