objective-c - 使用自动布局约束将工具栏项目对齐以 Split View内容

标签 objective-c macos cocoa

我想将 os x 应用程序工具栏中的按钮与窗口中 Split View的位置对齐,类似于 Apple Mail 中的删除按钮。这如何使用自动布局约束来完成?

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

我试图在左侧 splitView Pane 的内容和按钮之间创建约束:

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

但是我随后收到一条错误消息,似乎表明跨 View 约束是不可能的:“约束引用了 View 子树之外的内容” 有什么办法吗?

我发现的解决方法是不使用约束,而是在按钮左侧插入一个自定义 View (不是间隔器!)。然后我可以更改该 View 的大小以移动按钮...但是,这对我来说更像是一种 hack。

最佳答案

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

您必须使用 topLayoutGuide 属性。

快速执行

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

当然topLayoutGuide必须在你的 View 字典里

您可以通过self.topLayoutGuide访问它

关于objective-c - 使用自动布局约束将工具栏项目对齐以 Split View内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23974865/

相关文章:

ios - 无法在 iOS 中设置启动图像

ios - 为什么这个 AES128 解密在 iPhone 上需要这么长时间?

objective-c - OS X - 如何检测硬盘事件?

swift - 如何将 textField.text 值转换为整数并对两个整数求和

ios - Xcode6 无法将服务器的响应解析为 plist

objective-c - 从 Objective-C osx 打开 "Spelling and grammar"窗口

objective-c - KVO - 如何检查对象是否是观察者?

ios - 安装Xcode 5.1后报错: Two views in the same hierarchy have the same restoration identifier

objective-c - Objective-C 协议(protocol)的默认实现

macos - 如何使源列表选择突出显示以使用 OS X 10.10 中的 Dark Vibrancy 外观?