создать атрибутивную строку из простого текста (в формате Android) в swift для iOS
Я читаю строки из Localizable.strings, который содержит что-то подобное, что в основном то, что у вас есть в strings.xml приложения для Android
"testShort" = "A <b>short</b>\ntest with another<b>bold text</b>";
Жирный шрифт и и перевод строки - единственные два атрибута форматирования, которые у меня есть в моих текстах. Я пытаюсь разработать такой метод в течение нескольких дней безуспешно:
func ConvertText(inputText: String) -> NSAttributedString {
// here comes the conversion to a representation with Helvetica 14pt and Helvetica-Bold 14pt including line feeds.
}
Моя конечная цель - отобразить текст в attitText UITextView.
Будучи новичком в Swift и iOS, не зная Objective-C, я обнаружил, что очень трудно выполнять манипуляции со строками, поскольку они довольно разные и сложные, и все примеры приведены в Objective-C. Что делает это еще сложнее, так это то, что большинство методов API недоступны или отличаются в Swift, чем в Objective-C ...
Вот что я пробовал до сих пор для тела метода с помощью множества других постов здесь:
var test = inputText.dataUsingEncoding(NSUnicodeStringEncoding, allowLossyConversion: true)!
attrStr = NSAttributedString(
data: test,
options: [NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType],
documentAttributes: nil,
error: nil)!
return attrStr
Основные проблемы здесь заключаются в том, что\n
не конвертируется и шрифт очень маленький и другой.
Затем я попытался вручную выделить часть текста. Кажется, работает так:
var newText = NSMutableAttributedString(string: inputText)
newText.addAttribute(NSFontAttributeName, value: UIFont(name: "Helvetica-Bold", size: 14.0)!, range: NSRange(location:2,length:4))
Теперь я попытался найти атрибуты в тексте, удалив их и использовав addAttribute вроде как
// Start of bold text
var range = newText.rangeOfString("<b>")!
// End of bold text
var range2 = newText.rangeOfString("</b>")!
// replacing attributes
newText = newText.stringByReplacingCharactersInRange(range, withString: "")
newText = newText.stringByReplacingCharactersInRange(range2, withString: "")
// creating a range for bold => error "'String.Index' is not convertible to 'int'"
// how to do such a thing
var boldRange = NSMakeRange(range.startIndex, range2.endIndex -3)
// setting bold
newText.addAttribute(NSFontAttributeName, value: UIFont(name: "Helvetica-Bold", size: 14.0)!, range: boldRange)
Вся эта проблема с диапазоном - моя главная проблема на данный момент, поскольку она сильно отличается от простой позиции в последовательности.
Эта проблема является отличным примером отсутствия (или хорошо скрытой) документации:
addAttribute
хочет NSRange, тоrangeOfString
Похоже, что предоставляет общий диапазон в соответствии с полученным сообщением об ошибке, но информации об этом нет. Кнопка поиска документации в Xcode наrangeOfString()
приводит к NSString. Поиск там дляrangeOfString()
говорит, что возвращаетсяNSRange
, Нажатие на это приводит к информации о псевдониме типа для_NSRange
который в свою очередь имеет два свойства NSUInteger с именемlocation
а такжеlength
, Где находятся свойства startIndex и endIndex, которые я вижу в XCode? Очень запутанно ...
Было бы здорово, если бы вы могли дать мне несколько фрагментов или подсказок, где я ошибаюсь, или даже тело метода, поскольку я все еще надеюсь, что это не слишком сложно, если вы хорошо знаете iOS и Swift. Я стремлюсь к поддержке iOS 7.1, но если это проще с iOS 8, то это тоже хорошо.