40

Is there a way to use non breaking spaces in UILabel text?

For example, I have label with 2 lines and line breaking mode set to word wrap. The content for this label is read from database, where it's stored as a string. Now sometimes my text in label looks like that:

lorem ipsum some text
1

but I want to display it like that:

lorem ipsum some
text 1

so basicly, I need to force non breaking space between 'text' and '1'.

I've found some solution here, but I think it could work when the text is entered in source code file. In my case the text is in database.

Any suggestions?

Bartłomiej Semańczyk
  • 59,234
  • 49
  • 233
  • 358
Marcin
  • 1,823
  • 3
  • 16
  • 18

9 Answers9

59

Use the no-break space (\u00a0) ex: @"hello**\u00a0**world!"

post.text = [postText stringByAppendingString: @"1\u00a0hour\u00a0ago."];

U+00A0 / no-break space / Common Separator, space

from: http://en.wikipedia.org/wiki/Whitespace_character

Robby Valles
  • 591
  • 4
  • 4
40

For Swift:

let sentence = "Barcelona, Real Madryt, Juventus Turyn, Bayern Monachium"
let sentencewithnbsp = String(map(sentence.generate()) {
    $0 == " " ? "\u{00a0}" : $0
})
Bartłomiej Semańczyk
  • 59,234
  • 49
  • 233
  • 358
21

In Swift 4 I had to use all caps: \U00A0

Example:

lorem ipsum some\U00A0text 1

Update Feb 2020 from the comments. Thanks to @corban:

In the Localizable.strings file it still needs to be \U00A0 - in code you have to use \u{00a0}

ronatory
  • 7,156
  • 4
  • 29
  • 49
  • 1
    In the Localizable.strings file it still needs to be `\U00A0` - in code you have to use `\u{00a0}`. – corban Feb 13 '20 at 06:18
  • It should be: `lorem ipsum some text\u{00a0}1` for swift. The `\u{00a0}` needs to be between the words you don't want to break. – Slaknation Feb 13 '20 at 19:52
16

If you want to get this to work in a .strings file, you can type OPTION + SPACE instead of a regular space.

.strings files are usually UTF-8 encoded, so if you open it in Hex view, you will see "C2 A0" in place of the special space character.

Gino
  • 228
  • 3
  • 5
1

Here's a Swift extension to fix an orphan in a string by replacing the last space with a non-breaking space:

extension String {
    var replacingLastSpace: String {
        if let lastSpace = range(of: " ", options: .backwards, locale: .current) {
            return replacingCharacters(in: lastSpace, with: "\u{00a0}")
        }
        return self
    }
}

Although note as of iOS 11, UILabels solve this problem automatically.

neave
  • 2,482
  • 1
  • 26
  • 18
  • yes if you need to support Android with unbreakable spaces, then use `\u00A0` in the translation and you in Xcode after loading the translation, do `localizedString.replacingOccurrences(of: "u00A0", with: "\u{00a0}")` – Samuël Mar 20 '23 at 12:56
1

In Inspector set number of lines for Label as 3 or 4 What ever you require Then the Content will be displayed in multiple lines.

SNR
  • 1,249
  • 2
  • 20
  • 38
  • The number of lines is set to 5. That's not a problem. As you can see the text is displayed anyway in 2 lines, in my first and second example. The problem is that I don't want those separated '1' in another line. – Marcin Feb 24 '11 at 13:13
  • Then set number of lines as 1 and in "adjust to fit" decrease the font size. – SNR Feb 24 '11 at 13:18
  • That's not a good option for me, because I want fixed font sizes (for example, to have the same font size as in other labels, with different texts). – Marcin Feb 24 '11 at 13:26
1

You may need to implement a custom word-wrapping function.

// pseudo-code
instring;

get len(instring)
if len > textedit.width*charFontSize
    for (textedit.width*charFontSize ) // cycle through string
        insert `\n` into inString at shortest whitespace

or something like that.

Stephen Furlani
  • 6,794
  • 4
  • 31
  • 60
1

I don't think there's a simple way to do this with UILabel. Of course one way to achieve the same effect is to manually insert a "\n" before "text" in your example. Another option is to use a UIWebView with static HTML instead of the UILabel, so you can use an actual &nbsp.

Martin Gjaldbaek
  • 2,987
  • 4
  • 20
  • 29
  • Finally, I've done this by inserting "\n" in my texts. Not exactly what I've tried to do, but anyway, works. – Marcin Feb 26 '11 at 09:39
0

If this is not going to happen often, you can do this:

NSString *string = @"lorem ipsum some \ntext 1";

label.text = string;

You can dynamically generate where you put the \n using character counts, word counts etc...

Aurum Aquila
  • 9,126
  • 4
  • 25
  • 24