みなさんInterface BuilderやStoryboardは使っているでしょうか?
自分は作り込みのしやすさからコードでViewを構築することの方が多いです。
その際、できるだけiPhoneかiPadかで処理を分けずに対応したいのですが、どうしてもViewのサイズやフォントサイズ、マージンなどの定数値を分けたい時があります。
「iPhoneの時は幅100ptでiPadのときは幅200ptにしたい」などですね。
そもそも絶対値ではなくて相対的に定まるようにした方がいいだろ、とか突っ込みはあるかと思いますが、どうしても避けられない時もあるのです(たぶん、、、)
その際にどうやって対応しているのかを参考程度に共有いたします。
僕の場合は処理分けの箇所が多いときは別途カテゴリに定数をまとめます。
YPPView+ViewSpec.h
#import "YPPView.h"
@interface YPPView (ViewSpec)
+(CGFloat)itemWidth;
@end
YPPView.ViewSpec.m
#import "YPPView+ViewSpec.h"
static const CGFloat kItemWidthForPhone = 100.f;
static const CGFloat kItemWidthForPad = 200.f;
@implementation YPPView (ViewSpec)
+(CGFloat)itemWidth
{
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad){
return kItemWidthForPad;
} else {
return kItemWidthForPhone;
}
}
@end
YPPView.m
-(void)layoutSubviews
{
[super layoutSubviews];
self.item.frame = CGRectMake(0.f, 0.f, [self.class itemWidth], 50.f);
}
カテゴリに分けるとViewの実装部に分岐が入らずにスッキリします。
どうしても処理分けが必要で、かつ箇所が多い場合はこんな感じで対応しています。
ちなみに、こんな風にもアクセスできます。
YPPView.m
-(void)layoutSubviews
{
[super layoutSubviews];
self.item.frame = CGRectMake(0.f, 0.f, YPPView.itemWidth, 50.f);
}
クラス変数風でかっこいいですね!
補完効かないみたいですけど。
自分使ってませんけど。