2017-05-13 17 views
0
for i in 0...attString.length-1 
{ 
    attString.enumerateAttribute(NSBackgroundColorAttributeName, in: NSMakeRange(i,1), options: NSAttributedString.EnumerationOptions(rawValue: 0)) { (value, range, stop) -> Void in 
     if let exValue = value as? UIColor 
     { 
      if self.compareColors(c1: exValue, c2: (UIColor(hex: 0x2e4270))) || 
       self.compareColors(c1: exValue, c2: (UIColor(hex: 0xc0e1ff))) || 
       self.compareColors(c1: exValue, c2: (UIColor(hex: 0x7a99b8))) || 
       self.compareColors(c1: exValue, c2: (UIColor(hex: 0xaad5fb))) 
      { 
       aRange = NSMakeRange(i, 1) 
       myValue = self.styles.blueHighlightColor() 
       //DispatchQueue.main.async { 
       mutableAttString.addAttribute(attributeName, value: myValue, range: aRange) 
       //} 
       self.saveChanges = true 
      } 
      else if self.compareColors(c1: exValue, c2: (UIColor(hex: 0x385324))) || 
       self.compareColors(c1: exValue, c2: (UIColor(hex: 0xbde970))) || 
       self.compareColors(c1: exValue, c2: (UIColor(hex: 0x88a752))) 
      { 
       aRange = NSMakeRange(i, 1) 
       myValue = self.styles.greenHighlightColor() 
       //DispatchQueue.main.async { 
       mutableAttString.addAttribute(attributeName, value: myValue, range: aRange) 
       // } 
       self.saveChanges = true 
      } 
      else if self.compareColors(c1: exValue, c2: (UIColor(hex: 0x624b85))) || 
      self.compareColors(c1: exValue, c2: (UIColor(hex: 0xd6affb))) || 
      self.compareColors(c1: exValue, c2: (UIColor(hex: 0x997eb8))) || 
      self.compareColors(c1: exValue, c2: (UIColor(hex: 0xd6affb))) 
      { 
       aRange = NSMakeRange(i, 1) 
       myValue = self.styles.pinkHighlightColor() 
       // DispatchQueue.main.async { 
       mutableAttString.addAttribute(attributeName, value: myValue, range: aRange) 
       //} 
       self.saveChanges = true 
      } 
      else if self.compareColors(c1: exValue, c2: (UIColor(hex: 0x7b5b15))) || 
       self.compareColors(c1: exValue, c2: (UIColor(hex: 0xfbe769))) || 
       self.compareColors(c1: exValue, c2: (UIColor(hex: 0xb4a64d))) 
      { 
       aRange = NSMakeRange(i, 1) 

       myValue = self.styles.yellowHighlightColor() 
       // DispatchQueue.main.async { 
       mutableAttString.addAttribute(attributeName, value: myValue, range: aRange) 
       //} 
       self.saveChanges = true 
      } 
     } 
    } 
} // For loop end 

私はすべてのNSAttributed文字を反復処理し、その背景色をチェックしています。それがokか、if文で定義されていない他の色があれば。それはうまく動作しますが、大きなテキストを入力するとちょっと遅いです。私はDispatchQueue.concurrentPerform(iterations:execute:)を使用してみましたが、クラッシュしました。理由はありません。Grand Center Dispatch For Loop

答えて

1

外側の理由はありません。forループ。帰属文字列を列挙して、NSBackgroundColorAttributeNameを探してください。与えられた範囲を新しい色で置き換えるだけです。

attString.enumerateAttribute(NSBackgroundColorAttributeName, in: NSMakeRange(0, attString.length), options: NSAttributedString.EnumerationOptions(rawValue: 0)) { (value, range, stop) -> Void in 
    if let exValue = value as? UIColor 
    { 
     if self.compareColors(c1: exValue, c2: (UIColor(hex: 0x2e4270))) || 
      self.compareColors(c1: exValue, c2: (UIColor(hex: 0xc0e1ff))) || 
      self.compareColors(c1: exValue, c2: (UIColor(hex: 0x7a99b8))) || 
      self.compareColors(c1: exValue, c2: (UIColor(hex: 0xaad5fb))) 
     { 
      myValue = self.styles.blueHighlightColor() 
      //DispatchQueue.main.async { 
      mutableAttString.addAttribute(attributeName, value: myValue, range: range) 
      //} 
      self.saveChanges = true 
     } 
     else if self.compareColors(c1: exValue, c2: (UIColor(hex: 0x385324))) || 
      self.compareColors(c1: exValue, c2: (UIColor(hex: 0xbde970))) || 
      self.compareColors(c1: exValue, c2: (UIColor(hex: 0x88a752))) 
     { 
      myValue = self.styles.greenHighlightColor() 
      //DispatchQueue.main.async { 
      mutableAttString.addAttribute(attributeName, value: myValue, range: range) 
      // } 
      self.saveChanges = true 
     } 
     else if self.compareColors(c1: exValue, c2: (UIColor(hex: 0x624b85))) || 
     self.compareColors(c1: exValue, c2: (UIColor(hex: 0xd6affb))) || 
     self.compareColors(c1: exValue, c2: (UIColor(hex: 0x997eb8))) || 
     self.compareColors(c1: exValue, c2: (UIColor(hex: 0xd6affb))) 
     { 
      myValue = self.styles.pinkHighlightColor() 
      // DispatchQueue.main.async { 
      mutableAttString.addAttribute(attributeName, value: myValue, range: range) 
      //} 
      self.saveChanges = true 
     } 
     else if self.compareColors(c1: exValue, c2: (UIColor(hex: 0x7b5b15))) || 
      self.compareColors(c1: exValue, c2: (UIColor(hex: 0xfbe769))) || 
      self.compareColors(c1: exValue, c2: (UIColor(hex: 0xb4a64d))) 
     { 
      myValue = self.styles.yellowHighlightColor() 
      // DispatchQueue.main.async { 
      mutableAttString.addAttribute(attributeName, value: myValue, range: range) 
      //} 
      self.saveChanges = true 
     } 
    } 
} 

これが完了したら、さらにこれを改善することができます。カラーマッピングの辞書を作成します。 exValueがキーとして見つかった場合は、その値を置換色として使用します。

+0

ありがとう!今はとても速いです。あなたはそれを作る方法を示すことができますか? – Elita