LayoutKit icon indicating copy to clipboard operation
LayoutKit copied to clipboard

Wrong LabelLayout height when using attributed string with kern and line height

Open plamenterziev opened this issue 6 years ago • 2 comments

For some reasons setting both kern and line height of an attributed string makes boundingRect to return wrong height if the string can fit only one line.

  let paragraphStyle = NSMutableParagraphStyle()
  paragraphStyle.lineSpacing = 100
  let text = NSMutableAttributedString(
       string: "test",
       attributes: [NSAttributedStringKey.paragraphStyle : paragraphStyle,
                           NSAttributedStringKey.kern : 0.1,
                           NSAttributedStringKey.font : UIFont.systemFont(ofSize: 17)])
  let size = text.boundingRect(with: CGSize(width: 1000, height: 1000),
                                                   options: [.usesLineFragmentOrigin], 
                                                   context: nil).size

Here the size is (29.59384765625, 120.287109375) which seems fine for width but the height is wrong (maybe is the real height + the line height).

If the text goes multilines then boundingRect returns correct height.

Also removing the kern attribute or setting it to 0 also fixes the problem.

plamenterziev avatar Feb 13 '18 09:02 plamenterziev

I can reproduce this as well. Removing the kern spacing resolves the issue, but I want to use custom kerning.

itskoBits avatar Feb 15 '18 14:02 itskoBits

This actually is a bug with NSAttriubutedString. You can see more https://stackoverflow.com/questions/48811307/wrong-height-for-uilabel-when-using-custom-linespacing-and-kern.

itskoBits avatar Mar 09 '18 16:03 itskoBits