2011-07-16 7 views

Respuesta

6

EDIT:

@fluidsonic es correcto que el código original es incorrecta. Debajo hay una versión actualizada en Swift, que reemplaza el texto en cada rango de atributo con una versión en mayúscula de la cadena en ese rango.

extension NSAttributedString { 
    func uppercased() -> NSAttributedString { 

     let result = NSMutableAttributedString(attributedString: self) 

     result.enumerateAttributes(in: NSRange(location: 0, length: length), options: []) {_, range, _ in 
      result.replaceCharacters(in: range, with: (string as NSString).substring(with: range).uppercased()) 
     } 

     return result 
    } 
} 

Respuesta original:

- (NSAttributedString *)upperCaseAttributedStringFromAttributedString:(NSAttributedString *)inAttrString { 
    // Make a mutable copy of your input string 
    NSMutableAttributedString *attrString = [inAttrString mutableCopy]; 

    // Make an array to save the attributes in 
    NSMutableArray *attributes = [NSMutableArray array]; 

    // Add each set of attributes to the array in a dictionary containing the attributes and range 
    [attrString enumerateAttributesInRange:NSMakeRange(0, [attrString length]) options:0 usingBlock:^(NSDictionary *attrs, NSRange range, BOOL *stop) { 
     [attributes addObject:@{@"attrs":attrs, @"range":[NSValue valueWithRange:range]}]; 
    }]; 

    // Make a plain uppercase string 
    NSString *string = [[attrString string]uppercaseString]; 

    // Replace the characters with the uppercase ones 
    [attrString replaceCharactersInRange:NSMakeRange(0, [attrString length]) withString:string]; 

    // Reapply each attribute 
    for (NSDictionary *attribute in attributes) { 
     [attrString setAttributes:attribute[@"attrs"] range:[attribute[@"range"] rangeValue]]; 
    } 

    return attrString; 
} 

Lo que esto hace:

  1. Hace una copia mutable de la cadena de entrada atribuido.
  2. Toma todos los atributos de esa cadena y los pone en una matriz para que puedan ser utilizados más adelante.
  3. Hace una cadena lisa en mayúsculas utilizando el método NSString incorporado.
  4. Vuelve a aplicar todos los atributos.

+0

Gracias por la solución. – AmitSri

+0

De nada. – spudwaffle

+2

El código no es correcto. Puede producir cadenas atribuidas donde los atributos están desactivados por varios caracteres e incluso puede colapsar. El enfoque depende de la cadena inicial y de la cadena en mayúscula para tener el mismo número de caracteres. Pero de acuerdo con la [documentación] (https://developer.apple.com/reference/foundation/nsstring/1409855-uppercased) "No se garantiza que las transformaciones de los casos sean simétricas ni que produzcan cadenas de la misma longitud que los originales. ". – fluidsonic

Cuestiones relacionadas