7
Quiero convertir NSAttributedString que contiene RTFD en mayúsculas sin perder atributos de caracteres y gráficos existentes.cómo cambiar caracteres mayúsculas a superior en NSAttributedString
Gracias,
Quiero convertir NSAttributedString que contiene RTFD en mayúsculas sin perder atributos de caracteres y gráficos existentes.cómo cambiar caracteres mayúsculas a superior en NSAttributedString
Gracias,
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:
NSString
incorporado.
Gracias por la solución. – AmitSri
De nada. – spudwaffle
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