【问题标题】:keeping constraints when replacing a view by an other view在用另一个视图替换视图时保持约束
【发布时间】:2014-09-03 08:01:45
【问题描述】:

在我的申请中,我有:

  • 主窗口,包含一个“自定义视图”,它是一个 NSView 掉进了IB。
  • 一个视图控制器 + 另一个 nib,包含一个视图和一些 控件。

当应用加载时,我正在使用:

initWithNibName:nibName andReplaceView:(the custom view) resize:YES

替换自定义视图。我知道 IB 中的视图有一个选项 placeholder,但我不知道如何使用它,而且我的应用程序以这种方式运行良好...... ...除了加载的视图不继承替换视图的布局约束。

我该如何解决这个问题?

编辑:对不起,我忘记了这个函数是我的……我很久以前在一个类别中写的。这是代码:

- (id)initWithNibName:(NSString*)nibName andReplaceView:(NSView*)aView resize:(BOOL)resize
{
    // 1. Loading the bundle
    if (self = [self initWithNibName:nibName bundle:nil])
    {
        [self replaceView:aView resize:resize]; 
    }

    return self;    
}

- (void)replaceView:(NSView*)aView resize:(BOOL)resize
{
    if (resize)
    {
        NSRect insertionFrame = [aView frame];
        [[self view] setFrame:insertionFrame];
    }
    else
    {
        NSRect insertionFrame = [aView frame];
        insertionFrame.size.width = [[self view] frame].size.width;
        insertionFrame.size.height = [[self view] frame].size.height;

        [[self view] setFrame:insertionFrame];
    }

    NSView* supView = [aView superview];
    [supView replaceSubview:aView with:[self view]];
}

【问题讨论】:

  • - initWithNibName:andReplaceView:resize: 不存在……
  • -replaceView:resize: 也是自定义的,所以我们无法知道它的作用。
  • @TomDalling 我更新了我的帖子。对不起。我在 2 或 3 年前写过它们...

标签: objective-c macos cocoa


【解决方案1】:

当您替换视图时,它会移除所有附加到旧视图的布局约束。

就个人而言,我只是将新视图放在旧视图中。这是我使用的一些代码:

@implementation SJPlaceholderView

-(void) fillWithView:(NSView*)view {
    NSParameterAssert(view);

    view.frame = self.bounds;
    [view setTranslatesAutoresizingMaskIntoConstraints:NO];

    [self addSubview:view];

    [self addConstraints:
     [NSLayoutConstraint constraintsWithVisualFormat:@"H:|[view]|"
                                             options:0
                                             metrics:nil
                                               views:NSDictionaryOfVariableBindings(view)]];

    [self addConstraints:
     [NSLayoutConstraint constraintsWithVisualFormat:@"V:|[view]|"
                                             options:0
                                             metrics:nil
                                               views:NSDictionaryOfVariableBindings(view)]];
}

@end

这确保内部视图框架与外部视图框架完全匹配。外部视图上的所有布局约束仍然有效。

您也可以尝试遍历旧视图的所有约束,并将它们应用到新视图。大多数约束将在视图本身或父视图上,但理论上它们可以在任何祖先视图上。

【讨论】:

  • 在旧版本之上添加 viwe 是个好主意。如今,资源已不再是一个问题。添加的视图是否会以与旧的底层视图相同的方式调整大小?
  • @Adeline 是的,添加的视图框架受到约束,因此它始终与底层视图框架匹配。
  • 最后一个问题(因为我不能让它工作)fillWithView 是在旧视图还是新视图上调用?
  • 我已经使用我根据您的帖子构建的功能更新了我的代码。使用它时,我看不到任何东西出现在窗口上。我错过了什么吗?
  • 完成。我看到了我的错字。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-10-02
  • 1970-01-01
  • 2011-03-21
  • 1970-01-01
  • 1970-01-01
  • 2020-05-31
  • 1970-01-01
相关资源
最近更新 更多