2011-01-13 5 views
11

Ich entwickle ein Programm, in dem ich NSAmageView programmatisch zu einer benutzerdefinierten NSView-Klasse hinzufüge. Beim Erstellen der Bildansicht übergebe ich den Rahmen des übergeordneten Containers.So richten Sie eine Unteransicht an die Mitte eines übergeordneten Elements aus NSView

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

Dann verwende ich die addSubView Methode, dies in der benutzerdefinierten Ansicht hinzuzufügen. Das Problem ist, dass das Bild links unten in der Elternansicht angezeigt wird. Wie kann ich dieses Bild in der Mitte der Elternansicht platzieren?

Ich habe versucht, einen Offset zum Frame-Ursprung hinzuzufügen, aber das funktioniert nicht wirklich, wenn das Fenster in der Größe geändert wird, oder wenn ein Bild mit einer anderen Größe geladen wird.

Jede Hilfe wäre willkommen.

Antwort

37

Ich bin mir nicht sicher, ob dies der beste Weg ist, um es zu tun, aber ich mache einfach nur Mathe, wenn ich eine Unteransicht in seinem Elternteil zentrieren möchte.

Sie müssen alle Ränder so einstellen, dass sie automatisch skalierbar sind, wenn Sie möchten, dass sie zentriert bleiben.

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

Dies ist nur Berechnung der Ränder erforderlich, um einen zentrierten Ursprung zu erhalten.

Wenn Sie den zentrierten Frame benötigen, bevor Sie initWithFrame: aufrufen, verwenden Sie einfach die obige Logik, um die Frame-Ursprungswerte zu berechnen.

+1

Sie auch alle Division Ergebnisse auf ganze Zahlen runden mögen, als ob es ungerade ist und Sie mit 0,5 am Ende, wird es mit Subpixel-Positionierung unscharf sein. – Jaanus

+0

Ja, das ist definitiv wahr. – d11wtq

+0

Große Antwort, danke –

-4

Versuchen Sie dies. in .h

@property (stark, nonatomic) IBOutlet UIView * CoinsPurchaseView;

in .m

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

Die Frage war über 'NSView' nicht' UIView'. 'NSView' hat kein' center' Attribut. –

Verwandte Themen