iPhone UILabel - неразрывный пробел

Есть ли способ использовать неразрывные пробелы в тексте UILabel?

Например, у меня есть метка с двумя строками и режим разрыва строки, установленный на перенос слов. Содержимое этой метки считывается из базы данных, где оно хранится в виде строки. Теперь иногда мой текст в ярлыке выглядит так:

lorem ipsum some text
1

но я хочу отобразить это так:

lorem ipsum some
text 1

так что в основном мне нужно заставить неразрывный пробел между «текстом» и «1».

Я нашел решение здесь , но я думаю, что это может работать, когда текст вводится в файл исходного кода. В моем случае текст находится в базе данных.

Какие-либо предложения?


person Marcin    schedule 24.02.2011    source источник


Ответы (9)


Используйте неразрывный пробел ( ), например: @"hello**\u00a0**world!"

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

U+00A0 / неразрывный пробел / Общий разделитель, пробел

из: http://en.wikipedia.org/wiki/Whitespace_character

person Robby Valles    schedule 29.03.2013
comment
Чтобы заставить это работать в моем файле Localizable.strings, мне пришлось использовать все заглавные буквы: \U00A0. - person Adam Sharp; 19.06.2013

Для Свифта:

let sentence = "Barcelona, Real Madryt, Juventus Turyn, Bayern Monachium"
let sentencewithnbsp = String(map(sentence.generate()) {
    $0 == " " ? "\u{00a0}" : $0
})
person Bartłomiej Semańczyk    schedule 12.05.2015
comment
Также возможно использовать \u{00a0} непосредственно в строке без использования функции maplorem\u{00a0}ipsum - person zvonicek; 09.04.2016
comment
Если вы используете Localizable.strings, значение Unicode должно быть в верхнем регистре: hello\U00A0world - person Justin Vallely; 13.03.2019

Если вы хотите, чтобы это работало в файле .strings, вы можете ввести OPTION + SPACE вместо обычного пробела.

Файлы .strings обычно имеют кодировку UTF-8, поэтому, если вы откроете их в шестнадцатеричном представлении, вы увидите «C2 A0» вместо специального символа пробела.

person Gino    schedule 03.10.2016
comment
Спасибо за совет с опцией + пробел - я не знал, что это работает для чего-то другого, кроме новых строк! - person Jon Hocking; 06.04.2017

В Swift 4 мне приходилось использовать все заглавные буквы: \U00A0

Пример:

lorem ipsum some\U00A0text 1

Обновление за февраль 2020 г. из комментариев. Спасибо @corban:

В файле Localizable.strings по-прежнему должно быть \U00A0 — в коде нужно использовать \u{00a0}

person ronatory    schedule 09.02.2018
comment
В файле Localizable.strings он по-прежнему должен быть \U00A0 — в коде вы должны использовать \u{00a0}. - person corban; 13.02.2020
comment
Должно быть: lorem ipsum some text\u{00a0}1 для быстрого. \u{00a0} должен стоять между словами, которые вы не хотите разбивать. - person Slaknation; 13.02.2020

В Inspector установите количество строк для Label как 3 или 4. Что бы вам ни потребовалось. Тогда содержимое будет отображаться в несколько строк.

person SNR    schedule 24.02.2011
comment
Количество строк установлено на 5. Это не проблема. Как видите, текст все равно отображается в 2 строки, в моем первом и втором примере. Проблема в том, что я не хочу, чтобы эти разделенные «1» находились в другой строке. - person Marcin; 24.02.2011
comment
Затем установите количество строк равным 1 и при настройке уменьшите размер шрифта. - person SNR; 24.02.2011
comment
Для меня это не лучший вариант, потому что я хочу фиксированные размеры шрифта (например, чтобы был такой же размер шрифта, как в других метках, с другим текстом). - person Marcin; 24.02.2011

Возможно, вам потребуется реализовать пользовательскую функцию переноса слов.

// 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

или что-то вроде того.

person Stephen Furlani    schedule 24.02.2011

Я не думаю, что есть простой способ сделать это с помощью UILabel. Конечно, один из способов добиться того же эффекта — вручную вставить "\n" перед «text"» в вашем примере. Другой вариант — использовать UIWebView со статическим HTML вместо UILabel, чтобы вы могли использовать фактический &nbsp.

person Martin Gjaldbaek    schedule 24.02.2011
comment
Наконец, я сделал это, вставив \n в свои тексты. Не совсем то, что я пытался сделать, но в любом случае работает. - person Marcin; 26.02.2011

Вот расширение Swift для исправления сироты в строке путем замены последнего пробела неразрывным пробелом:

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

Обратите внимание, что в iOS 11 UILabel автоматически решает эту проблему.

person neave    schedule 19.12.2017

Если это не будет происходить часто, вы можете сделать это:

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

label.text = string;

Вы можете динамически генерировать, где вы помещаете \n, используя количество символов, количество слов и т.д.

person Aurum Aquila    schedule 24.02.2011