目的
Autolayoutのお陰でUIViewのframeを変更することは少なくなったはずですが、なんやかんや面倒なこともあります。
- viewをsuperviewの右上に配置したい
- 左右中心・下端に沿って設置しているviewを下端に沿ったままリサイズしたい
- AspectFitさせる時のframeを取得したい
こんなことを少し便利に行うために関数を作りました。
この関数を使うと CGRectの右上の座標を{320,0}にしたい とか 右端の位置は固定で、幅を変更したい などが簡単にかけます。
github
https://github.com/siagency/SIATools/tree/master/SIATools/SIATools/Extensions
ここのSIAGeometry.{h,m}です。
インタフェース
CGRect SIACGRectMove(CGRect rect, CGFloat x, CGFloat y, CGFloat relativeX, CGFloat relativeY);
CGRect SIACGRectExpand(CGRect rect, CGFloat widthAmount, CGFloat heightAmount, CGFloat relativeX, CGFloat relativeY);
CGRect SIACGRectResize(CGRect rect, CGFloat width, CGFloat height, CGFloat relativeX, CGFloat relativeY);
CGPoint SIACGRectGetPoint(CGRect rect, CGFloat relativeX, CGFloat relativeY);
CGRect SIACGRectContentMode(CGRect rect, CGRect parentRect, UIViewContentMode contentMode);
他にもありますが今回は上記の関数をみていきます。
使い方
SIACGRectContentMode以外で指定しているrelativeX/relativeYは、それぞれ注目する位置を0.0-1.0で指定します。
- relativeX
左端を0.0/右端を1.0として指定する。 - relativeY
上端を0.0/下端を1.0として指定する。
SIACGRectMove
- rect
基準となるCGRectを指定する。 - x/y
移動後のx座標/y座標。 - relativeX, relativeY
rectのどの位置を{x,y}に移動するか指定する。
0.0,0.0
を指定した場合、rectの左上の座標が{x,y}となるように移動する。
1.0,1.0
を指定した場合、rectの右下の座標が{x,y}となるように移動する。
0.2,0.8
を指定した場合、rectのx+w*0.2
y+h*0.8
の位置がx,yとなるように移動する。
SIACGRectExpand
- rect
基準となるCGRectを指定する。 - widthAmount/heightAmount
rectの幅と高さに対しwidthAmount/heightAmountを追加する。 - relativeX/relativeY
拡縮する時の中心になる位置を指定する。
0.0,0.0
を指定した場合、rectの左上の位置が変わらず、大きさが変更される。
1.0,1.0
を指定した場合、rectの右下の位置が変わらず、大きさが変更される。
0.2,0.8
を指定した場合、rectのx+w*0.2
y+h*0.8
の位置が変わらず、大きさが変更される。 x軸では、widthAmount*0.2
分左に移動した状態で幅が変更される。
SIACGRectResize
SIACGRectExpandと異なり、変更量ではなくリサイズ後の幅と高さを指定する。
SIACGRectGetPoint
- rect
基準となるCGRect。 - relativeX
0.0
を指定した場合、戻り値のCGPointのxはCGRectGetMinXの値になる。0.5
ならCGRectGetMidX、1.0
ならCGRectGetMaxXと同等。0.2
や0.3
と言った数値も指定可能。 - relativeY
relativeXのY軸版。
SIACGRectContentMode
- rect
基準となるCGRectを指定する。 - parentRect
UIViewでcontentModeを指定する場合の、superviewに相当するUIViewのboundsに相当。 - contentMode
parentRectのsuperviewに、rectのviewをaddSubview:し、contentModeを指定した場合のviewのframeに相当する値を返す。
なおUIViewContentModeRedrawを指定した場合は無視されます(rectがそのまま返る)。
最後に
わりとよくやる計算だと思うんだけど…… 標準では用意してくれないのか。