2016-12-28 3 views
-2

Я пытаюсь установить жирный шрифт двумя разными string range в строке. Я знаю, как это сделать range от range, но можно ли это сделать один раз с несколькими диапазонами. Я не люблю повторять код.Множественный диапазон по NSMutableAttributedString

Вот мой код

if let rankString = trophy.fullRank.value { 
    var secondRankString = "some string" 
    var string = SRUtils.LocalizedString("unlocked.description", comment: "") 
    string = String(format: string, trophy.trophiesNumber.value!, rankString) 

    let atStr = NSMutableAttributedString(string: string) 
    //Here i need to add rankString and other range 
    let textRange = (string as NSString).range(of: rankString) 

    if let font = UIFont(name: "HelveticaNeue-Bold", size: 16) { 
     atStr.addAttribute(NSFontAttributeName, value: font, range: textRange) 
     self.trophyDescription.value = atStr 
    } 
} 

Если, например:

var string = "Hello do you need a cat" 
var rankString = "cat" 

Результат с моим кодом: "Привет вам нужен кот"

Что я нужен:

var mytring = "Hello do you need a cat" 
var rankString = "cat" 
var secondRankString = "need" 

Освобожденные результат: «Здравствуй сделать вам потребностькотом»

Так как я могу, в быстрых 3, добавить несколько диапазонов применение, без многократного декларирования переменного. .. Является ли это возможным ?

+1

вы можете написать метод расширения и передать, сколько диапазонов вы хотите –

ответ

6

два или более, использовать для - Дейкстра

Этот код

import UIKit 

let string = "Hello do you need a cat" 
let attributedString = NSMutableAttributedString(string: string) 
if let font = UIFont(name: "HelveticaNeue", size: 16) { 
    attributedString.addAttribute(NSFontAttributeName, value: font, range: NSRange(location:0, length: string.characters.count)) 
} 

let highlightedWords = ["cat", "need"] 

for highlightedWord in highlightedWords { 
    let textRange = (string as NSString).range(of: highlightedWord) 

    if let font = UIFont(name: "HelveticaNeue-Bold", size: 16) { 
     attributedString.addAttribute(NSFontAttributeName, value: font, range: textRange) 
    } 
} 

let label = UILabel(frame: CGRect(x: 0, y: 0, width: 100, height: 100)) 
label.attributedText = attributedString 
label.sizeToFit() 

результаты в

screenshot


я был просто поиск в другой способ сделать это без для или нескольких декларации

для цикла всегда может быть выражена как более generell время цикла. Но я нахожу, что петли легче понять.

var highlightedWords = ["cat", "need"] 

repeat { 

    if let highlightedWord = highlightedWords.popLast() { 
     let textRange = (string as NSString).range(of: highlightedWord) 

     if let font = UIFont(name: "HelveticaNeue-Bold", size: 16) { 
      attributedString.addAttribute(NSFontAttributeName, value: font, range: textRange) 
     } 
    } 

} while highlightedWords.count > 0 
+0

я был просто поиск другого способа сделать это без для или несколько декларации, но если это не возможно, хорошо, спасибо за ваше время – Makaille

+0

и почему Wouldn Вы хотите использовать? – vikingosegundo

+0

Вы можете, конечно, использовать цикл while, но я не вижу причины, почему это было бы выгодно. – vikingosegundo

Смежные вопросы