在哪里添加我想要使用AutoLayout在NSScrollView中浮动的子视图?

时间:2014-12-30 12:02:26

标签: objective-c cocoa swift autolayout nsscrollview

我有几个视图需要与我正在制作的NSScrollView的自定义子类协作。一种类型的视图需要相对于NSScrollView中的滚动完全修复,另一种类型需要将其外壳固定在相对于滚动的位置,但允许内部内容在滚动视图更改时滚动(如电子表格中的列标题)例如)。

以下是在视图层次结构AFAIK中放置这些视图的选项:

  1. NSScrollView的子视图(最有意义但是我收到以下错误: *** +[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)
  2. NSScrollView超级视图的子视图(这看起来效果更好,但从设计的角度来看感觉不对,因为我希望我的视图成为scrollView的一部分)
  3. ===

    我还在线阅读了多个地方,因为我没有能够使用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时才会出现。 (通过注释掉不同的约束来实验,看看是哪个引起了可怕的错误文本。)

2 个答案:

答案 0 :(得分:6)

错误消息是由于在添加约束时尚未创建self.superview的关系这一事实引起的。

由于两个约束条件,因此会出现进一步的错误。 thc2无法添加到NSScrollView中,需要将它们添加到超级视图中。

虽然上面的内容仍然没有产生我想要的结果,但它摆脱了运行时出现的两个错误。

答案 1 :(得分:2)

如果您尝试向不在视图层次结构中的视图添加约束,则会发生这种情况。自动布局限制。

为了调试这个,我计算出了导致问题的以编程方式创建的约束。然后我调试到这一点并且在添加约束时检查约束内的2个视图都不为null。其中一个是。我解决了这个错误。