3

我偶尔想以编程方式更改 NSView 的尺寸。为此,获取各种视图的尺寸,相对于彼此调整它们,然后使用 setFrame: 重新定位是有帮助的。

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

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

这是我的 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) 界面生成器在“尺寸和位置”下的检查器中显示正确的帧尺寸。

简而言之,该程序的其他所有内容都运行良好。实际上似乎框架尺寸设置不正确或其他什么。

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

4

2 回答 2

9

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

将 NSLog 字符串更改为:

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

编辑:

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

#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 ));

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

RECTLOG([aTextView frame]);
于 2009-07-14T19:33:31.023 回答
4

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

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

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

也可以看看:

NSStringFromSize
NSStringFromPoint
NSStringFromRange

ETC

于 2009-07-14T20:08:46.070 回答