我偶尔想要改变一个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)界面构建器在“尺寸和位置”下的检查器中显示正确的框架尺寸。
简而言之,该计划的其他一切工作都很完美。实际上似乎框架尺寸没有正确设置或其他东西。
有人可以告诉我如何检索真实的帧信息吗?或者至少解释我看到的结果?
答案 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
等