Какао NSView изменяет свойства авторазмера

Используя конструктор интерфейса, вы можете выбрать углы, которым должен придерживаться объект при изменении размера. Как вы можете сделать это программно?

Интерфейсный Разработчик

4 ответа

Решение

См. SetAutoresizingMask: метод NSView и соответствующие маски изменения размера.

Я считаю, что autoresizingBit Маски ужасно названы, поэтому я использую категорию в NSView, чтобы сделать вещи немного более явными:

// MyNSViewCategory.h:
@interface NSView (myCustomMethods)

- (void)fixLeftEdge:(BOOL)fixed;
- (void)fixRightEdge:(BOOL)fixed;
- (void)fixTopEdge:(BOOL)fixed;
- (void)fixBottomEdge:(BOOL)fixed;
- (void)fixWidth:(BOOL)fixed;
- (void)fixHeight:(BOOL)fixed;

@end


// MyNSViewCategory.m:
@implementation NSView (myCustomMethods)

- (void)setAutoresizingBit:(unsigned int)bitMask toValue:(BOOL)set
{
    if (set)
    { [self setAutoresizingMask:([self autoresizingMask] | bitMask)]; }
    else
    { [self setAutoresizingMask:([self autoresizingMask] & ~bitMask)]; }
}

- (void)fixLeftEdge:(BOOL)fixed
{ [self setAutoresizingBit:NSViewMinXMargin toValue:!fixed]; }

- (void)fixRightEdge:(BOOL)fixed
{ [self setAutoresizingBit:NSViewMaxXMargin toValue:!fixed]; }

- (void)fixTopEdge:(BOOL)fixed
{ [self setAutoresizingBit:NSViewMinYMargin toValue:!fixed]; }

- (void)fixBottomEdge:(BOOL)fixed
{ [self setAutoresizingBit:NSViewMaxYMargin toValue:!fixed]; }

- (void)fixWidth:(BOOL)fixed
{ [self setAutoresizingBit:NSViewWidthSizable toValue:!fixed]; }

- (void)fixHeight:(BOOL)fixed
{ [self setAutoresizingBit:NSViewHeightSizable toValue:!fixed]; }

@end

Который затем можно использовать следующим образом:

[someView fixLeftEdge:YES];
[someView fixTopEdge:YES];
[someView fixWidth:NO];

Каждое представление имеет маску флагов, контролируемую установкой свойства autoresizingMask с ИЛИ поведения, которое вы хотите получить от масок изменения размера. Кроме того, суперпредставление необходимо настроить для изменения размера его подпредставлений.

Наконец, в дополнение к базовым опциям изменения размера, определенным маской, вы можете полностью контролировать макет подпредставлений, реализуя -resizeSubviewsWithOldSize:

Ответ @e.James дал мне идею просто создать новый enum с более привычными именами:

typedef NS_OPTIONS(NSUInteger, NSViewAutoresizing) {
    NSViewAutoresizingNone                 = NSViewNotSizable,
    NSViewAutoresizingFlexibleLeftMargin   = NSViewMinXMargin,
    NSViewAutoresizingFlexibleWidth        = NSViewWidthSizable,
    NSViewAutoresizingFlexibleRightMargin  = NSViewMaxXMargin,
    NSViewAutoresizingFlexibleTopMargin    = NSViewMaxYMargin,
    NSViewAutoresizingFlexibleHeight       = NSViewHeightSizable,
    NSViewAutoresizingFlexibleBottomMargin = NSViewMinYMargin
};

Кроме того, из моего исследования я обнаружил, что @James.s имеет серьезную ошибку в дополнениях NSView. Система координат в Какао имеет перевернутую ось Y в терминах системы координат iOS. Следовательно, чтобы исправить нижнюю и верхнюю границу, вы должны написать:

- (void)fixTopEdge:(BOOL)fixed
{ [self setAutoresizingBit:NSViewMaxYMargin toValue:!fixed]; }

- (void)fixBottomEdge:(BOOL)fixed
{ [self setAutoresizingBit:NSViewMinYMargin toValue:!fixed]; }

Из документов по какао:

NSViewMinYMargin

The bottom margin between the receiver and its superview is flexible.
Available in OS X v10.0 and later.
Другие вопросы по тегам