2009-05-09 7 views
21

À l'aide du Générateur d'interface, vous pouvez sélectionner les coins auxquels un objet doit adhérer lors du redimensionnement. Comment pouvez-vous faire cela par programme?Cocoa NSView modification des propriétés autosizing

Interface Builder

+0

S'il vous plaît noter que Apple a introduit un [ Cadre AutoLayout] (http://developer.apple.com/library/mac/#releasenotes/UserExperience/RNAutomaticLayout/_index.html#//apple_ref/doc/uid/TP40010631) pour Lion. – JJD

Répondre

19

Voir la méthode setAutoresizingMask: de NSView et la resizing masks associée.

+0

Voici un lien de travail vers les [masques de redimensionnement] (https://developer.apple.com/documentation/appkit/nsview.autoresizingmask) –

8

Chaque vue possède le masque de drapeaux, contrôlé en définissant une propriété autoresizingMask avec le OU des comportements souhaités à partir du resizing masks. En outre, le superview doit être configuré sur resize its subviews.

Enfin, en plus des options de redimensionnement de masque défini de base, vous pouvez parfaitement contrôler la mise en page des sous-vues par la mise en œuvre -resizeSubviewsWithOldSize:

30

Je trouve que les autoresizingBit masques sont horriblement nommés, donc j'utiliser une catégorie sur NSView à rendre les choses un peu plus explicite:

// 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 

qui c un alors utilisé comme suit:

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

En fait, oui. J'ai travaillé sur une interface utilisateur personnalisée pour une interface à écran tactile, et Interface Builder n'est tout simplement pas le bon outil pour ce travail. J'ai tout fait dans le code, et je n'ai pas regardé en arrière. –

+1

Merci, ce code est utile. – Karolis

+0

@Karolis: Content de l'entendre. Merci d'avoir pris le temps de laisser une note. –

3

@ e.James réponse m'a donné une idée de simplement créer une nouvelle ENUM avec appellation plus familière:

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

En outre, de mes recherches, j'ai découvert que @ James.s a un bug grave dans les ajouts NSView. Le système de coordonnées de Cocoa a un axe Y retourné en termes de système de coordonnées iOS. Par conséquent, afin de fixer le fond et la marge supérieure, vous devez écrire:

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

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

De la documentation du cacao:

NSViewMinYMargin

The bottom margin between the receiver and its superview is flexible. 
Available in OS X v10.0 and later. 
+2

+1 pour l'approche hybride! Je n'ai jamais eu de problèmes avec ce code, mais peut-être que c'est une différence entre OSX et iOS? Maintenant vous m'avez curieux ... –

Questions connexes