为什么NSView的框架方法返回错误的结果?

时间:2009-07-14 19:27:23

标签: cocoa formatting nsview nslog

我偶尔想要改变一个NSView的维度。要做到这一点,获取各种视图的尺寸,相对于彼此调整它们,然后使用setFrame:重新定位是有帮助的。

问题在于,从我的角度来看,框架方法通常会返回明显错误的NSRect。

我有一个程序,在Interface Builder中设置了NSPanel,并且与我的主程序有各种连接。为了测试框架返回的NSRects,我在应用程序的awakeFromNib:方法中打开了面板,检索了一些NSRects,并将它们打印到控制台。

这是我的awakeFromNib:

- (void)awakeFromNib {
  NSLog(@"in awakeFromNib");
  [self showPrefsSheet:self]; //this is the prefs sheet with the controls of interest
                              //note that it does indeed pop up and is displayed
  originalFrame = [aTextView frame];
  NSLog(@"the frame is %d, %d, %d, %d", originalFrame.origin.x, originalFrame.origin.y, originalFrame.size.width, originalFrame.size.height);
  originalFrame = [aButton frame];
  NSLog(@"the frame is %d, %d, %d, %d", originalFrame.origin.x, originalFrame.origin.y, originalFrame.size.width, originalFrame.size.height);
  return;
  }

此代码的结果在控制台中如下所示:

in awakeFromNib
the frame is 0, 0, 0, 0
the frame is 0, 1079230464, 0, 1078329344

注意(i)面板和两个控件都显示在屏幕上; (ii)我知道这些插座是正确连接的,因为我可以通过编程方式对控件进行操作并让它们工作; (iii)界面构建器在“尺寸和位置”下的检查器中显示正确的框架尺寸。

简而言之,该计划的其他一切工作都很完美。实际上似乎框架尺寸没有正确设置或其他东西。

有人可以告诉我如何检索真实的帧信息吗?或者至少解释我看到的结果?

2 个答案:

答案 0 :(得分:9)

帧坐标是浮点数,但您的日志消息使用的是%d。 (整数)。

将NSLog字符串更改为:

@"the frame is %f, %f, %f, %f"

编辑:

这是我在调试rects时使用的一个非常有用的宏:

#define RECTLOG(rect)    (NSLog(@""  #rect @" x:%f y:%f w:%f h:%f", rect.origin.x, rect.origin.y, rect.size.width, rect.size.height ));

然后你可以做简单的直接日志:

RECTLOG([aTextView frame]);

答案 1 :(得分:4)

记录NSRect时,请记住这些字段是浮点值,而不是整数。

不是自己编写格式说明符(内联或通过宏),而是使用框架为您提供的函数:

NSLog(@"frame - %@", NSStringFromRect([view frame]));

另见:

NSStringFromSize
NSStringFromPoint
NSStringFromRange