2011-01-13 11 views
11

Estoy desarrollando un programa en el que estoy agregando mediante programación un NSImageView a una clase NSView personalizada. Al crear la vista de imagen, estoy pasando el marco del contenedor principal.Cómo alinear una subvista al centro de un NSView principal

-(NSImageView *)loadNSImage:(NSString *)imageName frame:(NSRect)frame{ 
    imageName = [[NSBundle mainBundle] pathForResource:imageName ofType:@"png"]; 
    NSImage *image = [[NSImage alloc] initWithContentsOfFile:imageName]; 
    NSImageView *imageView = [[NSImageView alloc]initWithFrame:frame]; 
    [imageView setImage:image]; 
    [imageView setImageScaling:NSImageScaleProportionallyUpOrDown]; 
    [imageView setAutoresizingMask:NSViewHeightSizable | NSViewWidthSizable | NSViewMaxXMargin | NSViewMaxYMargin | NSViewMinXMargin | NSViewMinYMargin]; 
    [imageView setImageAlignment:NSImageAlignCenter]; 
    [image release]; 
    return imageView; 
} 

Entonces yo estoy usando el método addSubView añadir esto en la vista personalizada. El problema es que la imagen se pega a la esquina inferior izquierda de la vista principal. ¿Cómo puedo colocar esta imagen en el centro de la vista principal?

He intentado agregar un desplazamiento al origen del marco, pero eso realmente no funciona cuando se cambia el tamaño de la ventana, o si se carga una imagen con un tamaño diferente.

Cualquier ayuda sería apreciada.

Respuesta

37

No estoy seguro de si esta es la mejor manera de hacerlo, pero solo hago cálculos simples cuando quiero centrar una subvista dentro de su matriz.

Debe configurar todos los márgenes para que se pueda cambiar el tamaño automáticamente si desea que permanezca centrado.

[subview setFrameOrigin:NSMakePoint(
    (NSWidth([parentView bounds]) - NSWidth([subview frame]))/2, 
    (NSHeight([parentView bounds]) - NSHeight([subview frame]))/2 
)]; 
[subview setAutoresizingMask:NSViewMinXMargin | NSViewMaxXMargin | NSViewMinYMargin | NSViewMaxYMargin]; 

Esto solo calcula los márgenes necesarios para obtener un origen centrado.

Si necesita el marco centrado antes de invocar initWithFrame:, simplemente utilice la lógica anterior para calcular los valores de origen del marco.

+1

También puede redondear todos los resultados de la división de números enteros, como si fuera extraño y terminar con 0.5, será borrosa con el posicionamiento de subpíxeles. – Jaanus

+0

Sí, esto es definitivamente cierto. – d11wtq

+0

Gran respuesta, gracias –

-4

Pruebe esto. en .h

@property (fuerte, no atómica) IBOutlet UIView * CoinsPurchaseView;

en .m

self.CoinsPurchaseView.center = self.view.center; 
    [self.view addSubview:self.CoinsPurchaseView]; 
+1

La pregunta fue sobre 'NSView' no' UIView'. 'NSView' no tiene un atributo' center'. –

Cuestiones relacionadas