Objective-C
iOS
CGRect

UIViewの移動やリサイズに便利なCGRect関連の関数を作りました

More than 3 years have passed since last update.

目的

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.20.3と言った数値も指定可能。
  • relativeY
    relativeXのY軸版。

SIACGRectContentMode

  • rect
    基準となるCGRectを指定する。
  • parentRect
    UIViewでcontentModeを指定する場合の、superviewに相当するUIViewのboundsに相当。
  • contentMode
    parentRectのsuperviewに、rectのviewをaddSubview:し、contentModeを指定した場合のviewのframeに相当する値を返す。
    なおUIViewContentModeRedrawを指定した場合は無視されます(rectがそのまま返る)。

最後に

わりとよくやる計算だと思うんだけど…… 標準では用意してくれないのか。