UIViewやUIViewを継承するクラス(UIButtonやUIImageViewなど)は座標の設定にframeプロパティを用います。
例えばユーザが自由に配置した画像の下にボタンが追従するようにしたいなど、UIViewの大きさは変えずに座標のみをいじりたいという事はよくあります。
CGRectOffsetという座標を変えるためのメソッドもありますが、相対的な移動方法である為、絶対値として設定したい場合には不向きです。
絶対値として座標を設定したい場合frame.orizinを変えれば良いのですが、frameはプロパティでありoriginはCGRect構造体のメンバという差があるため
xxxView.frame.origin = CGPointMake(10, 100);
といった設定はできません。
一度frameプロパティをCGRect構造体として取り出し、originを書き換えたのちにframeプロパティに設定するという面倒な手順が必要となります。
CGRect newFrame = xxxView.frame;
newFrame.origin = CGPointMake(10, 100);
xxxView.frame = newFrame;
ただ座標を変えるだけのためにこのコードを毎回書くのは面倒ですので、座標に直接アクセスできるプロパティを追加します。
以下のコードはUIViewを拡張してpositionというプロパティを追加しています。
【UIView+Position.h】
// positionプロパティを追加したUIView拡張クラス
@interface UIView (Position)
@property (nonatomic) CGPoint position;
@end
【UIView+Position.m】
@implementation UIView (Position)
@dynamic position;
- (CGPoint)position
{
return self.frame.origin;
}
- (void)setPosition:(CGPoint)position
{
self.frame = CGRectMake(position.x, position.y, self.frame.size.width, self.frame.size.height);
}
@end
内部の処理は至極単純で、自身のframeプロパティを書き換えているのみです。
UIView+Position.hをインポートするだけでUIView及びUIViewを継承しているクラスでpositionプロパティが使用できます。
xxxView.position = CGPointMake(10, 100);
コメントする