macOS:无法在基于自定义 NSView 的类中居中 NSTextField

Posted

技术标签:

【中文标题】macOS:无法在基于自定义 NSView 的类中居中 NSTextField【英文标题】:macOS: Cannot center NSTextField inside custom NSView based class 【发布时间】:2019-06-26 05:12:24 【问题描述】:

我正在使用此代码创建一个基于 NSView 的自定义类。

import Foundation
import AppKit

@IBDesignable
class MacBotaoMudaDeCor : NSView 

  lazy var etiqueta: NSTextField = 
    let etiquetax = NSTextField()
    etiquetax.textColor = corLigada


    let xConstraint = NSLayoutConstraint(item: etiquetax,
                                         attribute: .centerX,
                                         relatedBy: .equal,
                                         toItem: self,
                                         attribute: .centerX,
                                         multiplier: 1,
                                         constant: 0)

    let yConstraint = NSLayoutConstraint(item: etiquetax,
                                         attribute: .centerY,
                                         relatedBy: .equal,
                                         toItem: self,
                                         attribute: .centerX,
                                         multiplier: 1,
                                         constant: 0)
    self.addConstraint(xConstraint)
    self.addConstraint(yConstraint)

    etiquetax.integerValue = self.numeroBotao
    etiquetax.sizeToFit()

    self.addSubview(etiquetax)
    return etiquetax
  ()


  // creates a CALayer() and sets it to the layer property of the view
  var mainLayer: CALayer
    get
      if layer == nil
        layer = CALayer()
      
      return layer!
    
  

  @IBInspectable var cornerRadius: CGFloat = 0 
    didSet 
      mainLayer.cornerRadius = cornerRadius
      mainLayer.masksToBounds = cornerRadius > 0
    
  

  @IBInspectable var borderWidth: CGFloat = 0 
    didSet 
      mainLayer.borderWidth = borderWidth
    
  

  @IBInspectable var borderColor: NSColor? 
    didSet 
      mainLayer.borderColor = borderColor?.cgColor
    
  

  @IBInspectable var corDesligada: NSColor = NSColor.white
  @IBInspectable var corLigada: NSColor = NSColor.black


  @IBInspectable var ligado: Bool = false 
    didSet 
      self.ajustar(corFundo: ligado ? self.corLigada : self.corDesligada)
    
  

  @IBInspectable var numeroBotao: Int = 0 
    didSet 
      etiqueta.integerValue = numeroBotao
    
  


  override init(frame frameRect: NSRect) 
    super.init(frame: frameRect)
    self.ajustar(corFundo: corDesligada)
    self.ajustar(corEtiqueta: corLigada)
  

  required init?(coder decoder: NSCoder) 
    super.init(coder: decoder)
    self.ajustar(corFundo: corDesligada)
    self.ajustar(corEtiqueta: corLigada)
  

  override func awakeFromNib() 
    self.ajustar(corFundo: corDesligada)
    self.ajustar(corEtiqueta: corLigada)
  


  func ajustar(corFundo:NSColor) 
    mainLayer.backgroundColor = corFundo.cgColor
  


  func ajustar(corEtiqueta:NSColor) 
    etiqueta.textColor = corLigada
  


这个想法是让一个 NSTextField 以此类表示的视图为中心。

Xcode 在尝试使用此消息安装约束时崩溃。

2019-06-26 06:08:42.341770+0100 设置失败(contentViewController) (NSWindow)上的用户定义检查属性:约束不当 关联不兼容类型的锚:

【问题讨论】:

【参考方案1】:

addConstraint(_:):

约束必须只涉及接收视图范围内的视图。

在添加约束之前添加视图。

【讨论】:

Apple 应该从 Xcode 团队中解雇撒旦,并聘请能写出体面错误消息的人。

以上是关于macOS:无法在基于自定义 NSView 的类中居中 NSTextField的主要内容,如果未能解决你的问题,请参考以下文章

使用 NSView 加载 Xib 文件

无法关闭在 Interface Builder 中创建的 NSView 实例的剪辑

具有自定义基于视图的类的手势检测器

无法解析扩展 FragmentActivity 的类中的方法 getActivity()

自定义 NSView 拖动目标

如何在自定义类中调用“SetDlgItemText”?