その1

「のっぺさん今日はいい天気だなー」

という文章の「のっぺさん」と「今日はいい天気だなー」の間を開けたい時、スペースを挿入すると思ったよりも大きかったり、小さかったりして微妙な事がある。

name = "のっぺさん"
text = "今日はいい天気だなー"
name += NSAttributedString(string: name).then({
      guard name.count > 0 else { return }
      let r = name.index(before: name.endIndex)..<name.endIndex
      let nsr = NSRange(r, in: name)
      $0.addAttributes([Attribute.kern(20)], range: nsr)
})
attr += text

ちょっとThenとSwiftyAttributesを使っている例になりますが、こんな感じでnameとtextの間を20に指定出来る。

何をしているかというと、nameの最後の文字に対してkernを指定しているだけ。
kernは範囲指定した最後の文字にも適用される1ので任意の場所に字間を開けられる。

追記:Attachmentあるとだめだわこれ

その2

その1では問題がある。
例えばNSTextAttachmentを1つ入れたNSAttributedStringの場合、stringは空文字になるので空白がつかなくなってしまう。

name = "のっぺさん"
text = "今日はいい天気だなー"
let attachment = NSTextAttachment()
attachment.bounds = CGRect(x: 0, y: 0, width: space, height: 1)
let space = NSAttributedString(attachment: attachment)
name += space
attr += text

見た目上はこれでOKなはず。
space分の幅を持つNSTextAttachmentを挿入している。


  1. 「きつね」の全体に対してkernを指定すると「き つ ね 」といったように、最後にもkernが適用される。 

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.