LoginSignup
11
11

More than 5 years have passed since last update.

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

Last updated at Posted at 2014-03-12

目的

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

最後に

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

11
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
11