texto predictivo literatura ejemplo ios text arabic

ios - predictivo - Una forma más ligera de descubrir la dirección de escritura de texto



texto predictivo literatura (3)

Como UITextAlignment está en desuso, aquí hay una categoría NSString con NSWritingDirection:

- (NSWritingDirection)alignment{ if (self.length) { NSArray *rightLeftLanguages = @[@"ar",@"he"]; NSString *lang = CFBridgingRelease(CFStringTokenizerCopyBestStringLanguage((CFStringRef)self,CFRangeMake(0,self.length))); if ([rightLeftLanguages containsObject:lang]) { return NSWritingDirectionRightToLeft; } } return NSWritingDirectionLeftToRight;

}

Quiero determinar la dirección de escritura de una cadena para poder reproducir correctamente los idiomas de derecha a izquierda como el árabe en un CALayer.

entonces tengo este método

+(UITextAlignment)alignmentForString:(NSString *)astring { UITextView *text = [[UITextView alloc] initWithFrame:CGRectZero]; text.text = astring; if ([text baseWritingDirectionForPosition:[text beginningOfDocument] inDirection:UITextStorageDirectionForward] == UITextWritingDirectionRightToLeft) { return UITextAlignmentRight; } return UITextAlignmentLeft; }

Funciona bien, pero se siente un poco pesado solo con el propósito de descubrir de qué manera alinear mi texto, especialmente como se ha llamado en drawInContext (aunque con relativa poca frecuencia).

¿Hay alguna manera más clara de determinar la dirección de escritura para una cadena dada o debería seguir con esto bajo la base de una optimización prematura? Y tiene que ser compatible con iOS 5.


El código en la pregunta aunque funcional es brutalmente costoso. Ejecútelo a través de un generador de perfiles y encontrará que pasa cerca del 80% del tiempo en UITextView.setText cuando se utiliza en el método drawInContext para una capa.

La mayor parte de la respuesta está aquí en Detect Language of NSString

una mejor forma es así ...

+(UITextAlignment)alignmentForString:(NSString *)astring { if (astring.length) { NSArray *rightLeftLanguages = @[@"ar",@"he"]; NSString *lang = CFBridgingRelease(CFStringTokenizerCopyBestStringLanguage((CFStringRef)astring,CFRangeMake(0,[astring length]))); if ([rightLeftLanguages containsObject:lang]) { return UITextAlignmentRight; } } return UITextAlignmentLeft; }

Como el árabe y el hebreo son los únicos idiomas de derecha a izquierda detectables por CFStringTokenizerCopyBestStringLanguage y también deberían cubrir el persa, el urdu y el yiddish, aunque no he probado eso.

ver también http://en.wikipedia.org/wiki/Right-to-left


Rápido

Para mí, el textAlignment de UITextView no funcionaba a menos que editara el texto y la línea desde el inicio.

Basado en la gran respuesta a esta pregunta y el comentario debajo de ella .

let text = "..." let lang = CFStringTokenizerCopyBestStringLanguage(text as CFString, CFRange(location: 0, length: text.characters.count)) if let lang = lang { let direction = NSLocale.characterDirection(forLanguage: lang as String) if direction == .rightToLeft { textView.textAlignment = .right } else { textView.textAlignment = .left } }