2017-05-16 4 views
0

J'ai lu des questions similaires Mais je n'ai pas eu la réponse: J'ai Table View With Headers et le premier a un titre et un numéro Je veux changer la couleur de ce nombre dans l'en-tête dans la vue de table mes codes:comment changer la couleur de la partie du titre d'en-tête dans tableView dans swift 3?

var headerList = ["Account" , "Help" , "" ] 

override func viewDidLoad() { 
     super.viewDidLoad() 
self.headerList[0] = "Account \(userAccountMoney)" 

} 
    override func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { 

    let returnedView = UIView(frame: CGRect(x: 0, y: 0, width: view.frame.size.width, height: 25)) 
    returnedView.backgroundColor = UIColor.init(red: 229/255, green: 233/255, blue: 236/255, alpha: 1.0) 

    let label = UILabel(frame: CGRect(x: -20, y: 7, width: view.frame.size.width, height: 25)) 
    label.text = self.headerList[section] 
    label.textAlignment = .right 
    label.textColor = .lightGray 
} 

que vous voyez dans mes codes les titres d'en-tête sont gris mais je veux dans le premier en-tête Titre du mot de compte soit toujours gris, mais le userAccountMoney être le vert, le problème est que parce userAccountMoney est une autre variable Je ne pourrais pas utiliser des questions similaires

+0

Créer un 'NSAttributedString' et utiliser la propriété' attributeText' – vadian

+0

J'ai lu les questions similaires Mais le problème est que je veux changer textColor Mais tous les mots dans le premier titre d'en-tête –

+0

'NSAttributedString' est la solution . Vois ma réponse. – vadian

Répondre

1

Si vous voulez changer la couleur d'une partie d'une chaîne, vous devez utiliser NS(Mutable)AttributedString et ajoutez l'attribut de couleur que dans la gamme spécifique:

if section == 0 { 
    let sectionTitle = self.headerList[0] 
    let attributedString = NSMutableAttributedString(string: sectionTitle) 
    if sectionTitle.characters.count > 8 { 
     attributedString.addAttribute(NSForegroundColorAttributeName, value: UIColor.red, range: NSRange(location: 8, length: sectionTitle.characters.count - 8)) 
    } 
    label.attributedText = attributedString 
} else { 
    label.text = self.headerList[section] 
} 

L'indice 8 est l'indice codé en dur après "Account "


Cependant, dans votre cas, je vous recommande de créer headerList comme constante

let headerList = ["" , "Help" , "" ] 

puis supprimez le code viewDidLoad et utiliser ce code pour créer le montant du compte dynamiquement

if section == 0 { 
    let attributedString = NSMutableAttributedString(string: "Account ") 
    attributedString.append(NSAttributedString(string: "\(userAccountMoney)", attributes: [NSForegroundColorAttributeName : UIColor.red])) 
    label.attributedText = attributedString 
} else { 
    label.text = self.headerList[section] 
} 
+0

Je reçois une erreur lors de l'utilisation de ce code –

+0

@SaeedRahmatolahi Quelle erreur? – vadian

+0

Terminaison de l'application due à l'exception non interceptée 'NSRangeException', raison: 'NSMutableRLEArray objectAtIndex: effectiveRange :: Hors limites' *** Première pile d'appels: –

0

Je pourrais ne pas comprendre votre problème complètement mais je pense que vous voulez mettre diffe louer la couleur pour votre premier en-tête de table. Pour ce faire, utilisez l'instruction If-else sur la variable section. Vous aimez cette

func setAttributedString(text string : String, subStringRange range : NSRange, subStringFont font1 : UIFont, mainStringFont font2 : UIFont, subStringColor color1 : UIColor = UIColor.gray, mainStringColor color2 : UIColor = UIColor.green) -> NSAttributedString { 

      let mainStringAttribute = [ NSFontAttributeName: font2, NSForegroundColorAttributeName : color2] as [String : Any] 
      let attributedString = NSMutableAttributedString(string: string, attributes: mainStringAttribute) 

      let subStringAttribute = [ NSFontAttributeName: font1, NSForegroundColorAttributeName : color1] as [String : Any] 
      attributedString.addAttributes(subStringAttribute, range: range) 

      return attributedString 
     } 

override func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { 

    if (section == 0) // this is first header 
    { 

    let returnedView = UIView(frame: CGRect(x: 0, y: 0, width: view.frame.size.width, height: 25)) 
    returnedView.backgroundColor = UIColor.init(red: 229/255, green: 233/255, blue: 236/255, alpha: 1.0) 

    let label = UILabel(frame: CGRect(x: -20, y: 7, width: view.frame.size.width, height: 25)) 
    label.text = self.headerList[section] 
    label.textAlignment = .right 
     let font1 = UIFont.systemFont(ofSize: 14.0) 
     let font2 = UIFont.systemFont(ofSize: 14.0) 

     label.attributedText = setAttributedString(text: "", subStringRange: NSRange(location: 0, length: 1), subStringFont: font1, mainStringFont: font2) 


    } 
    else /// remaining headers 
    { 

let returnedView = UIView(frame: CGRect(x: 0, y: 0, width: view.frame.size.width, height: 25)) 
    returnedView.backgroundColor = UIColor.init(red: 229/255, green: 233/255, blue: 236/255, alpha: 1.0) 

    let label = UILabel(frame: CGRect(x: -20, y: 7, width: view.frame.size.width, height: 25)) 
    label.text = self.headerList[section] 
    label.textAlignment = .right 
    label.textColor = .lightGray 
} 
} 
+0

Je ne veux pas changer tous les textColor dans la section 0 Je veux juste changer le texte Couleur un des mots dans la section 0 –

+0

maintenant vérifier s'il vous plaît. J'ai ajouté une nouvelle méthode dans laquelle vous passez votre chaîne et un éventail de texte que vous voulez changer de couleur.Dites-moi si vous toujours face à un problème –

1

En utilisant NSAttributedString vous pouvez créer deux textes à plusieurs couleurs, vous pouvez même changer la police. Voici l'extrait:

let titleAtt = NSAttributedString(string: "Hello", attributes: [NSFontAttributeName:UIFont(name: "Georgia", size: 18.0)!, NSForegroundColorAttributeName: UIColor.blue]) 
let numberAtt = NSAttributedString(string: "123", attributes: [NSFontAttributeName:UIFont(name: "Georgia", size: 18.0)!, NSForegroundColorAttributeName: UIColor.red]) 

let combinationAtt = NSMutableAttributedString() 
combinationAtt.append(titleAtt) 
combinationAtt.append(numberAtt) 
label.attributedText = combinationAtt 
0

Vous pouvez y parvenir en écrivant comme ci-dessous le code:

J'ai créé une fonction commune de le réutiliser dans chaque contrôleur.

//MARK:- Set title with two different color 
func setTitle(title : String, loc : Int, len : Int) -> NSMutableAttributedString 
{ 
    let myMutableString = NSMutableAttributedString(
     string: title, 
     attributes: [:]) 

    myMutableString.addAttribute(
     NSForegroundColorAttributeName, 
     value: UIColor(red: 29/255, green: 140/255, blue: 242/255, alpha: 1.0), 
     range: NSRange(
      location:loc, 
      length:len)) 

    return myMutableString 
} 

J'utilise cette auj comme,

Pour un même contrôleur, vous pouvez l'écrire,

self.lblTitle.attributedText = self.setTitle(title: "My Profile", loc: 3, len: 7) 

Vous pouvez également l'utiliser pour changer la couleur des caractères spécifiques. Vous devez spécifier la longueur de la chaîne et l'emplacement de départ des caractères.