【问题标题】:How to draw border around NSTextView如何在 NSTextView 周围绘制边框
【发布时间】:2023-03-13 08:10:02
【问题描述】:

我只是想在 NSTextView 周围画一个点黑色边框,但遇到了麻烦。下面的代码是NSTextView的一个子类:

override init(frame: NSRect, textContainer: NSTextContainer?)
{
    super.init(frame:frame, textContainer: textContainer)

    self.wantsLayer = true
    self.layer?.borderColor = NSColor.black.cgColor
    self.layer?.borderWidth = 1.0
    self.layer?.cornerRadius = 0.0
}

self.wantsLayer = true 代码导致NSTextView 消失。有没有其他方法可以做到这一点?

编辑:这就是我将NSTextView 又名PageView 添加到其父级view 的方式:

    let textContainer = NSTextContainer()
    textContainer.widthTracksTextView = true
    textContainer.heightTracksTextView = true

    let pageView = PageView(frame: CGRect(x: 0, y: pagesViewOriginY, width: self.paperSize.width, height: self.paperSize.height), textContainer: textContainer)
    self.addSubview(pageView);

    self.layoutManager.addTextContainer(textContainer);

【问题讨论】:

  • 消失了?它是第一次加载时显示的吗?展示您如何将此文本视图添加到您的视图中。
  • @Frankenstein 是的,当我删除 self.wantsLayer = true 时它会显示。我在上面添加了您要求的代码。

标签: swift macos cocoa nstextview


【解决方案1】:

另一种选择是为文本视图创建一个单独的类并使用 draw() 来提供框架:

class TextView: NSTextView {
override func draw(_ rect: NSRect) {
  super.draw(rect)
  let border:NSBezierPath = NSBezierPath(rect: bounds)
  let borderColor = NSColor.black
  borderColor.set()
  border.lineWidth = 2.0
  border.stroke()
}
}

【讨论】:

    【解决方案2】:

    是否可以使用滚动视图并像这样设置边框:

    scrollView.borderType = .lineBorder
    

    或者,您可以将文本视图嵌入到 NSView 中并在其周围绘制边框:

    let embedderRect = NSMakeRect(10, 590, _wndW - 20, 252)
    let embedderView = NSView(frame:embedderRect)
    let textStorage = NSTextStorage()
    let layoutManager = NSLayoutManager()
    textStorage.addLayoutManager(layoutManager)
    let textContainer = NSTextContainer()
    layoutManager.addTextContainer(textContainer)
    let textView = NSTextView(frame:NSMakeRect( 1, 1, embedderRect.size.width - 2, embedderRect.size.height - 2 ), textContainer: textContainer)
    embedderView.wantsLayer = true
    embedderView.layer?.borderColor = NSColor.black.cgColor
    embedderView.layer?.borderWidth = 1.0
    embedderView.layer?.cornerRadius = 0.0
    embedderView.addSubview (textView)
    window.contentView!.addSubview (embedderView)
    

    【讨论】:

    • 谢谢,是的,我考虑过使用父视图来做边框,但想尽量避免它。不过最终我可能不得不这样做。不明白为什么 NSTextView 不允许我这样做。
    猜你喜欢
    • 2011-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-10
    • 1970-01-01
    相关资源
    最近更新 更多