基于NSTextField自定义一个Label
代码
class LROLabel: NSTextField {
override func hitTest(_ point: NSPoint) -> NSView? {
let view = super.hitTest(point)
if (view == self) {
return nil
}
return nil
}
convenience init(title: String = "", isEditable: Bool = false, alignment: NSTextAlignment = .center, textColor: NSColor = .darkGray, font: NSFont = NSFont.systemFont(ofSize: 12)) {
self.init()
self.stringValue = title
self.isEditable = isEditable
self.isBezeled = false
self.drawsBackground = false
self.isSelectable = true
self.alignment = alignment
self.textColor = textColor
self.font = font
}
}
需要注意
hitTest事件穿透
因为NSTextField是会捕获鼠标事件,所以当这个视图在点击的视图之上时,会影响底下视图的响应事件,所以需要用hitTest
函数判断,如果当前view捕获到事件,直接跳过当前view
isEditable
使用snapKit
布局时,当isEditable
为true
时,需要设置视图的size
;当isEditable
为false
时,视图会自己布局容纳内容的最小size
。
isSelectable
使用snapKit
布局时,在布局无法完全显示内容的情况下,当isSelectable
为true
时,内容会缺省;当isSelectable
为false
时,布局自动撑开,直接将内容全部显示。
备注
snapKit
是对NSLayoutConstraint
进行二次封装的框架,如果用其他对NSLayoutConstraint
进行封装的框架,也需要注意这个问题。