我有几个视图需要与我正在制作的NSScrollView的自定义子类协作。一种类型的视图需要相对于NSScrollView中的滚动完全修复,另一种类型需要将其外壳固定在相对于滚动的位置,但允许内部内容在滚动视图更改时滚动(如电子表格中的列标题)例如)。
以下是在视图层次结构AFAIK中放置这些视图的选项:
*** +[NSLayoutConstraint constraintWithItem:attribute:relatedBy:toItem:attribute:multiplier:constant:]: A multiplier of 0 or a nil second item together with a location for the first attribute creates an illegal constraint of a location equal to a constant. Location attributes must be specified in pairs)
===
我还在线阅读了多个地方,因为我没有能够使用Visual Format Language
方法来设置我的约束,因为相对于直接的超级视图没有设置浮动约束。这是我上面做错了的线索,因为第二种方法可以使用VCL,而第一种方法需要手动创建NSLayoutConstraint。
===
以下是我添加到NSScrollView子类的初始化程序中的Swift代码:
topCorner = NSButton()
topCorner.translatesAutoresizingMaskIntoConstraints = false
topCorner.bezelStyle = NSBezelStyle.CircularBezelStyle //.RecessedBezelStyle
topCorner.setButtonType(NSButtonType.PushOnPushOffButton)
topCorner.identifier = "topCorner"
topCorner.title = "TC"
self.addSubview(topCorner)
thc = NSLayoutConstraint(item: self.topCorner, attribute: NSLayoutAttribute.Left, relatedBy: NSLayoutRelation.Equal, toItem: self.superview, attribute: NSLayoutAttribute.Left, multiplier: 1.0, constant: 0.0)
self.addConstraint(thc)
thc1 = NSLayoutConstraint(item: self.topCorner, attribute: NSLayoutAttribute.Width, relatedBy: NSLayoutRelation.Equal, toItem: nil, attribute: NSLayoutAttribute.NotAnAttribute, multiplier: 1.0, constant: 36.0)
self.addConstraint(thc1)
thc2 = NSLayoutConstraint(item: self.topCorner, attribute: NSLayoutAttribute.Top, relatedBy: NSLayoutRelation.Equal, toItem: self.superview, attribute: NSLayoutAttribute.Top, multiplier: 1.0, constant: 0.0)
self.addConstraint(thc2)
thc3 = NSLayoutConstraint(item: self.topCorner, attribute: NSLayoutAttribute.Height, relatedBy: NSLayoutRelation.Equal, toItem: nil, attribute: NSLayoutAttribute.NotAnAttribute, multiplier: 1.0, constant: 24.0)
self.addConstraint(thc3)
只是为了进一步混淆,我得到的错误信息只有在代码中有约束thc和thc2时才会出现。 (通过注释掉不同的约束来实验,看看是哪个引起了可怕的错误文本。)
答案 0 :(得分:6)
错误消息是由于在添加约束时尚未创建self.superview
的关系这一事实引起的。
由于两个约束条件,因此会出现进一步的错误。 thc2无法添加到NSScrollView中,需要将它们添加到超级视图中。
虽然上面的内容仍然没有产生我想要的结果,但它摆脱了运行时出现的两个错误。
答案 1 :(得分:2)
如果您尝试向不在视图层次结构中的视图添加约束,则会发生这种情况。自动布局限制。
为了调试这个,我计算出了导致问题的以编程方式创建的约束。然后我调试到这一点并且在添加约束时检查约束内的2个视图都不为null。其中一个是。我解决了这个错误。