我想获得主屏幕的尺寸,所以我使用这个片段:
NSLog(@"mainScreen frame = %@", [[NSScreen mainScreen] visibleFrame]);
正在打印
mainScreen frame = (null)
之前它正在打印主显示器的预期尺寸。
有什么可能的原因?
答案 0 :(得分:9)
这里的问题是你正在遇到Objective-C Cocoa编程中相对较少的非对象之一。
“visibleFrame”的结果是NSRect 结构,而不是对象。要使它在NSLog行中有意义地显示,您必须执行以下操作:
NSString* frameAsString = NSStringFromRect([[NSScreen mainScreen] visibleFrame]);
NSLog(@"mainScreen frame = %@", frameAsString);
有一些辅助函数可以将许多这些结构对象转换为字符串并返回,例如NSStringFromPoint,NSStringFromRange等
答案 1 :(得分:2)
需要仔细阅读有关此文档的文档。 Apple定义的“主屏幕”不一定是菜单栏的屏幕。 “主屏幕”是接收键盘事件的屏幕。如果由于某种原因操作系统认为没有屏幕具有键盘焦点,那么我就能理解为什么mainScreen会返回NULL。
要使用菜单栏(原点为(0,0))获取屏幕,您需要使用:
[[NSScreen screens] objectAtIndex:0]
我从未见过这个返回NULL,虽然我不会说它不可能发生。
答案 2 :(得分:1)
-visibleFrame返回一个NSRect结构,而您正在为对象使用字符串说明符。您需要使用NSStringFromRect()函数(我相信它被调用)将rect转换为NSLog()的字符串对象。
答案 3 :(得分:0)
你试图记录一个对象,但该方法没有返回一个对象,它返回一个结构。
虽然NSStringFromRect可以帮助您进行日志记录,但您可能希望其他地方有实际的整数。
您可以通过以下方式完成这两项:
NSLog(@"screen is %.2f wide and %.2f high", [[[NSScreen screens]
objectAtIndex:0] visibleFrame].size.width, [[[NSScreen screens]
objectAtIndex:0] visibleFrame].size.height);