NSTextField标签:动态更改内容并增加宽度以适应

时间:2016-01-03 04:35:23

标签: swift macos cocoa nstextfield

如果我将Label(类NSTextField)拖到Interface Builder中的视图中,然后尝试动态设置其stringValue

self.testingLabel.stringValue = "Labels are really really really long"

然后大部分标签将被切断。

cut off text

如何在不包装/滚动的情况下使标签变得适合其内容?

我尝试过使用此自定义类,但它不起作用。

class AutogrowTextField: NSTextField {
    override var intrinsicContentSize: NSSize {
        get {
            var frame = self.frame;
            frame.size.width = CGFloat.max;

            // Calculate new height within the frame
            // with practically infinite height.
            let width = self.cell!.cellSizeForBounds(frame).width

            Swift.print(width)
            NSBeep()

            Swift.print(self.frame.width)

            return NSMakeSize(width, frame.size.height)
        }
    }

    // you need to invalidate the layout on text change, else it wouldn't grow by changing the text
    override func textDidChange(notification: NSNotification) {
        super.textDidChange(notification)
        self.invalidateIntrinsicContentSize()
    }
}

基本上我只想要这样的HTML文档的默认行为:

<p id="dynamic">Hi</p>

<script>
    document.getElementByID("dynamic").innerHtml = "Something really really really long"
</script>

这对我来说非常痛苦,因为我是Mac OS X和Cocoa的新手,我不是初学者&#39;程序员。

如果有帮助,这里是属性检查器的内容。 (它应该只是所有默认值)

attributes

是,已启用自动布局

enabled

1 个答案:

答案 0 :(得分:0)

您确定您的NIB或情节提要配置为使用自动布局吗?这将是文件检查器上的复选框。

我问的原因是属性检查器将具有&#34;首选宽度_第一运行时布局宽度&#34;复选框,紧靠&#34;使用单线模式&#34;复选框。它没有,这让我觉得自动布局没有启用。

如果您没有使用自动布局,那么您有责任设置标签的框架尺寸,或者更简单地说,通过调用sizeToFit()告诉它调整自身大小以适应其内容

如果您使用自动布局,则标准NSTextField已根据其字符串内容计算其intrinsicContentSize。几乎可以肯定的是,您可能在视图上设置了其他任何约束。您需要确保自动布局系统可以自由调整标签的宽度。因此,您不能设置显式宽度约束。或者,如果您有前导和尾随间距约束,则需要确保标签的抗压优先级足够高,以推送其他相关视图或压缩它们。等