Es posible cambiar el color de una sola palabra en UITextView y UITextField ?

Si he escrito una palabra con un símbolo de enfrente (por ejemplo: @word) , puede que el color se pueden cambiar ?

9 Comentarios

  1. 65

    Sí necesita utilizar NSAttributedString para que, encontrar la RunningAppHere.

    Exploración a través de la palabra y encontrar el rango de su palabra y cambiar su color.

    EDICIÓN:

    - (IBAction)colorWord:(id)sender {
        NSMutableAttributedString * string = [[NSMutableAttributedString alloc]initWithString:self.text.text];
    
        NSArray *words=[self.text.text componentsSeparatedByString:@" "];
    
        for (NSString *word in words) {        
            if ([word hasPrefix:@"@"]) {
                NSRange range=[self.text.text rangeOfString:word];
                [string addAttribute:NSForegroundColorAttributeName value:[UIColor redColor] range:range];           
            }
        }
        [self.text setAttributedText:string];
    }

    EDIT 2 : ver la captura de pantalla
    Es posible cambiar el color de una sola palabra en UITextView y UITextField

    • pero para tomar esa palabra en particular en el campo de texto en una cadena ??
    • comprobar mi actualización
    • Muchas gracias Anoop,cambia a color rojo,Pero las siguientes palabras son también en rojo. :- iphone @Palabras nithin anoop {en esta frase excepto iphone,todo es rojo }
    • Ver a mi edit2, se muestra correctamente…. ¿Ha cambiado algo?
    • realmente el problema es que cuando yo escriba—iphone @word, a continuación, pulse el botón y, a continuación, escriba de nuevo—-nithin Anoop; es también en color rojo
    • he subido mi proyecto en el link… por favor, marque no.
    • Gracias Anoop..funciona bien 🙂
    • – Hermano tengo una duda,espero que me ayuden por Favor revise esta cuestión – stackoverflow.com/questions/14211732/…
    • esta solución es incorrecta, ya que sólo afecta a la primera aparición de cada palabra
    • Como por el debate (una Sola palabra) con OP, él quería que esto sólo. Si quieres que todas las palabras para ser cambiado, si no es mucho trabajo, puede hacerlo fácilmente.
    • Es posible establecer el color de una palabra en particular en Storyboard no de código?
    • No lo creo.
    • Tengo una duda que no podemos ocultar @ de @word ?
    • Hola @Mounika: Sí se puede. Pero de acuerdo a la pregunta, me respondió que el anterior. Para su pregunta, usted puede reemplazar @"@" con @"" después de los códigos anteriores para cambiar el color. No es así de simple?
    • mi requisito es que quiero ocultar @ patrón mientras se muestra el texto para que el usuario & volver, mientras que la edición de texto.
    • Usted puede utilizar delegados para mostrar basada en el color, o la otra forma es para almacenar cadenas de caracteres (attributedString con color rojo sin @ y otro normal cadena con @) & hacer el proceso. Sólo un poco de lógica de programación necesarios para lograr esto.
    • Gracias me fijo 🙂
    • Hola @AnoopVaidya su solución es grande. También es posible dar una palabra un color de fondo diferente ? Quiero implementar algo similar a las etiquetas de búsqueda en la aplicación de correo de ios. Por ejemplo, cuando se selecciona un filtro rápido y, a continuación, el filtro aparece en la barra de búsquedas como un componente separado pero todavía puede escribir por delante para buscar y quitar esta etiqueta por teclado botón atrás.
    • Usted puede hacerlo muy fácilmente, sólo tiene que utilizar NSBackgroundColorAttributeName como clave y poner color en valor.
    • Gracias! Pensé que la parte de color, pero no podía entender cómo agregar etiquetas interactivas/vistas a la barra de búsquedas textfield. Probablemente voy a tener que crear todos los componentes personalizados. Gracias por su ayuda!
    • Lo que si nuestra palabra no tiene un símbolo?!
    • Debe haber alguna cosa distintiva, palabra, símbolo, etc así que usted puede identificar qué texto es necesario para cambiar
    • Bien como, Si la palabra im mirando adelante a cambio de su color es «Cerrado» que claramente no tiene ningún símbolo, por lo que no puedo hacer que su color diferente?
    • Si usted quiere hacer «Cerrado» puede, acaba de obtener su localización & longitud y color. Si desea que el color sólo uno, o todos o algunos de lógica puede. Finalmente, usted tiene algo para identificar esta palabra.
    • este código de trabajo, excepto para el caso cuando la cadena contiene duplicados palabras que inician con «@»

  2. 5

    esta es una rápida aplicación de @Anoop Vaidya respuesta,esta función de detectar cualquier palabra entre {|myword|} , color, estas palabras en rojo y quitar los caracteres especiales, espero que esto pueda ayudar a alguien:

     func getColoredText(text:String) -> NSMutableAttributedString{
        var string:NSMutableAttributedString = NSMutableAttributedString(string: text)
        var words:[NSString] = text.componentsSeparatedByString(" ")
    
        for (var word:NSString) in words {
            if (word.hasPrefix("{|") && word.hasSuffix("|}")) {
                var range:NSRange = (string.string as NSString).rangeOfString(word)
                string.addAttribute(NSForegroundColorAttributeName, value: UIColor.redColor(), range: range)
                word = word.stringByReplacingOccurrencesOfString("{|", withString: "")
                word = word.stringByReplacingOccurrencesOfString("|}", withString: "")
                string.replaceCharactersInRange(range, withString: word)
            }
        }
        return string
    }

    se puede utilizar como esto:

    self.msgText.attributedText = self.getColoredText("i {|love|} this!")
    • Esto no funciona
    • puede usted explicar lo qué tienes
  3. 5

    Modificado @fareed la respuesta para swift 2.0 y esto funciona (probado en un patio de recreo):

    func getColoredText(text: String) -> NSMutableAttributedString {
        let string:NSMutableAttributedString = NSMutableAttributedString(string: text)
        let words:[String] = text.componentsSeparatedByString(" ")
        var w = ""
    
        for word in words {
            if (word.hasPrefix("{|") && word.hasSuffix("|}")) {
                let range:NSRange = (string.string as NSString).rangeOfString(word)
                string.addAttribute(NSForegroundColorAttributeName, value: UIColor.redColor(), range: range)
                w = word.stringByReplacingOccurrencesOfString("{|", withString: "")
                w = w.stringByReplacingOccurrencesOfString("|}", withString: "")
                string.replaceCharactersInRange(range, withString: w)
            }
        }
        return string
    }
    
    getColoredText("i {|love|} this!")
    • hola, estoy intentando modificar ligeramente este para trabajar con una matriz de cadenas, pero en la actualidad tiene algunas dificultades, me preguntaba si usted podría ayudarme? Le pregunté a la pregunta aquí
  4. 3

    @fareed namrouti aplicación reescrito en Swift 3

    func getColoredText(text: String) -> NSMutableAttributedString {
        let string:NSMutableAttributedString = NSMutableAttributedString(string: text)
        let words:[String] = text.components(separatedBy:" ")
        var w = ""
    
        for word in words {
            if (word.hasPrefix("{|") && word.hasSuffix("|}")) {
                let range:NSRange = (string.string as NSString).range(of: word)
                string.addAttribute(NSForegroundColorAttributeName, value: UIColor.red, range: range)
                w = word.replacingOccurrences(of: "{|", with: "")
                w = w.replacingOccurrences(of:"|}", with: "")
                string.replaceCharacters(in: range, with: w)
            }
        }
        return string
    }
  5. 1
    -(void)colorHashtag
    {
    NSMutableAttributedString * string = [[NSMutableAttributedString alloc]initWithString:textView.text];
    
    NSString *str = textView.text;
    NSError *error = nil;
    
    //I Use regex to detect the pattern I want to change color
    NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"#(\w+)" options:0 error:&error];
    
    
    
    NSArray *matches = [regex matchesInString:textView.text options:0 range:NSMakeRange(0, textView.text.length)];
    
    for (NSTextCheckingResult *match in matches) {
        NSRange wordRange = [match rangeAtIndex:0];
        [string addAttribute:NSForegroundColorAttributeName value:[UIColor redColor] range:wordRange]; 
    }
    
    [textView setAttributedText:string];
    }
  6. 0

    Exponer Jamal Kharrat la respuesta, y volver a escribir en SWIFT, aquí está cómo hacerlo en un UITextView:

    1. Conjunto de su UITextView a «Atribuida» en el guión gráfico
    2. Haga clic en & arrastrar a ViewController icono en la parte superior de la vista (XC 6), y establecer el delegado
    3. Crear un IBOutlet para su UITextView (vamos a llamar «textView»)
    4. Hacer que su clase se ajustan a UITextViewDelegate

    Aquí es Jamal función escrita en SWIFT:

    func colorHastag(){
        var string:NSMutableAttributedString = NSMutableAttributedString(string: textView.text)
        var str:NSString = textView.text
        var error:NSError?
        var match:NSTextCheckingResult?
    
        var regEx:NSRegularExpression = NSRegularExpression(pattern: "#(\w+)", options: nil, error: &error)!
        var matches:NSArray = regEx.matchesInString(textView.text, options: nil, range: NSMakeRange(0, countElements(textView.text)))
    
        for (match) in matches {
            var wordRange:NSRange = match.rangeAtIndex(0)
            string.addAttribute(NSForegroundColorAttributeName, value: UIColor.blueColor(), range: wordRange)
        }
    
        textView.attributedText = string
    }

    Ahora, tendrás que llamar a esta función. Para hacer esto cada vez que el usuario escribe un carácter, puede utilizar:

    func textView(textView: UITextView, shouldChangeTextInRange range: NSRange, replacementText text: String) -> Bool {
        self.colorHastag()
        return true
    }

    Te darás cuenta de que he cambiado el color a azul. Usted puede establecer cualquier color. También, usted puede quitar la :Tipo de cada variable. Usted también querrá establecer becomeFirstResponder() y también se encargan de resignFirstResponder() para una buena experiencia de usuario. Usted podría también lanzar en algunos errores de manejo. Esto sólo va a convertir hashtags a azul. Usted tendrá que modificar o agregar un regEx para manejar la @.

    • se va a romper cuando la specail personaje dentro de la palabra
  7. 0

    La solución es esta:

    NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] init];
    
    NSArray *words=[txtDescription.text componentsSeparatedByString:@" "];
    
    for (NSString *word in words)
    {
        if ([word hasPrefix:@"@"] || [word hasPrefix:@"#"])
        {
            [attributedString appendAttributedString:[[NSAttributedString alloc] initWithString:[NSString stringWithFormat:@"%@ ", word]
                                                                                     attributes:@{NSFontAttributeName: [UIFont fontWithName:FONT_LIGHT size:15],
                                                                                                  NSForegroundColorAttributeName: [ImageToolbox colorWithHexString:@"f64d5a"]}]];
        }
        else //normal text
        {
            [attributedString appendAttributedString:[[NSAttributedString alloc] initWithString:[NSString stringWithFormat:@"%@ ", word]
                                                                                     attributes:@{NSFontAttributeName: [UIFont fontWithName:FONT_LIGHT size:15],
                                                                                                  NSForegroundColorAttributeName: [ImageToolbox colorWithHexString:@"3C2023"]}]];
        }
    }
    
    if([[attributedString string] hasSuffix:@" "]) //loose the last space
    {
        NSRange lastCharRange;
        lastCharRange.location=0;
        lastCharRange.length=[attributedString string].length-1;
    
        attributedString=[[NSMutableAttributedString alloc] initWithAttributedString:[attributedString attributedSubstringFromRange:lastCharRange]];
    }
    
    [txtDescription setAttributedText:attributedString];
  8. 0

    Sí es posible. Sin embargo, me he encontrado que puede ser un dolor de cabeza tratando de usar NSMutableAttributesString con un Swift Range. El código de abajo te permiten evitar tener que utilizar el Range clase y se vuelve de un atribuye cadena con las palabras resaltadas con un color diferente.

    extension String {
        func getRanges(of string: String) -> [NSRange] {
            var ranges:[NSRange] = []
            if contains(string) {
                let words = self.components(separatedBy: " ")
                var position:Int = 0
                for word in words {
                    if word.lowercased() == string.lowercased() {
                        let startIndex = position
                        let endIndex = word.characters.count
                        let range = NSMakeRange(startIndex, endIndex)
                        ranges.append(range)
                    }
                    position += (word.characters.count + 1) //+1 for space
                }
            }
            return ranges
        }
        func highlight(_ words: [String], this color: UIColor) -> NSMutableAttributedString {
            let attributedString = NSMutableAttributedString(string: self)
            for word in words {
                let ranges = getRanges(of: word)
                for range in ranges {
                    attributedString.addAttributes([NSForegroundColorAttributeName: color], range: range)
                }
            }
            return attributedString
        }
    }

    Uso:

    //The strings you're interested in
    let string = "The dog ran after the cat"
    let words = ["the", "ran"]
    
    //Highlight words and get back attributed string
    let attributedString = string.highlight(words, this: .yellow)
    
    //Set attributed string
    textView.attributedText = attributedString
  9. 0

    Después de una attributedtext puede establecer typingAttributes de UITextView con los valores que usted desea para usted el campo de entrada.

    NSDictionary *attribs = @{
        NSForegroundColorAttributeName:[UIColor colorWithHex:kUsernameColor],
        NSFontAttributeName:[UIFont robotoRegularWithSize:40]
    };
    self.textView.typingAttributes = attribs;

Dejar respuesta

Please enter your comment!
Please enter your name here