Странное поведение с NSLog

Я использую 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 настроена. Но почему следующие две строки показывают нуль в этом случае? Не должны ли они сбрасывать значения фрейма?

Заранее спасибо

Ответы

Ответ 1

Как отмечали другие, CGRect является просто структурой и, следовательно, не имеет метода -description (который является тем, что статический метод + stringWithFormat NSString, используемый NSLog, заменяет% @в строке формата). Поэтому вы не можете напрямую передать его NSLog.

Однако нет необходимости выводить какие-либо значения отдельно, например, предлагаемые. Cocoa предоставляет ряд встроенных методов, которые преобразуют несколько структур Core Graphics в строку:

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

И так далее. Поэтому вывод CGRect в виде строки становится сверхлегким:

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

Вы можете найти все эти вспомогательные методы здесь в разделе "Преобразования строк".

Ответ 2

Вы также можете сделать, например, ниже

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

Ответ 3

UIView.frame - это просто CGRect struct (который по очереди содержит CGPoint и CGSize struct). Таким образом, классы не задействованы, и поскольку только классы могут иметь строковое представление, вы можете отобразить 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);

Ответ 4

TextView. 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, если он не распознает объект, который получил.

Ответ 5

В Swift это просто:

println("\(textView.frame)")