Как добавить многострочный текст с помощью NSAttributedString в NSButton? - PullRequest
0 голосов
/ 27 апреля 2018

Мое приложение поддерживает несколько языков. У меня есть объект перевода, который устанавливает строку в заголовке NSButton. Как я могу использовать многострочный, чтобы установить текст внутри моей кнопки? Я использовал self.lineBreakMode = .ByWordWrapping, но он не работает.

class CustomNSButton: NSButton {

override func viewWillDraw() {
    let currentText = Translations.shared.current?[self.identifier ?? ""]?.string ?? self.stringValue
    self.lineBreakMode = .byWordWrapping
    let size  = calculateIdealFontSize(min: 5, max: 16)
    let translatedString = CustomFormatter.string(for: currentText)
    let pstyle = NSMutableParagraphStyle()
    pstyle.alignment = .center
    let translatedAttributedString = CustomFormatter.attributedString(for: translatedString ?? "", withDefaultAttributes:[NSFontAttributeName : NSFont(name: (self.font?.fontName)!, size: CGFloat(size))!, NSParagraphStyleAttributeName : pstyle])!
    attributedTitle = translatedAttributedString
}
}

1 Ответ

0 голосов
/ 07 мая 2018

Я создал многострочный текст, используя let textLabel = NSTextField() и подкласс let textFieldCell = CustomNSTextFieldCell(). Добавить подпредставление в CustomNSButton классе addSubview(textLabel)

class CustomNSButton: NSButton {

    let textLabel = NSTextField()
    let textFieldCell = CustomNSTextFieldCell()

    override func viewWillDraw() {
        textLabel.frame = CGRect(x:0,y:0, width: frame.width - 2, height: frame.height - 2)
        let pstyle = NSMutableParagraphStyle()
        pstyle.alignment = .center
        textLabel.attributedStringValue = CustomFormatter.attributedString(for: translatedString ?? "", withDefaultAttributes:[NSFontAttributeName : NSFont(name: (self.font?.fontName)!, size: CGFloat(size))!, NSParagraphStyleAttributeName : pstyle, NSForegroundColorAttributeName : NSColor.white])!
        textLabel.isEditable = false
        textLabel.isBezeled = false
        textLabel.backgroundColor = NSColor.clear
        textLabel.cell = textFieldCell
        addSubview(textLabel)
    }
}


class CustomNSTextFieldCell: NSTextFieldCell {

    override func drawInterior(withFrame cellFrame: NSRect, in controlView: NSView) {
        let attrString: NSAttributedString? = attributedStringValue
        attrString?.draw(with: titleRect(forBounds: cellFrame), options: [.truncatesLastVisibleLine, .usesLineFragmentOrigin])
    }

    override func titleRect(forBounds theRect: NSRect) -> NSRect {
        var tFrame: NSRect = super.titleRect(forBounds: theRect)
        let attrString: NSAttributedString? = attributedStringValue
        let tRect: NSRect? = attrString?.boundingRect(with: tFrame.size, options: [.truncatesLastVisibleLine, .usesLineFragmentOrigin])
        if (textRect?.size.height)! < tFrame.size.height {
            tFrame.origin.y = theRect.origin.y + (theRect.size.height - (textRect?.size.height)!) / 2.0
            tFrame.size.height = (textRect?.size.height)!
        }
        return tFrame
    }
}
...