将工具栏项对齐以使用“自动布局约束”拆分视图内容

时间:2014-05-31 22:04:00

标签: objective-c macos cocoa

我想将os x app的工具栏中的按钮与窗口中的拆分视图的位置对齐,类似于Apple Mail中的删除按钮。如何使用自动布局约束来完成?

我确实在苹果文档中找到了一个提示,根据该提示,应该可以使用自动布局约束(在https://developer.apple.com/library/ios/documentation/userexperience/conceptual/AutolayoutPG/AutoLayoutConcepts/AutoLayoutConcepts.html),其中“约束可以通过一些限制跨越视图层次结构。”例如,OS X中的Mail应用程序默认情况下工具栏中的“删除”按钮与消息表“对齐”。但不幸的是,我找到了所有这些。

我尝试在左侧splitView窗格的内容和按钮之间创建约束:

NSView *button = self.toolbarItemButton.view;
NSView *leftPane = self.leftSplitContent;

[self.window.contentView addConstraints:[NSLayoutConstraint
    constraintsWithVisualFormat:@"[leftPane][button]"
    options:0 metrics:nil
    views:NSDictionaryOfVariableBindings(leftPane, button)]
];

但是我得到一条错误消息,似乎表明交叉视图约束是不可能的:“约束引用了视图子树之外的东西” 有没有办法做到这一点?

我发现一种解决方法是不使用约束,而是在按钮左侧插入自定义视图(不是间隔符!)。然后,我可以更改该视图的大小以移动按钮......但是,这似乎更像是对我的黑客攻击。

2 个答案:

答案 0 :(得分:1)

我知道它有点旧,但我遇到了同样的问题,并找到了答案:

您必须使用topLayoutGuide属性。

ex in swift

view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormats(
        ["H:|[toolbarShadow]|", "V:[topLayoutGuide][toolbarShadow(100)]"], 
views: viewDictionnary))

当然topLayoutGuide必须在您的查看词典中

您可以通过self.topLayoutGuide

访问它

答案 1 :(得分:1)

我遇到了同样的问题。 与OS X 10.11 El Capitan一样,我们可以使用NSLayoutGuide

首先,您应该引用NSView子类的实例,以便在" current"中对齐。源代码文件。在这种情况下,您的splitview中的子视图。

以下示例说明如何使用NSLayoutAnchor对齐两个视图。 您还可以向工具栏项添加垂直约束。

- (void) setUpToolbarItemConstrains {

// the view you want your toolbaritem to align to
NSView * refView = self.theOtherView.view;

// theToolbarItem is the outlet to the ToolbarItem
NSView * toolsView = self.theToolbarItem.view;

// You can also do this in Interface Builder
self.theToolbarItem.minSize = CGSizeMake(200.0f, 0.0f);
self.theToolbarItem.maxSize = CGSizeMake(600.0f, 100.0f);

toolsView.translatesAutoresizingMaskIntoConstraints = NO;

[toolsView.leadingAnchor constraintEqualToAnchor: refView.leadingAnchor].active = YES;

}

但是,我有extended question与此相关。