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

3

我偶尔需要通过编程方式更改NSView的尺寸。为此,有助于获取各个视图的尺寸,相对调整它们,然后使用setFrame:重新定位。

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

我有一个在Interface Builder中设置了NSPanel并与我的主程序建立了各种连接的程序。为了测试frame返回的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个回答

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

您可以轻松地进行矩形日志:
RECTLOG([aTextView frame]);

小伙子,我的脸都红了!谢谢你,Kailoa。我感觉很愚蠢,但我很高兴能够把这件事放在身后。 - Dennis

4

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

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

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

另请参阅:

NSStringFromSize
NSStringFromPoint
NSStringFromRange

etc


我同意。NSStringFrom* 方法是在 NSLog 中使用的最佳方法。它们可以为您提供一些漂亮格式化的结果。 - Alex
是的,唯一的问题是NSStringFromRect在iPhone项目上会生成警告。 在iPhone上,您必须使用NSStringFromCGRect。此外,具有宏包装器可以嵌入变量名称。不过,两种方法都可以。 - amattn
如果您有一个CGRect,请使用type appropriate NSStringFromCGRect。编写代码时,您当然知道变量的类型。此外,请考虑NS_BUILD_32_LIKE_64是否适用于您正在构建的内容,并在适当的情况下使用它。 - Jim Correia

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接