2009-05-09 3 views
21

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

Interface Builder

+0

Обратите внимание, что компания Apple представила [ AutoLayout framework] (http://developer.apple.com/library/mac/#releasenotes/UserExperience/RNAutomaticLayout/_index.html#//apple_ref/doc/uid/TP40010631) для Lion. – JJD

ответ

19

Смотрите setAutoresizingMask: метод NSView и связанного с ним resizing masks.

+0

Вот рабочая ссылка на [маски для изменения размера] (https://developer.apple.com/documentation/appkit/nsview.autoresizingmask) –

8

Каждый вид имеет маску флагов, контролируемую настройкой свойства autoresizingMask с OR поведений, которые вы хотите от resizing masks. Кроме того, надстройка должна быть настроена на resize its subviews.

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

30

Я считаю, что 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]; 
+8

Собственно, да. Я работаю над настраиваемым пользовательским интерфейсом для интерфейса с сенсорным экраном, а Interface Builder просто не подходит для этой работы. Я делал все в коде, и я не оглядывался назад. –

+1

Спасибо, этот код полезен. – Karolis

+0

@ Каролис: Рад это услышать. Спасибо, что нашли время оставить заметку. –

3

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

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. 
+2

+1 для гибридного подхода! У меня никогда не было проблем с этим кодом, но, возможно, это разница между OSX и iOS? Теперь у меня мне любопытно ... –

Смежные вопросы