【问题标题】:Define CGRectmake with CGPoint and/or CGSize用 CGPoint 和/或 CGSize 定义 CGRectmake
【发布时间】:2013-01-28 14:01:32
【问题描述】:

这是一个非常简单的问题,我似乎无法找到答案。 如何做到这一点:

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 作为方法的参数。

【问题讨论】:

标签: objective-c syntax cgrect cgrectmake


【解决方案1】:

我想这就是你的想法:

    - (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));
    }

但请注意这里的讨论:
Why use functions like CGRectMake?

在我看来,这种复合文字语法更容易阅读和编写,尽管函数在未来验证方面具有优势(+ 你会自动完成)。

更新
另请参阅最近的问答:

CGRect syntax I haven't seen before

【讨论】:

    【解决方案2】:

    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;
    }
    

    但是您无法更改已经存在的函数接受哪些参数。

    【讨论】:

    • 其实这就是我想要避免的!如果你有 pointB 和 size,为什么要重写 .x、.y、.width 或 .height?您的答案采用 CGFloats。我希望 CGRectmake 采用 CGSize 和/或 CGpoint int 方法
    • @Plot CGRectMake 的行为方式与定义的方式相同,而不是您希望的方式。 CGRectMake 根本不是那样工作的,不可能改变它的工作方式。如果你愿意,你可以编写自己的函数,MyCGRectMake 以点和大小为参数,但是你无法更改CGRectMake 的参数。
    • 您可以定义一个宏,但您仍然必须将其命名为与CGRectMake 不同的名称,否则宏会递归调用自身,从而导致编译错误。
    猜你喜欢
    • 2012-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多