Почему метод фрейма NSView возвращает неправильные результаты? - PullRequest
3 голосов
/ 14 июля 2009

Я иногда хочу программно изменить размеры NSView. Для этого полезно получить размеры различных видов, настроить их относительно друг друга, а затем использовать setFrame: для изменения положения.

Проблема в том, что метод frame обычно возвращает NSRects, которые, на мой взгляд, явно неверны.

У меня есть программа с NSPanel, настроенная в Интерфейсном Разработчике, и различные соединения с моей основной программой. Чтобы проверить NSRect, возвращаемые по фрейму, я открыл панель в методе awakeFromNib: моего приложения, получил несколько NSRect и распечатал их в консоли.

Вот мой бодрствующий отNib:

- (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 голосов
/ 14 июля 2009

Координаты фрейма плавающие, но в ваших сообщениях журнала используется% 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]);
4 голосов
/ 15 июля 2009

При регистрации NSRect помните, что поля являются значениями с плавающей запятой, а не целыми числами.

Вместо того, чтобы самостоятельно писать спецификаторы формата (встроенные или через макрос), используйте функции, которые предоставляет вам фреймворк:

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

Смотри также:

NSStringFromSize
NSStringFromPoint
NSStringFromRange

и т.д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...