2015-02-11 81 views
4

我正尝试使用与OSX 10.10新的充满活力的主题NSTextView看着新UI的先进功能从WWDC会议之后。我的文本视图不放置在标题栏旁边,因此我已将内容视图设置为完全大小,以便我可以将文本视图置于标题栏下方。使用contentLayoutGuide的约束

我的问题是,我有一个NSView文本视图和标题栏之间应该直接放置在标题栏下,但我不能让自动布局为我做这个。在视频中他们给使用新contentLayoutGuide属性此示例代码中NSWindow

NSLayoutConstraint *topEdgeConstraint = [NSLayoutConstraint constraintWithItem:myView attribute: NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:window.contentLayoutGuide attribute:NSLayoutAttributeTop]; 

但是我不能得到这个工作,每当我尝试安装约束的Xcode给我

无法在视图上安装约束。约束是否从视图的子树之外引用了某些东西?这是违法的。

我得到的是,在示例中使用的窗口属性是不是在视图中的子树,因为视图被放置在窗口内,但我怎么访问contentLayoutGuide财产?

目前我正在尝试将-awakeFromNib方法中的约束添加到子类型NSWindow中。错误的方法可能?

预先感谢

回答

0

编辑:该溶液不再因为OS X埃尔卡皮坦其具有窗框的不同视图层级上可接受的。查找sam's answer,他建议使用Yosemite中引入的新的NSLayoutConstraint方法和属性(约束激活)。

我面临着同样的问题昨天。

不幸的是,该文件缺乏在哪里把这个约束的信息。新的Xcode'Capture View Hierarchy'功能可以帮助您解决问题!

当你限制,你必须把你得到的约束对这些观点的共同祖先一两种观点的某些属性。这是一个基本的自动布局规则。

在你的代码中引用window.contentLayoutGuide,该声明为ID,但实际上是一个NSContentLayoutView。运行您的应用程序并捕获视图层次结构。这里是你应该得到的约塞米蒂什么:

enter image description here

你有你的约束添加到NSThemeFrame观点,因为这是其子树既包含您的myViewNSContentLayoutView始祖。这个私有视图由NSWindow管理,没有明显的属性可以从窗口实例中获取它,但我们可以轻松遍历视图层次。

下面是一个完整的代码示例:

NSWindow* window = <Get the window>; 

NSLayoutConstraint* constraint = [NSLayoutConstraint constraintWithItem: myView attribute: NSLayoutAttributeTop relatedBy: NSLayoutRelationEqual toItem: window.contentLayoutGuide attribute: NSLayoutAttributeTop]; 

[((NSView*)window.contentLayoutGuide).superview addConstraint: constraint]; 

+0

非常感谢,现在完美! :) – Hampus 2015-02-13 19:15:32

+0

正如Sam在下面提到的那样,使用'active'属性是最好的选择。假设'contentLayoutGuide'是'NSView'的一个实例,它是非常糟糕的。 – Taylor 2015-06-08 20:17:00

8

在优胜美地,约束现在,您可以设置,使得约束活跃,而不将它放在一个共同的祖先“活跃”属性。我认为它是专门为这种情况创建的,你不知道共同的祖先。

NSLayoutConstraint *constraint = [NSLayoutConstraint constraintWithItem: myView attribute: NSLayoutAttributeTop relatedBy: NSLayoutRelationEqual toItem: window.contentLayoutGuide attribute: NSLayoutAttributeTop]; 
constraint.active = YES 
0

我已经记录了整个过程中,我通过得到一个滚动视图与一个TextView这里窗口的标题栏下滚动的去(包括苹果的约束东西顶端的方法):https://stackoverflow.com/a/36435872/4615448

同样的技术使用插页和跟踪脱字符/光标也适用于您。您仍然可以使您的滚动视图顶部指南进入contentView的顶部,然后使用这些插入内容使其出现在内容视图中并位于标题栏下方。您也可以在其上覆盖其他视图,只要它在其下延伸即可。然后,您可以适当地更新插页,并且无论您需要什么,它都会落后。 (我知道,这个问题非常古老 - 你很可能已经算出来了,我在这里试图在El Capitan 10.11中找到同样的东西,所以我把它留给这里的其他人)。

我对OS X开发相对较新,所以欢迎所有专业人士对本文或其他任何改进或见解进行评论。