일본어로 행간의 잘못을 만지작거리다

2730 단어 SwiftiOS
줄 사이를 만들 때 NSAttributed String, NSParagaphi Style을 사용하도록 문자열로 표시하고 싶습니다.
let style = NSMutableParagraphStyle()
style.lineSpacing = 10.0 // 行間設定

let attr = [NSParagraphStyleAttributeName: style, NSFontAttributeName: font]
let attrStr = NSMutableAttributedString(string: text, attributes: attr)
label.attributedText = attrStr
일본어에 한 줄만 표시되면 들어갈 수 없었던 줄 사이의 공간이 아래에 있습니다.
(원인이 불분명하다.)
여러 줄과 자모표를 쓸 때는 예상대로 된다.

대책


1행과 높이フォントの高さ+行間スペース에서만 높이를 フォントの高さ로 조정할 수 있는 하위 클래스를 실현했다.
class LineSpacingLabel: UILabel {
    var adjustedHeight = CGFloat(0.0)
    var adjustedForLineSpacingBug = false

    override func drawText(in rect: CGRect) {
        var baseRect = rect

        // 本来の描画されるスペースを小さくしているため、そのままにすると上下が切れてしまうのでここで調整する
        if adjustedForLineSpacingBug {
            baseRect.origin.y = adjustedHeight / 2.0
        }

        super.drawText(in: baseRect)
    }

    override var intrinsicContentSize: CGSize {
        let baseSize = super.intrinsicContentSize

        adjustedHeight = 0.0
        adjustedForLineSpacingBug = false

        // lineSpacingを設定しているかつlineSpacingが0以外の時のみ処理を行う
        if let paragraphStyle = attributedText?.attribute(NSParagraphStyleAttributeName, at: 0, effectiveRange: nil) as? NSParagraphStyle,
            paragraphStyle.lineSpacing != 0.0 {

            let fontHeight = ceil(self.font.lineHeight)
            let lineSpacing = paragraphStyle.lineSpacing

            // 固有サイズの高さがフォントの高さ+行間スペースの場合(1行だけど下に行間スペースが挿入されている場合)
            // 本来の高さに変更する
            if baseSize.height == fontHeight + lineSpacing {
                adjustedHeight = lineSpacing
                adjustedForLineSpacingBug = true
                return CGSize(width: baseSize.width, height: fontHeight)
            }
        }

        return baseSize
    }
}

이렇게 되면 일본어 한 줄도 이상한 공간을 열 수 없게 된다.
TextKit를 쓰면 조금 더 엄격해도 괜찮지만 이번엔 문제가 없으니 당분간 놔둬.

기타


더 좋은 실크가 있으면 메시지를 남겨 주세요!
그리고 NSAttributed String 사용할 때 이거 쓰면 편해요!
https://github.com/delba/TextAttributes
이 실시의 샘플은 다음과 같다.
https://github.com/furuyan/LineSpacingSapmle

좋은 웹페이지 즐겨찾기