【问题标题】:Border Doesn't Draw in NSView When inside NSTableCellView在 NSTableCellView 中时,边框不会在 NSView 中绘制
【发布时间】:2020-11-25 01:03:18
【问题描述】:

我在一个NSTableCellView 中有三个NSViews。根据该行的数据,我想在NSView 上显示一个带有边框的选定角色,如下所示:

蓝色边框NSView 是一个子类,如下所示:

class RolePill: NSView{
  override func draw(_ dirtyRect: NSRect)  {
    super.draw(dirtyRect)
    layer?.cornerRadius = 9
    layer?.borderWidth = 2
    layer?.borderColor = NSColor.clear.cgColor
  }
}

当我的表格像这样加载时,角色最初被设置:

extension UsersVC: NSTableViewDelegate, NSTableViewDataSource{
  func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? {
    let cell = tableView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "UserCell"), owner: nil) as! UserCell

    let user = users[row]

    //Role
    cell.setRole(role: user.role)
  }
}

我的表格单元格在加载和单击按钮时设置角色,设置如下:

class UserCell: NSTableCellView{
  @IBOutlet weak var wrapOwner: RolePill!
  @IBOutlet weak var wrapAdmin: RolePill!
  @IBOutlet weak var wrapUser: RolePill!

  @IBAction func clickOwner(_ sender: NSButton) {
    setRole(role: "owner")
  }
  @IBAction func clickAdmin(_ sender: NSButton) {
    setRole(role: "admin")
  }
  @IBAction func clickUser(_ sender: NSButton) {
    setRole(role: "user")
  }
  
  func setRole(role: String){
    let selectedColor = getAccentColor()
    let offColor = Color(named: "BravoDark")!
    let offTextColor = Color(named: "BFC0C2")
    
    switch role{
      case "owner":
        wrapOwner.layer?.borderColor = selectedColor.cgColor
        wrapAdmin.layer?.borderColor = offColor.cgColor
        wrapUser.layer?.borderColor = offColor.cgColor
      
        labelOwner.textColor = Color.white
        labelAdmin.textColor = offTextColor
        labelUser.textColor = offTextColor
      case "admin":
        wrapOwner.layer?.borderColor = offColor.cgColor
        wrapAdmin.layer?.borderColor = selectedColor.cgColor
        wrapUser.layer?.borderColor = offColor.cgColor
        
        labelOwner.textColor = offTextColor
        labelAdmin.textColor = Color.white
        labelUser.textColor = offTextColor
        
      default:
        wrapOwner.layer?.borderColor = offColor.cgColor
        wrapAdmin.layer?.borderColor = offColor.cgColor
        wrapUser.layer?.borderColor = selectedColor.cgColor
      
        labelOwner.textColor = offTextColor
        labelAdmin.textColor = offTextColor
        labelUser.textColor = Color.white 
    }
    
  }
}

当表格最初加载时,无论何时刷新 (tableView.reloadData()),我都会失去边框,看起来像这样:

如您所见,textColor 正确设置为白色。但由于某种原因,直到我实际单击 IBAction 按钮之一并手动触发更改时,才会设置边框。

我怀疑这是某种图层绘制错误,每次我的NSTableView 重新加载时,RolePill 类都会重新绘制,但我不知道如何让它接受在tableView viewForRow 中发送的初始角色状态.

知道我在这里做错了什么吗?谢谢!

【问题讨论】:

  • user.role的值是多少?
  • user.role 是一个String,它可以是owneradminuser
  • role 改变时是否重绘单元格?

标签: cocoa nsview cgcolor


【解决方案1】:

我可以通过在setRole() 中设置所有NSView 属性来使其工作,如下所示:

view.wantsLayer = true
view.layer?.cornerRadius = 11
view.layer?.borderWidth = 2
view.layer?.borderColor = getAccentColor().cgColor

label.textColor = Color.white

似乎我的RolePill 子类上的draw() 方法被频繁调用,所以我无法在其中设置边框颜色,因为它不知道用户的数据状态是什么。

【讨论】:

  • 您是否曾将wantsLayercornerRadiusborderWidth 设置为其他内容?
  • 不,我不知道。我怀疑他们可以住在NSView 子类中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-08-22
  • 2011-04-26
  • 2023-04-06
  • 2011-11-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多