Is it possible to reduce the gap between text, when put in multiple lines in a UILabel
? We can set the frame, font size and number of lines. I want to reduce the gap between the two lines in that label.

- 769
- 2
- 7
- 19

- 37,684
- 43
- 191
- 309
-
1possible duplicate of [How to increase a space between two lines in multiline label?](http://stackoverflow.com/questions/3880526/how-to-increase-a-space-between-two-lines-in-multiline-label) – Suresh Varma Sep 26 '12 at 12:13
-
2May I suggest that you accept one of the answers that is correct for iOS 6.0 and later? The currently accepted answer is out of date. – Mark Amery Oct 10 '13 at 10:44
-
For each line use a new `UILabel`, then embed all labels in a `StackView`. Finally adjust the `spacing` of `StackView`. Remember to stack them vertically. – mfaani Jul 28 '16 at 18:33
-
Refer the following link for solution in Swift 2. http://stackoverflow.com/a/39158698/6602495 – Sneha Aug 26 '16 at 07:27
-
Refer to https://stackoverflow.com/a/44325650/342794 for storyboard tweak and other details. – lal Mar 12 '18 at 20:04
21 Answers
In Xcode 6 you can do this in the storyboard:

- 11,329
- 6
- 41
- 76
-
1
-
This is *exactly* what I needed (I needed to compress the lines). Thanks a lot! – Zoyt Jan 03 '15 at 05:59
-
1Using this option seems to break my ib every time, does anyone know what the issue could be there? – PaperThick Jan 14 '15 at 08:22
-
22@PaperThick have the same issue in 6.1.1. It "harlem shake" for few minutes. Doesn't know how to fix it :) [Xcode Shaking](https://dl.dropboxusercontent.com/s/ln1phh80ka9jfcc/xcode_label_attributes_bug.gif?dl=0) – Anton Gaenko Jan 16 '15 at 12:15
-
9Is there a way to set custom fonts this way ? I can't seem to change that helvetica neue to any other font. – Marcos Curvello Feb 25 '15 at 01:57
-
This is a great solution. Unfortunately Xcode continues to disappoint . . . freezes every time I open this box – Anconia May 04 '15 at 18:53
-
1@Anconia Indeed, an unworkable solution. I've found that switching back to a plain text label will *crash* Xcode 6.3.2. I had to delete the label and start again. – ray May 19 '15 at 22:41
-
1Xcode 6.3.1 when it Harlem Shakes it looks like its broken, but if you click elsewhere eventually it'll go away and all seems ok. – ED-209 Jun 04 '15 at 14:17
-
2If you enable 'Attributed', and then open the file as source code you can edit the 'lineHeightMultiple' manually, and therefore bypass the Harlem Shake bug – ED-209 Jun 04 '15 at 14:25
-
@Marcos it is only working in system font, there is a radar about it for several versions, at this stage customer fonts only work via the CODe and not from the interface builder. – Pichirichi Jul 30 '15 at 10:33
-
1The shake bug is still there in Xcode 7.1.1. Careful what you do while it's shaking, Xcode will queue your clicks and keypresses and fire them all at once after it stops. I ended up having multiple source files modified and moved around. Edit the value directly in the storyboard XML to be safe until this absurd bug is fixed. – dvs Dec 03 '15 at 17:44
-
-
2@azdev for anyone still looking at this, I'm on longer getting the shakes in Xcode 7.3, but I think this is the first version where it hasn't been a problem – LulzCow Apr 13 '16 at 20:07
-
@MarcosCurvello My solution [here](http://stackoverflow.com/a/38643488/5175709) is a workaround that may be useful. – mfaani Jul 29 '16 at 15:08
I thought about adding something new to this answer, so I don't feel as bad... Here is a Swift answer:
import Cocoa
let paragraphStyle = NSMutableParagraphStyle()
paragraphStyle.lineSpacing = 40
let attrString = NSMutableAttributedString(string: "Swift Answer")
attrString.addAttribute(.paragraphStyle, value:paragraphStyle, range:NSMakeRange(0, attrString.length))
var tableViewCell = NSTableCellView()
tableViewCell.textField.attributedStringValue = attrString
"Short answer: you can't. To change the spacing between lines of text, you will have to subclass UILabel and roll your own drawTextInRect, or create multiple labels."
This is a really old answer, and other have already addded the new and better way to handle this.. Please see the up to date answers provided below.

- 4,704
- 1
- 33
- 57

- 22,319
- 10
- 92
- 157
-
25Since iOS 6.0, you can control it via `NSAttributedString` (also available in properties of UILable in Xcode's interface builder). – ıɾuǝʞ Dec 18 '12 at 09:21
-
13Interestingly, as near as I can tell, you can add extra spacing between the lines, but not reduce it via the `NSParagraphStyle` when using an `NSAttributedString`. (I may need to do more testing of the other modifyable properties, but the `lineSpacing` property only allows you to increase it.) – livingtech Sep 12 '13 at 21:28
-
see [my answer](http://stackoverflow.com/a/19258637/832111) to see a way using NSAttributedString – d.ennis Oct 08 '13 at 21:21
-
2@livingtech That is infuriating, and I believe you are correct. Have you found any workarounds? – Dom Vinyard Nov 07 '14 at 14:04
-
Here's what I did and it works great. This is using TTTAttributedLabel, but it should work for and AttributedString: NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init]; paragraphStyle.lineSpacing = 1; [mutableAttributedString addAttribute:NSParagraphStyleAttributeName value:paragraphStyle range:whole]; – CodyMace Dec 09 '14 at 23:02
-
Using iOS 8.2 I was able to to reduce it. You can't set it to 0, however. – Fabien Warniez Mar 15 '15 at 18:49
-
8Just to clarify something in this thread. If you want to shrink the line spacing set the line height to 1.0, and then setLineHeightMultiple to a lower value < 1.0, like: [paragraphStyle setLineHeightMultiple:0.8] or paragraphStyle.lineHeightMultiple = 0.8 – virsunen Jul 13 '16 at 02:25
-
**1)** why are mentioning `tableViewCell` is there any discussion about a tableView or a cell? **2)** when we are changing the layout, why don't we need to call 'setNeedsDisplay' again? – mfaani Aug 01 '16 at 10:45
-
@Honey A UI element is required to see the feature in action. Any will do. Other answers use `UILabel`, I used `NSTextField` within a `NSTableCellView`. Layout and drawing are separate things. `setNeedsDisplay` is for drawing and rendering updates. – Mazyod Aug 01 '16 at 11:00
-
what worked for me is this. extension UILabel { func setLineHeight(lineHeight: CGFloat) { let text = self.text if let text = text { let attributedString = NSMutableAttributedString(string: text) let style = NSMutableParagraphStyle() style.lineHeightMultiple = lineHeight attributedString.addAttribute(.paragraphStyle, value: style, range: NSRange(location: 0, length: text.count)) self.attributedText = attributedString } } } – Shrikant Phadke Jul 23 '21 at 09:53
Starting from iOS 6 you can set an attributed string to the UILabel. Check the following :
NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:label.text];
NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
paragraphStyle.lineSpacing = spacing;
[attributedString addAttribute:NSParagraphStyleAttributeName value:paragraphStyle range:NSMakeRange(0, label.text.length)];
label.attributedText = attributedString;

- 13
- 3

- 3,066
- 1
- 30
- 40
-
1The `attributedString` must be an `NSMutableAttributedString` (NOT NSAttributedString) – Mike S Sep 25 '14 at 17:01
-
14The first line code should be `NSMutableAttributedString *attributedString = [NSMutableAttributedString alloc]initWithString:@"sample text"];` – Allen Dec 12 '14 at 15:11
-
1The `lineSpacing` property of the `NSMutableParagraphStyle` is never negative, so the line height cannot be reduced with this approach. To answer the question, you have to use another property, see @d.ennis answer. – Theo May 03 '15 at 10:28
The solutions stated here didn't work for me. I found a slightly different way to do it with the iOS 6 NSAttributeString:
myLabel.numberOfLines = 0;
NSString* string = @"String with line one. \n Line two. \n Line three.";
NSMutableParagraphStyle *style = [[NSMutableParagraphStyle alloc] init];
style.minimumLineHeight = 30.f;
style.maximumLineHeight = 30.f;
NSDictionary *attributtes = @{NSParagraphStyleAttributeName : style,};
myLabel.attributedText = [[NSAttributedString alloc] initWithString:string
attributes:attributtes];
[myLabel sizeToFit];

- 3,445
- 2
- 28
- 36
-
2Line height is font size dependent. Line spacing is just that, line spacing. You may get things to work out by just setting min/max line height, but that's only because the current font sizes you're using aren't greater than the line height boundaries. Per the documentation: "... glyphs and graphics exceeding this height will overlap neighboring lines ... Although this limit applies to the line itself, line spacing adds extra space between adjacent lines." – Ari Braginsky Oct 17 '13 at 01:11
-
1+1, If you want to reduce the spacing between lines, this is what you want to do. The real line spacing is most likely 0 by default, this is why people report you can only increase it. The problem with spacing being too big comes from the line height being too big, this is why this will get the job done 99% of the time. – lawicko Mar 10 '15 at 11:11
-
2This is the only answer I could find that uses the actual line height value (instead of a ratio) common to design applications such as Photoshop, Sketch, CSS, etc. – Albert Bori Jan 24 '17 at 19:16
From Interface Builder (Storyboard/XIB):
Programmatically:
SWift 4
Using label extension
extension UILabel {
// Pass value for any one of both parameters and see result
func setLineSpacing(lineSpacing: CGFloat = 0.0, lineHeightMultiple: CGFloat = 0.0) {
guard let labelText = self.text else { return }
let paragraphStyle = NSMutableParagraphStyle()
paragraphStyle.lineSpacing = lineSpacing
paragraphStyle.lineHeightMultiple = lineHeightMultiple
let attributedString:NSMutableAttributedString
if let labelattributedText = self.attributedText {
attributedString = NSMutableAttributedString(attributedString: labelattributedText)
} else {
attributedString = NSMutableAttributedString(string: labelText)
}
// Line spacing attribute
attributedString.addAttribute(NSAttributedStringKey.paragraphStyle, value:paragraphStyle, range:NSMakeRange(0, attributedString.length))
self.attributedText = attributedString
}
}
Now call extension function
let label = UILabel()
let stringValue = "How to\ncontrol\nthe\nline spacing\nin UILabel"
// Pass value for any one argument - lineSpacing or lineHeightMultiple
label.setLineSpacing(lineSpacing: 2.0) . // try values 1.0 to 5.0
// or try lineHeightMultiple
//label.setLineSpacing(lineHeightMultiple = 2.0) // try values 0.5 to 2.0
Or using label instance (Just copy & execute this code to see result)
let label = UILabel()
let stringValue = "How to\ncontrol\nthe\nline spacing\nin UILabel"
let attrString = NSMutableAttributedString(string: stringValue)
var style = NSMutableParagraphStyle()
style.lineSpacing = 24 // change line spacing between paragraph like 36 or 48
style.minimumLineHeight = 20 // change line spacing between each line like 30 or 40
// Line spacing attribute
attrString.addAttribute(NSAttributedStringKey.paragraphStyle, value: style, range: NSRange(location: 0, length: stringValue.characters.count))
// Character spacing attribute
attrString.addAttribute(NSAttributedStringKey.kern, value: 2, range: NSMakeRange(0, attrString.length))
label.attributedText = attrString
Swift 3
let label = UILabel()
let stringValue = "How to\ncontrol\nthe\nline spacing\nin UILabel"
let attrString = NSMutableAttributedString(string: stringValue)
var style = NSMutableParagraphStyle()
style.lineSpacing = 24 // change line spacing between paragraph like 36 or 48
style.minimumLineHeight = 20 // change line spacing between each line like 30 or 40
attrString.addAttribute(NSParagraphStyleAttributeName, value: style, range: NSRange(location: 0, length: stringValue.characters.count))
label.attributedText = attrString

- 77,632
- 48
- 245
- 261
-
2Add the line " paragraphStyle.alignment = self.textAlignment" to keep the original alignment . Otherwise, the text will be left aligned. – Nithin Michael Apr 29 '19 at 09:57
-
For anyone loosing ellipsis on large texts, then use: paragraphStyle.lineBreakMode = .byTruncatingTail – christostsang Apr 23 '20 at 21:42
I've made this simple extension that works very well for me:
extension UILabel {
func setLineHeight(lineHeight: CGFloat) {
let paragraphStyle = NSMutableParagraphStyle()
paragraphStyle.lineSpacing = 1.0
paragraphStyle.lineHeightMultiple = lineHeight
paragraphStyle.alignment = self.textAlignment
let attrString = NSMutableAttributedString()
if (self.attributedText != nil) {
attrString.append( self.attributedText!)
} else {
attrString.append( NSMutableAttributedString(string: self.text!))
attrString.addAttribute(NSAttributedStringKey.font, value: self.font, range: NSMakeRange(0, attrString.length))
}
attrString.addAttribute(NSAttributedStringKey.paragraphStyle, value:paragraphStyle, range:NSMakeRange(0, attrString.length))
self.attributedText = attrString
}
}
Copy this in a file, so then you can use it like this
myLabel.setLineHeight(0.7)

- 5,956
- 6
- 40
- 66

- 4,866
- 3
- 29
- 44
-
remember if you doing this while you are also using Storyboard for this label, then be sure to set your label's lines to 0 – mfaani Aug 01 '16 at 03:10
-
Why don't you just directly set the `lineSpacing` and forget about setting `lineHeightMultiple`? – mfaani Aug 01 '16 at 03:27
-
Because the key to reduce the line height is 'lineHeightMultiple', no lineSpacing – Agustin Meriles Aug 01 '16 at 03:33
-
say you want your line height to be 1.4, why can't you just write `.lineSpacing = 1.4` and forget all about `.lineHeightMultiple`... – mfaani Aug 01 '16 at 03:40
-
Hah! I tried, and I didn't work, but I wonder why I don't see other answers here not using your mechanism, I mean they just directly set the lineSpacing. See the accepted answer... – mfaani Aug 01 '16 at 04:19
-
This seems to push my uilabel downwards when i put it in a stackview- anyone have a working project? – UKDataGeek Jul 18 '17 at 17:34
-
-
It works, but you have to make sure you've already assigned text to the label. Otherwise it will crash when your code tries to unwrap the text attribute – yambo Dec 20 '19 at 18:04
There's an alternative answer now in iOS 6, which is to set attributedText on the label, using an NSAttributedString with the appropriate paragraph styles. See this stack overflow answer for details on line height with NSAttributedString:

- 1
- 1

- 422
- 5
- 10
Here is a class that subclass UILabel to have line-height property : https://github.com/LemonCake/MSLabel

- 3,445
- 1
- 25
- 25
-
This worked for me, thanks. I also tried to use MTLabel, but this one was better. – Denis Kutlubaev Jan 10 '13 at 16:20
-
1
In Swift and as a function, inspired by DarkDust
// Usage: setTextWithLineSpacing(myEpicUILabel,text:"Hello",lineSpacing:20)
func setTextWithLineSpacing(label:UILabel,text:String,lineSpacing:CGFloat)
{
let paragraphStyle = NSMutableParagraphStyle()
paragraphStyle.lineSpacing = lineSpacing
let attrString = NSMutableAttributedString(string: text)
attrString.addAttribute(NSAttributedString.Key.paragraphStyle, value:paragraphStyle, range:NSMakeRange(0, attrString.length))
label.attributedText = attrString
}

- 15,419
- 6
- 50
- 75

- 864
- 1
- 10
- 14
According @Mike 's Answer, reducing the lineHeightMultiple
is the key point. Example below, it work well for me:
NSString* text = label.text;
CGFloat textWidth = [text sizeWithAttributes:@{NSFontAttributeName: label.font}].width;
if (textWidth > label.frame.size.width) {
NSMutableParagraphStyle *paragraph = [[NSMutableParagraphStyle alloc] init];
paragraph.alignment = NSTextAlignmentCenter;
paragraph.lineSpacing = 1.0f;
paragraph.lineHeightMultiple = 0.75; // Reduce this value !!!
NSMutableAttributedString* attrText = [[NSMutableAttributedString alloc] initWithString:text];
[attrText addAttribute:NSParagraphStyleAttributeName value:paragraph range:NSMakeRange(0, text.length)];
label.attributedText = attrText;
}

- 4,798
- 4
- 28
- 52

- 2,579
- 3
- 22
- 23
SWIFT 3 useful extension for set space between lines more easily :)
extension UILabel
{
func setLineHeight(lineHeight: CGFloat)
{
let text = self.text
if let text = text
{
let attributeString = NSMutableAttributedString(string: text)
let style = NSMutableParagraphStyle()
style.lineSpacing = lineHeight
attributeString.addAttribute(NSParagraphStyleAttributeName,
value: style,
range: NSMakeRange(0, text.characters.count))
self.attributedText = attributeString
}
}
}

- 1,412
- 16
- 24
I've found a way where you can set the real line height (not a factor) and it even renders live in Interface Builder. Just follow the instructions below. Code is written in Swift 4.
Step #1: Create a file named DesignableLabel.swift
and insert the following code:
import UIKit
@IBDesignable
class DesignableLabel: UILabel {
@IBInspectable var lineHeight: CGFloat = 20 {
didSet {
let paragraphStyle = NSMutableParagraphStyle()
paragraphStyle.minimumLineHeight = lineHeight
paragraphStyle.maximumLineHeight = lineHeight
paragraphStyle.alignment = self.textAlignment
let attrString = NSMutableAttributedString(string: text!)
attrString.addAttribute(NSAttributedStringKey.font, value: font, range: NSRange(location: 0, length: attrString.length))
attrString.addAttribute(NSAttributedStringKey.paragraphStyle, value: paragraphStyle, range: NSRange(location: 0, length: attrString.length))
attributedText = attrString
}
}
}
Step #2: Place a UILabel
into a Storyboard/XIB and set its class to DesignableLabel
. Wait for your project to build (build must succeed!).
Step 3: Now you should see a new property in the properties pane named "Line Height". Just set the value you like and you should see the results immediately!

- 20,202
- 8
- 59
- 80
-
You don't need a subclass to do this. You can do it in a UILabel Extension and still add @IBInspectable - which is important if you already have a UILabel subclass and you don't want a weird class hierarchy – bandejapaisa Jul 11 '23 at 15:13
Here is a subclass of UILabel that sets lineHeightMultiple
and makes sure the intrinsic height is large enough to not cut off text.
@IBDesignable
class Label: UILabel {
override var intrinsicContentSize: CGSize {
var size = super.intrinsicContentSize
let padding = (1.0 - lineHeightMultiple) * font.pointSize
size.height += padding
return size
}
override var text: String? {
didSet {
updateAttributedText()
}
}
@IBInspectable var lineHeightMultiple: CGFloat = 1.0 {
didSet {
updateAttributedText()
}
}
private func updateAttributedText() {
let paragraphStyle = NSMutableParagraphStyle()
paragraphStyle.lineHeightMultiple = lineHeightMultiple
attributedText = NSAttributedString(string: text ?? "", attributes: [
.font: font,
.paragraphStyle: paragraphStyle,
.foregroundColor: textColor
])
invalidateIntrinsicContentSize()
}
}

- 18,161
- 7
- 61
- 51
-
extra padding must be (lineHeightMultiple - 1.0) * font.pointSize, right? – Pavel Alexeev May 22 '20 at 19:34
-
The code above as-is seemed to work for me. But maybe you are right. Did you try your change? @PavelAlexeev – phatmann May 31 '20 at 14:46
-
Swift 3 extension:
import UIKit
extension UILabel {
func setTextWithLineSpacing(text: String, lineHeightMultiply: CGFloat = 1.3) {
let paragraphStyle = NSMutableParagraphStyle()
paragraphStyle.lineHeightMultiple = lineHeightMultiply
paragraphStyle.alignment = .center
let attributedString = NSMutableAttributedString(string: text)
attributedString.addAttribute(NSParagraphStyleAttributeName, value: paragraphStyle, range: NSRange(location: 0, length: attributedString.length))
self.attributedText = attributedString
}
}

- 4,798
- 4
- 28
- 52

- 3,785
- 1
- 30
- 44
-
This solution works for me i just change `paragraphStyle.alignment = .center` to `paragraphStyle.lineBreakMode = .byTruncatingTail paragraphStyle.baseWritingDirection = NSParagraphStyle.defaultWritingDirection(forLanguage: GeneralMethods.getSelectedLanguage().stringValue)` and its automatically adopt direction according to selected language. – Wahab Khan Jadon May 24 '22 at 17:52
In Swift 2.0...
Add an extension:
extension UIView {
func attributesWithLineHeight(font: String, color: UIColor, fontSize: CGFloat, kern: Double, lineHeightMultiple: CGFloat) -> [String: NSObject] {
let titleParagraphStyle = NSMutableParagraphStyle()
titleParagraphStyle.lineHeightMultiple = lineHeightMultiple
let attribute = [
NSForegroundColorAttributeName: color,
NSKernAttributeName: kern,
NSFontAttributeName : UIFont(name: font, size: fontSize)!,
NSParagraphStyleAttributeName: titleParagraphStyle
]
return attribute
}
}
Now, just set your UILabel as attributedText:
self.label.attributedText = NSMutableAttributedString(string: "SwiftExample", attributes: attributesWithLineHeight("SourceSans-Regular", color: UIColor.whiteColor(), fontSize: 20, kern: 2.0, lineHeightMultiple: 0.5))
Obviously, I added a bunch of parameters that you may not need. Play around -- feel free to rewrite the method -- I was looking for this on a bunch of different answers so figured I'd post the whole extension in case it helps someone out there... -rab

- 19
- 3
Swift3 - In a UITextView or UILabel extension, add this function:
I added some code to keep the current attributed text if you are already using attributed strings with the view (instead of overwriting them).
func setLineHeight(_ lineHeight: CGFloat) {
guard let text = self.text, let font = self.font else { return }
let paragraphStyle = NSMutableParagraphStyle()
paragraphStyle.lineSpacing = 1.0
paragraphStyle.lineHeightMultiple = lineHeight
paragraphStyle.alignment = self.textAlignment
var attrString:NSMutableAttributedString
if let attributed = self.attributedText {
attrString = NSMutableAttributedString(attributedString: attributed)
} else {
attrString = NSMutableAttributedString(string: text)
attrString.addAttribute(NSFontAttributeName, value: font, range: NSMakeRange(0, attrString.length))
}
attrString.addAttribute(NSParagraphStyleAttributeName, value:paragraphStyle, range:NSMakeRange(0, attrString.length))
self.attributedText = attrString
}

- 6,123
- 3
- 29
- 29
Another answer... If you're passing the string programmatically, you need to pass a attributed string instead a regular string and change it's style.(iOS10)
NSMutableAttributedString * attrString = [[NSMutableAttributedString alloc] initWithString:@"Your \nregular \nstring"];
NSMutableParagraphStyle *style = [[NSMutableParagraphStyle alloc] init];
[style setLineSpacing:4];
[attrString addAttribute:NSParagraphStyleAttributeName
value:style
range:NSMakeRange(0, attrString.length)];
_label.attributedText = attrString;

- 2,639
- 2
- 19
- 20
This should help with it. You can then assign your label to this custom class within the storyboard and use it's parameters directly within the properties:
open class SpacingLabel : UILabel {
@IBInspectable open var lineHeight:CGFloat = 1 {
didSet {
let paragraphStyle = NSMutableParagraphStyle()
paragraphStyle.lineSpacing = 1.0
paragraphStyle.lineHeightMultiple = self.lineHeight
paragraphStyle.alignment = self.textAlignment
let attrString = NSMutableAttributedString(string: self.text!)
attrString.addAttribute(NSAttributedStringKey.font, value: self.font, range: NSMakeRange(0, attrString.length))
attrString.addAttribute(NSAttributedStringKey.paragraphStyle, value:paragraphStyle, range:NSMakeRange(0, attrString.length))
self.attributedText = attrString
}
}
}

- 5,141
- 5
- 38
- 59

- 91
- 1
- 10
-
This should help with it. You can then assign your label to this custom class within the storyboard and use it's parameters directly within the properties. – Russell Warwick Nov 03 '17 at 14:59
-
please don't put content related to your answer in the comments. your answer should be helpful without having to read through the comments – Neuron Nov 03 '17 at 15:23
Swift 4 label extension. Creating NSMutableAttributedString before passing into function in case there are extra attributes required for the attributed text.
extension UILabel {
func setLineHeightMultiple(to height: CGFloat, withAttributedText attributedText: NSMutableAttributedString) {
let paragraphStyle = NSMutableParagraphStyle()
paragraphStyle.lineSpacing = 1.0
paragraphStyle.lineHeightMultiple = height
paragraphStyle.alignment = textAlignment
attributedText.addAttribute(.paragraphStyle, value: paragraphStyle, range: NSRange(location: 0, length: attributedText.length - 1))
self.attributedText = attributedText
}
}

- 2,864
- 2
- 29
- 39
This code worked for me (ios 7 & ios 8 for sure).
_label.numberOfLines=2;
_label.textColor=[UIColor whiteColor];
NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
paragraphStyle.lineHeightMultiple=0.5;
paragraphStyle.alignment = NSTextAlignmentCenter;
paragraphStyle.lineSpacing = 1.0;
NSDictionary *nameAttributes=@{
NSParagraphStyleAttributeName : paragraphStyle,
NSBaselineOffsetAttributeName:@2.0
};
NSAttributedString *string=[[NSAttributedString alloc] initWithString:@"22m\nago" attributes:nameAttributes];
_label.attributedText=string;

- 3,538
- 3
- 16
- 10
Here is my solution in swift. The subclass should work for both attributedText and text property and for characterSpacing + lineSpacing. It retains the spacing if a new string or attributedString is set.
open class UHBCustomLabel : UILabel {
@IBInspectable open var characterSpacing:CGFloat = 1 {
didSet {
updateWithSpacing()
}
}
@IBInspectable open var lines_spacing:CGFloat = -1 {
didSet {
updateWithSpacing()
}
}
open override var text: String? {
set {
super.text = newValue
updateWithSpacing()
}
get {
return super.text
}
}
open override var attributedText: NSAttributedString? {
set {
super.attributedText = newValue
updateWithSpacing()
}
get {
return super.attributedText
}
}
func updateWithSpacing() {
let attributedString = self.attributedText == nil ? NSMutableAttributedString(string: self.text ?? "") : NSMutableAttributedString(attributedString: attributedText!)
attributedString.addAttribute(NSKernAttributeName, value: self.characterSpacing, range: NSRange(location: 0, length: attributedString.length))
if lines_spacing >= 0 {
let paragraphStyle = NSMutableParagraphStyle()
paragraphStyle.lineSpacing = lines_spacing
paragraphStyle.alignment = textAlignment
attributedString.addAttribute(NSParagraphStyleAttributeName, value:paragraphStyle, range:NSMakeRange(0, attributedString.length))
}
super.attributedText = attributedString
}
}

- 1,203
- 13
- 15