13

我正在使用 NSLog 来检查 UITextView。我的代码中有以下日志记录语句:

    NSLog(@"textView: %@",textView);
    NSLog(@"textView.frame: %@",textView.frame);
    NSLog(@"[textView frame]: %@",[textView frame]);

在控制台的输出中,我得到以下信息:

2010-11-29 22:00:38.252 MenuMaker[57602:207] textView: <UITextView: 0x3b3afe0; frame = (0 0; 320 387); text = 'blah...'; clipsToBounds = YES; autoresize = RM+BM; layer = <CALayer: 0x3b3afa0>>
2010-11-29 22:00:38.254 MenuMaker[57602:207] textView.frame: (null)
2010-11-29 22:00:38.254 MenuMaker[57602:207] [textView frame]: (null)

输出的第一行,因为它包含 'frame = (0 0; 320 387)' 位,让我相信 UITextView 的 frame 变量已全部设置。但是为什么在这种情况下接下来的两行显示为 null 呢?他们不应该转储框架的值吗?

提前致谢

4

5 回答 5

50

正如其他人所指出的,CGRect 只是一个结构,因此缺少 -description 方法(这是 NSLog 使用的 NSString 的 +stringWithFormat 静态方法在格式字符串中替换 %@ 的方法)。因此,您不能直接将其传递给 NSLog。

但是,不需要像建议的那样单独输出任何值。Cocoa 提供了许多内置方法,可以将多个 Core Graphics 结构呈现为字符串:

NSStringFromCGRect()
NSStringFromCGPoint()
NSStringFromCGSize()
NSStringFromCGAffineTransform()

等等。因此,以字符串的形式输出 CGRect 变得超级简单:

NSLog(@"%@", NSStringFromCGRect(rect));

您可以在“字符串转换”下 找到所有这些帮助方法。</p>

于 2010-11-29T12:23:26.623 回答
10

你也可以像下面这样

NSLog(@"%@",[NSValue valueWithCGRect:textView.frame]);
于 2010-11-29T11:49:55.850 回答
4

UIView.frame只是一个CGRect结构(它又包含一个CGPoint和一个CGSize结构)。所以不涉及任何类,并且因为只有类可以有字符串表示,所以你会得到 display null。如果你想要框架的值,你必须做的是这样的:

NSLog(@"textView.frame origin: %f %f", textView.frame.origin.x, textView.frame..origin.y);
NSLog(@"textView.frame size: %f %f", textView.frame.size.width, textView.frame.size.height);
于 2010-11-29T11:19:39.403 回答
3

文本视图。frame 将返回一个 CGRect 值。因此,如果您想知道 textView 的帧值

NSLog(@"textView frame height: %f",textView.frame.size.height);
NSLog(@"textView frame width: %f",textView.frame.size.width);
NSLog(@"textView frame x Position: %f",textView.frame.origin.x);
NSLog(@"textView frame y Position: %f",textView.frame.origin.y);

当 NSLog 无法识别接收到的对象时,它将将该值视为 null。

于 2010-11-29T11:19:54.153 回答
-1

在 Swift 中很简单:

println("\(textView.frame)")
于 2014-11-24T10:07:15.787 回答