【问题标题】:Background color of NSGridviewNSGridview 的背景颜色
【发布时间】:2017-10-20 16:41:06
【问题描述】:

我尝试设置NSGridView 的背景颜色,方法是对其进行子类化并覆盖其draw 方法,如下所示:

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

    let color = NSColor.green
    let bp = NSBezierPath(rect: dirtyRect)
    color.set()
    bp.stroke()

    print("drawing GridViewGreen")
  }
}

但是draw 方法永远不会被调用。

【问题讨论】:

    标签: swift cocoa appkit


    【解决方案1】:

    NSGridView是一个轻量级组件,类似于NSStackView,仅用于布局。因此它不会绘制。

    只需将NSGridView 放入NSBox 并设置其fillColor

    【讨论】:

    • 我发现这个信息很有用。不如用层挖掘做一件简单的事情。
    【解决方案2】:

    更新:如果可能,最好采用 catlan 的答案。他说得对,NSGridView 并不是真正用于渲染的,这种方法或多或少会迫使它走这条路。

    此时,几乎每个 Cocoa 应用程序都应该为其视图提供层支持,并且 NSGridView 和 NSStackView 没有任何不同。只需在图层上设置背景颜色即可。

    let gridView = NSGridView(views: [[view1, view2]])
    gridView.wantsLayer = true
    gridView.layer?.backgroundColor = NSColor.red.cgColor
    

    【讨论】:

    • 使用支持层的视图有什么缺点,因为它默认是关闭的?
    • @mik 拥有支持层会使用更多内存,但 AppKit 中的许多组件现在需要它来实现动画性能(例如较新的 NSCollectionView)。
    【解决方案3】:

    NSGridView 是 NSView 的子类,因此它继承了所有 NSView 的属性和方法包括绘图 - 如 draw(_ dirtyRect: NSRect) 函数所示。确保在视图控制器中包含 IBOutlet 或将 Interface Builder 中的 NSGridView 类更改为 GridViewGreen。

    class GridViewGreen: NSGridView {
        override init(frame frameRect: NSRect) {
            super.init(frame: frameRect)
        }
        required init?(coder: NSCoder) {
            super.init(coder: coder)
        }
        override func draw(_ dirtyRect: NSRect) {
            super.draw(dirtyRect)
            NSColor.green.setFill()
            dirtyRect.fill()
            print("drawing GridViewGreen")
        }
    }
    

    基本上,您的视图控制器不知道您对网格视图进行了子类化。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-11
      • 2019-08-30
      • 1970-01-01
      相关资源
      最近更新 更多