Edited at

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

More than 5 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がそのまま返る)。


最後に

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