代码之家  ›  专栏  ›  技术社区  ›  Kristina

为什么NSRect和CGRect是不兼容的类型?

  •  7
  • Kristina  · 技术社区  · 16 年前

    好吧,我担心一个错误:

    “initWithFrame:”的第1个

    这就是原因:

    operationLabel = [[NSTextField alloc] initWithFrame:CGRectMake(0, self.frame.size.height / 2 - (40 * 3), self.frame.size.width, 100)];
    

    - (id)initWithFrame:(NSRect)frameRect;
    

    第一个参数是NSRect,让我们检查一下:

    typedef CGRect NSRect;
    

    怎么会出错呢? 他们是同一类型的不同命名!

    3 回复  |  直到 16 年前
        1
  •  9
  •   Jens Ayton    16 年前

    NSRect 类型与 CGRect NS_BUILD_32_LIKE_64 在命令行或前缀头中将定义为1。

    或者,引用NSGeometry.h:

    #if __LP64__ || TARGET_OS_EMBEDDED || TARGET_OS_IPHONE || TARGET_OS_WIN32 || NS_BUILD_32_LIKE_64
    
        2
  •  11
  •   Eiko    16 年前

    除了zoul的回答之外,我还想提到Apple的两个助手函数(宏?)(从10.5开始):

    NSRect NSRectFromCGRect(CGRect cgrect)
    CGRect NSRectToCGRect(NSRect nsrect)
    
        3
  •  3
  •   zoul    16 年前

    你从哪里得到的typedef的定义 NSRect ? 根据文件 NSRect公司

    typedef struct _NSRect {
          NSPoint origin;
          NSSize size;
    } NSRect;
    

    换句话说,它的结构看起来就像 CGRect typedef ). 已经有人写过了 conversions between CGRect and NSRect .