Какао 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.