2011-01-13 11 views
11

Zajmuję się tworzeniem programu, w którym programowo dodaję NSImageView do niestandardowej klasy NSView. Podczas tworzenia widoku obrazu przechodzę przez ramkę kontenera nadrzędnego.Jak wyrównać podzbiór do centrum rodzica 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; 
} 

Następnie używam metody addSubView, aby dodać ją do widoku niestandardowego. Problem polega na tym, że obraz przykleja się do lewego dolnego rogu widoku rodzica. Jak mogę umieścić ten obraz w centrum widoku rodzica?

Próbowałem dodać przesunięcie do początku ramki, ale to naprawdę nie działa, gdy okno jest zmieniany, lub jeśli obraz o innym rozmiarze jest ładowany.

Każda pomoc zostanie doceniona.

Odpowiedz

37

Nie jestem pewien, czy jest to najlepszy sposób na zrobienie tego, ale po prostu wykonuję prostą matematykę, gdy chcę wyśrodkować podgląd wewnątrz jego rodzica.

Musisz ustawić wszystkie marginesy na automatyczne zmienianie rozmiaru, jeśli chcesz, aby pozostały wyśrodkowane.

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

To jest obliczanie marginesów wymaganych do uzyskania wyśrodkowanego pochodzenia.

Jeśli potrzebujesz wyśrodkowanej ramki przed wywołaniem initWithFrame:, po prostu użyj powyższej logiki, aby obliczyć wartości początku ramki.

+1

Można też zaokrąglić wszystkie wyniki z podziałem na liczby całkowite, jakby to dziwne i skończyć z .5, to będzie rozmyty z pozycjonowaniem subpikseli. – Jaanus

+0

Tak, to prawda. – d11wtq

+0

Świetna odpowiedź, dzięki –

-4

Spróbuj tego. w .h

@property (silny, nieatomowy) IBOutlet UIView * CoinsPurchaseView;

w .m

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

Pytanie dotyczyło 'NSView', a nie' UIView'. 'NSView' nie ma atrybutu' center'. –

Powiązane problemy