Как выровнять subview с центром родительского NSView

Я разрабатываю программу, в которой я программно добавляю NSImageView в пользовательский класс 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;
}

Затем я использую метод addSubView, чтобы добавить его в пользовательский вид. Проблема в том, что изображение обращается к левому нижнему углу родительского представления. Как разместить это изображение в центре родительского представления?

Я попытался добавить смещение к началу кадра, но это не работает, когда изменяется размер окна или загружается изображение с другим размером.

Любая помощь будет оценена.

Ответ 1

Я не уверен, что это лучший способ сделать это, но я просто делаю простую математику, когда хочу сосредоточить subview внутри своего родителя.

Вам нужно установить все поля для автоматического изменения размера, если вы хотите, чтобы он оставался центрированным.

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

Это просто вычисление полей, необходимых для получения центрированного происхождения.

Если вам нужен центрированный кадр перед вызовом initWithFrame:, просто используйте приведенную выше логику для вычисления значений начала кадра.

Ответ 2

Попробуйте это. в .h

@property (сильный, неатомный) IBOutlet UIView * CoinsPurchaseView;

в .m

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