【问题标题】:Custom View in Cocoa can't draw after setting AutoLayout Constraints设置 AutoLayout 约束后,Cocoa 中的自定义视图无法绘制
【发布时间】:2019-07-28 09:30:13
【问题描述】:

在 MacOS 项目上。

我正在尝试在文本字段下画一条线(通过使文本字段透明,我可以创建一个“请填写空白”样式的视图,要求用户输入数据)。我创建了一个名为lineDrawer 的简单NSView 子类,只是为了画线,然后我尝试将lineDrawer 的一个实例作为子视图添加到我让用户输入他的姓名的视图中。该线应绘制在透明文本字段的正下方。文本字段是视图的 IBOutlet 并且已经在正确的位置,我希望该行与文本字段具有完全相同的框架,因此如果我从lineDrawer's (minX, minY)(maxX, minY) 绘制路径,则路径正好在透明文本字段的下方。

我不能让它工作,因为我设置后

lineView.translatesAutoresizingMaskIntoConstraints = false

并添加了我自己的约束,自定义视图不会绘制。我认为这与我没有为程序提供足够的信息有关究竟在何处绘制视图有关,但我无法弄清楚这里缺少什么。顺便说一句,如果我不设置约束,它只会在其框架的位置绘制视图。如果我设置约束,则什么都不会显示。

NickName: NSViewController

override func viewDidLoad() {
    super.viewDidLoad()
    // Do view setup here.
    greetingLine.font = .labelFont(ofSize: 50)
    nameField.font = .labelFont(ofSize: 50)
    nameField.isBezeled = false
    let lineView = lineDrawer.init()

    lineView.setFrameSize(nameField.frame.size)
    self.view.addSubview(lineView)
    lineView.translatesAutoresizingMaskIntoConstraints = false
    let lineConstraintX = NSLayoutConstraint.init(item: lineView, attribute: .centerX, relatedBy: .equal, toItem: self.view, attribute: .centerX, multiplier: 1, constant: 0)
    let lineConstraintY = NSLayoutConstraint.init(item: lineView, attribute: .centerY, relatedBy: .equal, toItem: self.view, attribute: .centerY, multiplier: 1.3, constant: 0)

    self.view.addConstraints([lineConstraintY, lineConstraintX])





}


@IBOutlet weak var nameField: NSTextField!
@IBOutlet weak var greetingLine: NSTextField!

还有lineDrawer: NSView

override func draw(_ dirtyRect: NSRect) {
    super.draw(dirtyRect)

    // Drawing code here.

    let context = NSGraphicsContext.current?.cgContext
    context!.beginPath()
    context!.move(to: CGPoint(x: self.bounds.minX, y: self.bounds.minY))
    let endPoint = CGPoint.init(x: self.bounds.maxX, y: self.bounds.minY)
    context!.addLine(to: endPoint)
    context!.move(to: CGPoint(x: 0, y: 0))
    context!.addLine(to: CGPoint(x: 10, y: 10))
    let loadedColor = ColorGetter.getCurrentThemeColor()
    context!.setStrokeColor(loadedColor.cgColor)
    context!.setLineWidth(5)
    context!.strokePath()
    print("drawing")
}

非常感谢任何愿意为此提供帮助的人!

【问题讨论】:

    标签: swift macos cocoa autolayout custom-view


    【解决方案1】:

    能否请您在布局约束后面添加变量 isActive 并将其设置为 true。那么 ist 应该可以工作了。

    所以,你的代码:

    let lineConstraintX = NSLayoutConstraint.init(item: lineView, attribute: .centerX, relatedBy: .equal, toItem: self.view, attribute: .centerX, multiplier: 1, constant: 0)
    let lineConstraintY = NSLayoutConstraint.init(item: lineView, attribute: .centerY, relatedBy: .equal, toItem: self.view, attribute: .centerY, multiplier: 1.3, constant: 0)
    

    必须更改:

    NSLayoutConstraint.init(item: lineView, attribute: .centerX, relatedBy: .equal, toItem: self.view, attribute: .centerX, multiplier: 1, constant: 0).isActive = true
    NSLayoutConstraint.init(item: lineView, attribute: .centerY, relatedBy: .equal, toItem: self.view, attribute: .centerY, multiplier: 1.3, constant: 0).isActive = true
    

    然后自动布局约束被激活并工作。目前,您确实设置了自动布局约束,但您没有激活它。

    【讨论】:

    • 我试过你的代码,但不幸的是它没有工作。我想我不小心在我原来的问题中注释掉了self.view.addConstraints([lineConstraintY, lineConstraintX] 行。有了这条线,约束确实是活跃的。如果我不执行lineView.translatesAutoresizingMaskIntoConstraints = false,则视图实际上既符合这些约束,也符合它从自定义视图的框架位置假定的约束,这会扭曲我的窗口(并使我无法调整窗口大小)。但如果我到达false,它就不会画任何东西。
    • 是的...在我为其宽度和高度添加约束后它起作用了。不太明白为什么我必须这样做,因为我已经设置了框架大小......
    【解决方案2】:

    回答我自己的问题: 我通过

    向自定义视图的widthheight 添加了2 个约束
     NSLayoutConstraint.init(item: lineView, attribute: .width, relatedBy: .equal, toItem: self.nameField, attribute: .width, multiplier: 1, constant: 0).isActive = true
     NSLayoutConstraint.init(item: lineView, attribute: .height, relatedBy: .equal, toItem: nil, attribute: .notAnAttribute, multiplier: 1, constant: 100).isActive = true
    

    我认为通过制作

    lineView.translatesAutoresizingMaskIntoConstraints = false
    

    我正在删除程序关于自定义视图的位置和大小的知识,所以我必须手动重新指定它们?

    奇怪的是,该程序并未暗示自定义视图的大小应与设置的框架大小有关。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-21
      • 2014-10-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多