Core Text で縦書き(3)

前回 Core Text で縦書き(2) - 錯綜 のコメント欄で90度回転しなくていいやつを教えてもらえた。 こんな誰も読んでないようなブログでも親切な人が教えてくれたりするものである。 ありがたいことである。

というわけでやってみた。 まず普通に CTFrame を使って横書き。

        …
        let astr = NSAttributedString(string: string)
        let setter = CTFramesetterCreateWithAttributedString(astr)
        let path = CGPath(rect: rect, transform: nil)
        let frame = CTFramesetterCreateFrame(setter, CFRange(), path, nil)
        …

f:id:hrt1ro:20190307144126p:plain
横書き

次に文字列のアトリビュートに縦書きグリフを、 フレームのアトリビュートに進行方向右から左を、指定する。

        …
        let stringAttrs: [NSAttributedString.Key : Any] = [
            .verticalGlyphForm: true,
        ]
        let astr = NSAttributedString(string: string, attributes: stringAttrs)
        let setter = CTFramesetterCreateWithAttributedString(astr)
        let path = CGPath(rect: rect, transform: nil)
        let frameAttrs = [
            kCTFrameProgressionAttributeName: CTFrameProgression.rightToLeft.rawValue,
        ]
        let frame = CTFramesetterCreateFrame(setter, CFRange(), path, frameAttrs as CFDictionary)
        …

f:id:hrt1ro:20190307144205p:plain
縦書き

最初 CFDictionary に CTFrameProgression.rightToLeft を入れていて動かなくて困った。 rawValueがキモだった。分かってみれば当然だけど。

縦書きはたぶんこれで決まりだ。