addSubview и авторазмер - PullRequest
       23

addSubview и авторазмер

3 голосов
/ 25 апреля 2010

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

Проблема

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

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

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


Снимок экрана view0

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

view0


Снимок экрана view1

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

view1


Вот мой код

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

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];

Ответы [ 2 ]

7 голосов
/ 25 апреля 2010

Решено! Я нашел решение здесь на 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];
0 голосов
/ 17 марта 2012

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

[view setAutoresizingMask: NSViewWidthSizable | NSViewHeightSizable];

...