子视图内的子视图(NSView)上的自动布局

时间:2018-02-12 11:55:20

标签: objective-c macos user-interface autolayout nsview

我很难在另一个子视图中为子视图正确设置自动布局。

我使用了一个示例,其中两个工具栏项目显示了两个不同的子视图(按预期工作),并且这两个子视图共享第三个不适合的子视图。

添加子视图的代码非常简单:

[subView removeFromSuperview];
[itemXSubView addSubview:subView];
[self.window setContentView:itemXView];

首先,我删除第三个和共享子视图( subView ),以防它已添加,然后将其添加到项[1-2] SubView 并设置具有子视图的窗口内容项目[1-2]查看,[1-2]取决于所选的工具栏按钮。其他一切都是通过自动布局条件完成的。

结果是第三个共享子视图总是放错位置和/或剪切,如下例所示。调整窗口大小并从第一个或第二个视图更改通常会加剧问题。

Example of third subview items cut

测试更新

尝试委托主窗口并覆盖两个调整大小函数(根据@ the4kman建议),但它们从未被调用过。 init是唯一被称为:

@interface viewController: NSView <NSWindowDelegate>
@end

@implementation viewController

-(id)init
{
   if((self=[super init])) { }
   return self;
}

- (void)resizeSubviewsWithOldSize:(NSSize)oldSize;
{
   [super resizeSubviewsWithOldSize:oldSize];
}

- (void)resizeWithOldSuperviewSize:(NSSize)oldSize;
{
   [super resizeWithOldSuperviewSize:oldSize];
}

- (void)layout
{
   [super layout];
}

另一个被召唤的建议,但遗憾的是没有实际改善。将窗口委派给viewController并将主视图(self.view)设置为嵌套的子视图。尝试结合[itemXSubView setNeedsLayout:true];:

@interface viewController: NSViewController <NSWindowDelegate>
@end


@implementation viewController

-(void)viewWillLayout
{
   [super viewDidLayout];
   [self.view setNeedsLayout:true];
}

@end

提前致谢!

1 个答案:

答案 0 :(得分:0)

itemXSubView调整其子视图的大小,但不适合它们。您必须在subView之前item1SubView内放addSubview

- (IBAction)item1Action:(id)sender {
    NSLog(@"Item 1 action triggered");

    [subView removeFromSuperview];
    subView.frame = item1SubView.bounds;
    [item1SubView addSubview:subView];
    [self.window setContentView:item1View];
}