代码之家  ›  专栏  ›  技术社区  ›  neoneye

添加子视图和自动调整大小

  •  3
  • neoneye  · 技术社区  · 14 年前

    如何将视图添加到窗口中,以便调整视图大小以适应窗口框架?

    问题

    我正在制作一个包含两个视图的工作表窗口,一次只能看到其中一个视图, 因此,视图的大小必须与窗口的大小相同。我的问题是 VIEW0适合,VIEW1不适合,或者相反。我不知道该怎么做 为它们提供与窗口相同的大小。

    可能的解决方案

    我可以确保两个视图在接口生成器中的大小完全相同,然后它就可以工作了。不过,我正在寻找一种以编程方式完成这项工作的方法。


    视图0的屏幕截图

    在下面,您可以看到顶部和右侧的自动调整问题,其中视图以某种方式被剪裁。


    视图1的屏幕截图

    此视图的大小已正确调整。


    这是我的密码

    在将视图添加到窗口之前,是否可以调整视图的大小。或者像我现在做的那样,在更改窗口框架的同时逐个添加视图更好。你是怎么做到的?

    nsview*view0=/*a view made with ib*/;
    nsview*view1=/*使用ib创建的另一个视图*/;
    nswindow*window=[自窗口];
    
    nsret window_frame=[窗口框架];
    
    nsview*cv=[[[nsview alloc]initwithframe:window_frame]autorelease];
    [窗口setContentView:cv];
    [cv setautoresizesubview:是];
    
    //添加子视图,使其适合ContentView框架
    {
    nsview*v=view0;
    [v sethidden:是];
    [v setautoresizesubviews:否];
    [cv addsubview:v];
    [v setframeorigin:nszeropoint];
    [窗口设置帧:[V帧]显示:否];
    [v setautoresizesubviews:是];
    }
    
    //添加子视图,使其适合ContentView框架
    {
    nsview*v=view1;
    [v sethidden:是];
    [v setautoresizesubviews:否];
    [cv addsubview:v];
    [v setframeorigin:nszeropoint];
    [窗口设置帧:[V帧]显示:否];
    [v setautoresizesubviews:是];
    }
    
    //还原原始窗口框架
    [窗口设置帧:窗口显示:是];
    
    [视图0设置隐藏:否];
    [视图1设置隐藏:是];
    < /代码> <在窗框里?

    问题

    我正在制作一个包含两个视图的工作表窗口,一次只能看到其中一个视图, 因此,视图的大小必须与窗口的大小相同。我的问题是 VIEW0适合,VIEW1不适合,或者相反。我不知道该怎么做 给他们和窗户一样的尺寸。

    可能的解决方案

    我可以确保两个视图在接口生成器中的大小完全相同,然后它就可以工作了。不过,我正在寻找一种以编程方式实现这一点的方法。


    视图0的屏幕截图

    在下面,您可以看到顶部和右侧的自动调整问题,其中视图被某种方式剪裁。

    view0


    视图1的屏幕截图

    此视图的大小已正确调整。

    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 回复  |  直到 13 年前
        1
  •  7
  •   Community CDub    7 年前

    解决了的! 我有 found a solution 在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];
    
        2
  •  -1
  •   icloudend    13 年前

    窗口无法确定要自动调整的视图。因此必须设置AutoResizingMask

    [视图设置自动调整大小掩码:nsviewwidthsizable nsviewheightsizable];