2009-05-09 12 views
21

Usando el constructor de interfaz puede seleccionar las esquinas a las que debe adherirse un objeto al cambiar el tamaño. ¿Cómo puedes hacer esto programáticamente?Cocoa NSView cambio de propiedades de autosizing

Interface Builder

+0

Tenga en cuenta que Apple presentó un [ Marco de AutoLayout] (http://developer.apple.com/library/mac/#releasenotes/UserExperience/RNAutomaticLayout/_index.html#//apple_ref/doc/uid/TP40010631) para Lion. – JJD

Respuesta

19

Ver el método de NSView y la resizing masks asociado setAutoresizingMask:.

+0

Aquí hay un enlace de trabajo a las [máscaras de cambio de tamaño] (https://developer.apple.com/documentation/appkit/nsview.autoresizingmask) –

8

Cada vista tiene la máscara de indicadores, controlada al establecer una propiedad de autoresizingMask con el OR de los comportamientos que desee del resizing masks. Además, la supervista debe configurarse en resize its subviews.

Por último, además de las opciones básicas para cambiar el tamaño de la máscara definidos, se puede controlar totalmente el diseño de subvistas mediante la implementación de -resizeSubviewsWithOldSize:

30

Me parece que los autoresizingBit máscaras son terriblemente nombrados, así que usar una categoría en NSView a hacer las cosas un poco más explícito:

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

cual C a continuación, un aspecto siguientes:

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

En realidad, sí. He estado trabajando en una interfaz de usuario personalizada para una interfaz de pantalla táctil y Interface Builder simplemente no es la herramienta adecuada para ese trabajo. He estado haciendo todo en código, y no he mirado hacia atrás. –

+1

Gracias, este código es útil. – Karolis

+0

@Karolis: Me alegra oírlo. Gracias por tomarse el tiempo de dejar una nota. –

3

@ respuesta e.James me dio una idea simplemente crear una nueva enumeración de nombres con más familiar:

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

Asimismo, desde mi investigación, descubrí que @ James.s tiene un error grave en las adiciones NSView. El sistema de coordenadas en Cocoa tiene un eje y invertido en términos de sistema de coordenadas iOS. Por lo tanto, con el fin de fijar la parte inferior y superior del margen, se debe escribir:

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

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

A partir de los documentos de cacao:

NSViewMinYMargin

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

+1 para el enfoque híbrido! Nunca he tenido problemas con ese código, pero tal vez sea una diferencia entre OSX e iOS. Ahora me tienes curiosidad ... –

Cuestiones relacionadas