addSubview и автоматическое изменение размеров

Как добавить представления в окно, чтобы размер представлений соответствовал рамке окна?

Проблема

Я делаю окно листа, содержащее 2 представления, при этом одновременно видно только одно из них, поэтому важно, чтобы представления имели тот же размер, что и окно. Моя проблема в том, что либо view0 подходит правильно, а view1 - нет, либо наоборот. Не могу понять, как сделать им такой же размер, как окно.

Возможное решение

Я мог просто убедиться, что оба представления имеют одинаковый размер в Интерфейсном Разработчике, тогда это сработает. Однако я ищу способ сделать это программно.


Скриншот view0

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

view0
(источник: flickr.com)


Скриншот view1

Размер этого представления изменен правильно.

view1
(источник: flickr.com)


Вот мой код

Можно ли изменить размер представлений перед добавлением их в окно. Или лучше поступить так, как сейчас, когда представления добавляются одно за другим при изменении рамки окна. Как ты это делаешь?

NSView* view0 = /* a view made with IB */;
NSView* view1 = /* another view made with IB */;
NSWindow* window = [self window];

NSRect window_frame = [window frame];

NSView* cv = [[[NSView alloc] initWithFrame:window_frame] autorelease];
[window setContentView:cv];
[cv setAutoresizesSubviews:YES];

// add subview so it fits within the contentview frame
{
    NSView* v = view0;
    [v setHidden:YES];
    [v setAutoresizesSubviews:NO];
    [cv addSubview:v];
    [v setFrameOrigin:NSZeroPoint];
    [window setFrame:[v frame] display:NO];
    [v setAutoresizesSubviews:YES];
}

// add subview so it fits within the contentview frame
{
    NSView* v = view1;
    [v setHidden:YES];
    [v setAutoresizesSubviews:NO];
    [cv addSubview:v];
    [v setFrameOrigin:NSZeroPoint];
    [window setFrame:[v frame] display:NO];
    [v setAutoresizesSubviews:YES];
}

// restore original window frame
[window setFrame:window_frame display:YES];

[view0 setHidden:NO];
[view1 setHidden:YES];

person neoneye    schedule 25.04.2010    source источник


Ответы (2)


Решено! Я нашел решение здесь, в stackoverflow.

Было бы неплохо, если бы этот код можно было сделать короче.

NSView* view0 = /* a view made with IB */;
NSView* view1 = /* another view made with IB */;
NSWindow* window = [self window];

NSRect window_frame = [window frame];

NSView* cv = [[[NSView alloc] initWithFrame:window_frame] autorelease];
[window setContentView:cv];
[cv setAutoresizesSubviews:YES];

// add subview so it fits within the contentview frame
{
    NSView* v = view0;
    NSRect vframe = [v frame];
    [v setHidden:YES];
    [v setAutoresizingMask:NSViewWidthSizable | NSViewHeightSizable];

    NSView* tmp_superview = [[[NSView alloc] initWithFrame:vframe] autorelease];
    [tmp_superview addSubview:v];
    [tmp_superview setAutoresizesSubviews:YES];
    [tmp_superview setFrame:window_frame];

    [v removeFromSuperview];
       [cv addSubview:v];
}

// add subview so it fits within the contentview frame
{
    NSView* v = view1;
    NSRect vframe = [v frame];
    [v setHidden:YES];
    [v setAutoresizingMask:NSViewWidthSizable | NSViewHeightSizable];

    NSView* tmp_superview = [[[NSView alloc] initWithFrame:vframe] autorelease];
    [tmp_superview addSubview:v];
    [tmp_superview setAutoresizesSubviews:YES];
    [tmp_superview setFrame:window_frame];

    [v removeFromSuperview];
    [cv addSubview:v];
}

[view0 setHidden:NO];
person neoneye    schedule 25.04.2010

Окно не может знать, какой вид вы хотите изменить автоматически, поэтому вы должны установить AutoresizezingMask.

[просмотреть setAutoresizingMask: NSViewWidthSizable | NSViewHeightSizable];

person icloudend    schedule 17.03.2012