5

これは非常に単純な質問で、答えが見つからないようです。これを行う方法 :

CGRectMake(1, 3, size) 

また

CGRectMake(pointB, size) 

また

 CGRectMake(pointB, size.width, size.height) 

それ以外の

CGRectMake(self.someview.frame.origin.x, self.someview.frame.origin.y, self.someotherview.frame.size.width, self.someotherview.frame.size.height) 

?? ありがとうございました !:)

編集:

メソッドは、CGRectmakeかかりますCGFloat。メソッドの引数としてCGSize、および/またはを取りたいと思います。CGpoint

4

2 に答える 2

9

私はこれがあなたが心に留めていることだと思います:

    - (void) logRects
    {
        CGFloat
            x      = 10.0,
            y      = 20.0,
            width  = 50.0,
            height = 60.0;

        CGPoint point = {x, y};
        CGSize  size  = {width, height};

        CGRect  rect1 = {1, 3, size};
        CGRect  rect2 = {point, size};
        CGRect  rect3 = {point, size.width, size.height};

            //using designated (named) initialisers
        CGRect  rect4 = {.origin.x=3, .origin.y=5, .size = {100,100}};

            //with designated initialisers, order doesn't matter
        CGRect  rect5 = {.size=size, .origin.x=3, .origin.y=5};

        NSLog (@"rect1 %@",NSStringFromCGRect(rect1));
        NSLog (@"rect2 %@",NSStringFromCGRect(rect2));
        NSLog (@"rect3 %@",NSStringFromCGRect(rect3));
        NSLog (@"rect4 %@",NSStringFromCGRect(rect4));
        NSLog (@"rect5 %@",NSStringFromCGRect(rect5));
    }

しかし、ここでの議論に注意してください:
なぜCGRectMakeのような関数を使用するのですか?

この種の複合リテラル構文は、私には読み取りと書き込みがはるかに簡単に思えますが、関数は将来の保証に関しては優位性があります(+オートコンプリートが得られます)。

更新
は、この最近のQ&Aも参照してください。

私が前に見たことがないCGRect構文

于 2013-02-03T22:21:15.183 に答える
6

CGRectMake(1、3、サイズ):

    CGRectMake(1, 3, size.width, size.heigh)

CGRectMake(pointB、size):

    CGRectMake(pointB.x, pointB.y, size.width, size.height)

CGRectMake(pointB、size.width、size.height):

    CGRectMake(pointB.x, pointB.y, size.width, size.height)

CGRectは次のようになります。

struct CGRect {
  CGPoint origin;
  CGSize size;
};
typedef struct CGRect CGRect;

そして、CGPointとCGSizeは次のようになります。

struct CGPoint {
  CGFloat x;
  CGFloat y;
};
typedef struct CGPoint CGPoint;

struct CGSize {
  CGFloat width;
  CGFloat height;
};
typedef struct CGSize CGSize;

CGRectMakeは次の関数です。

CG_INLINE CGRect
CGRectMake(CGFloat x, CGFloat y, CGFloat width, CGFloat height)
{
  CGRect rect;
  rect.origin.x = x; 
  rect.origin.y = y;
  rect.size.width = width; 
  rect.size.height = height;
  return rect;
}

したがって、代わりに:

CGRect r = CGRectMake(pointB.x, pointB.y, size.width, size.height)

あなたは単に書くことができます:

CGRect r;

r.origin = pointB;
r.size = size;

独自のCGRectMakeを作成したい場合は、自由に作成してください。

CG_INLINE CGRect
MyPrivateCGRectMake(CGPoint p, CGSize s)
{
  CGRect rect;
  rect.origin = p;
  rect.size = s;
  return rect;
}

ただし、既存の関数が受け入れる引数を変更する方法はありません。

于 2013-01-28T14:06:35.507 に答える