2011-01-13 12 views
11

Sto sviluppando un programma in cui aggiungo a livello di codice un NSImageView a una classe NSView personalizzata. Durante la creazione della vista immagine, sto passando la cornice del contenitore genitore.Come allineare una sottoview al centro di una NSide genitore

-(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; 
} 

Poi sto usando il metodo addSubView di aggiungere questo nella visualizzazione personalizzata. Il problema è che l'immagine rimane nella parte inferiore sinistra della vista genitore. Come posso posizionare questa immagine al centro della vista genitore?

Ho provato ad aggiungere un offset all'origine del frame, ma non funziona quando la finestra viene ridimensionata o se viene caricata un'immagine con una dimensione diversa.

Qualsiasi aiuto sarebbe apprezzato.

risposta

37

Non sono sicuro se questo è il modo migliore per farlo, ma faccio semplicemente matematica semplice quando voglio centrare una sottoview all'interno del suo genitore.

È necessario impostare tutti i margini da ridimensionare automaticamente se si desidera che rimanga centrato.

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

Questo è solo il calcolo dei margini necessari per ottenere un'origine centrata.

Se è necessario il frame centrato prima di richiamare initWithFrame:, utilizzare la logica precedente per calcolare i valori dell'origine del frame.

+1

Si consiglia inoltre di arrotondare tutti i risultati della divisione di numeri interi, come se fosse dispari e si finisce con 0,5, sarà confusa con posizionamento subpixel. – Jaanus

+0

Sì, questo è assolutamente vero. – d11wtq

+0

Ottima risposta, grazie –

-4

Prova questo. in .h

@property (forte, atomici) IBOutlet UIView * CoinsPurchaseView;

a .m

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

La domanda riguardava 'NSView' not' UIView'. 'NSView' non ha un attributo' center'. –

Problemi correlati