Какао NSView изменяет свойства авторазмера - PullRequest
21 голосов
/ 09 мая 2009

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

Interface Builder

Ответы [ 4 ]

30 голосов
/ 09 мая 2009

Я считаю, что маски 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];
19 голосов
/ 09 мая 2009

См. setAutoresizingMask: метод NSView и связанные маски изменения размера .

8 голосов
/ 09 мая 2009

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

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

3 голосов
/ 05 августа 2013

@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.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...