Как я могу получить внутренний / клиентский размер подкласса NSView? - PullRequest
1 голос
/ 11 мая 2009

Я делаю раскладку вручную для своего приложения Какао, и в какой-то момент мне нужно выяснить, каков внутренний размер подкласса NSView. (Например, какая высота доступна для моего дочернего вида внутри NSBox?)

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

Я не мог найти способ получить этот размер до сих пор и был бы рад, если кто-то может дать мне подсказку.

Еще одно очень интересное свойство, которое я хотел бы знать, - это минимальный размер представления.

Ответы [ 4 ]

5 голосов
/ 11 мая 2009

-bounds - это то, что вы ищете в большинстве представлений. NSBox, однако, представляет собой особый случай, так как вы хотите посмотреть на границы представления содержимого блока, а не на границы самого представления поля (представление вида включает заголовок, ребра и т. Д.). Кроме того, прямоугольник границ всегда является реальным размером поля, в то время как прямоугольник кадра можно изменить относительно границ, чтобы применить преобразования к содержимому представления (например, сжатие изображения 200x200 в кадр 200x100).

Итак, для большинства представлений вы просто используете [parentView bounds], а для NSBox вы будете использовать [[theBox contentView] bounds], и вы будете использовать [[theBox contentView] addSubview: myView] вместо [parentView addSubview: myView] для добавления своего контента.

5 голосов
/ 11 мая 2009

К сожалению, не существует стандартного способа сделать это для всех подклассов NSView. В вашем конкретном примере положение и размер дочернего представления в пределах NSBox можно вычислить следующим образом:

NSRect availableRect = [someNSBox bounds];
NSSize boxMargins = [someBox contentViewMargins];
availableRect = NSInsetRect(availableRect, boxMargins.width, boxMargins.height);

Если вы часто используете это, вы можете создать категорию на NSBox следующим образом:

// MyNSBoxCategories.h
@interface NSBox (MyCategories)
- (NSRect)contentFrame;
@end


// MyNSBoxCategories.m
@implementation NSBox (MyCategories)
- (NSRect)contentFrame
{
    NSRect frameRect = [self bounds];
    NSSize margins = [self contentViewMargins];
    return NSInsetRect(frameRect, margins.width, margins.height);
}
@end

И вы бы использовали это так:

#import "MyNSBoxCategories.h"

//...

NSRect frameRect = [someNSBox contentFrame];
[myContentView setFrame:frameRect];
[someNSBox addSubview:myContentView];
0 голосов
/ 11 мая 2009

Я не уверен (мне никогда не приходилось слишком углубляться в это), но не так ли [NSView bounds]?

http://www.cocoadev.com/index.pl?DifferenceBetweenFrameAndBounds

0 голосов
/ 11 мая 2009

Свойство bounds NSView возвращает NSRect с источником (обычно (0,0)) и размером NSView. См. эту страницу документации Apple Developer .

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