Por fin estoy consiguiendo ronda a la lucha libre con Diseño Automático y parece que no puede averiguar cómo ir de derecha a izquierda (RTL) apoyo al trabajo del modo en que espero/quiero…

He diseñado la vista en el Interface Builder como se muestra:

Diseño automático + RTL + UILabel la alineación del texto

Con el resultante de la aplicación que se ejecuta como se esperaba cuando el uso de inglés:

Diseño automático + RTL + UILabel la alineación del texto

Sin embargo, cuando el cambio a un lenguaje RTL (en árabe, en este caso), toda la vista volteretas (que es grande), pero el UILabeltexto aún está alineado a la izquierda. Me gustaría esperar a ser alineado a la derecha para mantenerse en contra de la UIImageView.

Diseño automático + RTL + UILabel la alineación del texto

Claramente me estoy perdiendo algo, y/o este no está cubierta por el Diseño Automático.

Se supone que tengo que configurar el textAlignment manualmente cuando se utiliza un lenguaje RTL?

  • No creo que el diseño Automático de los cambios internos de los estados de los elementos que allí se expone. En este caso, sí – la mejor apuesta sería que usted necesita para hacer esto manualmente.
  • me puedes decir cómo lo hizo voltear la vista completa mediante Auto de Diseño ?
  • esto es hecho automáticamente por el sistema cuando se cambia a un idioma de derecha a izquierda.
  • Acabo de usar la base de un guión gráfico, no hay más guión para el árabe, cómo tu Xcode se sabe que debe voltear la vista ? ¿el diseño de la volteado interfaz en otro árabe localizada guión gráfico o usar solo 1 storyboard para inglés & árabe ?
  • Todo en un solo guión. Creo Xcode configura para voltear para RTL por defecto. Pero asegúrese de que tiene «Respeto dirección de la lengua» seleccionada en la principal restricción atributos del inspector.
  • ¿Cómo estás de la creación de reflejo de la interfaz de usuario? Si además de cambiar el idioma.Por favor, hágamelo saber.
  • Es proporcionada por Auto de Diseño, cuando se cambia el idioma en la Configuración de la aplicación a un RTL lenguaje es un espejo de la interfaz de usuario.
  • ¿cuál fue la solución para esto?
  • depende de sus necesidades específicas, si usted está contento de tener la anchura de la etiqueta basado en su contenido intrínseco de tamaño, a continuación, DarthMike la respuesta que es el mejor (y de hecho, he sido tentado a aceptar que). Sin embargo, si usted necesita el ancho de la etiqueta para permanecer como se muestra tendría que ir por la ruta de NSTextAlignmentNatural como se menciona en Ken respuesta y mi propio. Yo no lo he probado en iOS 7+ (voy con intrinsicContentSize).
  • gracias, en IB parece que la única manera para establecer la alineación natural es el uso atribuido de la cadena de
  • Mismo tipo de requisito es esta mina. ¿Cómo puedo hacer esto de autodiseño
  • cómo lograr el uso de autoresize o sin autodiseño

8 Comentarios

  1. 25

    Desea NSTextAlignmentNatural. Que implica la alineación del texto de la carga de idioma de la aplicación (no de la secuencia de comandos).

    Para iOS 9 y más tarde (utilizando Xcode 7), se puede establecer este en el guión gráfico (elija el — opción de alineación). Si usted necesidad de centrarse en las versiones anteriores, usted necesita para crear una toma de corriente para la etiqueta y el conjunto de la alineación en awakeFromNib.

    - (void)awakeFromNib {
        [[self label] setTextAlignment:NSTextAlignmentNatural];
    }
    • Esto suena prometedor. Te voy a dar a este un intento en la mañana.
    • Estoy aceptando esto como que me señaló en la dirección correcta, pero no es tan simple. Ver mi respuesta para más detalles.
    • no funciona para mí. cualquier conjetura
    • Xcode 7 permite establecer la alineación natural en las etiquetas.
    • Un poco de mejora en la respuesta: Compruebe por el Centro de Alinear el texto… si (auto.textAlignment != NSTextAlignmentCenter) { [auto setTextAlignment:NSTextAlignmentNatural]; }
    • Rectificación: setTextAlignment debe ser invocado después de awakeFromNib (por ejemplo, en viewDidLoad), de lo contrario, el UILabel propiedades definidas en el guión gráfico de nivel será aplicado (y por lo tanto anular lo que te define…)

  2. 11

    Para mí esas soluciones no ayuda, y terminé haciendo algo muy feo, pero es el único que hizo el truco para mí. Lo he añadido como un NSString categoría:

    NSString+Extras.h:

    #import <Foundation/Foundation.h>
    
    @interface NSString (Extras)
    - (NSTextAlignment)naturalTextAligment;
    @end

    NSString+Extras.m:

    #import "NSString+Extras.h"
    
    @implementation NSString (Extras)
    
    - (NSTextAlignment)naturalTextAligment {
        NSArray *tagschemes = [NSArray arrayWithObjects:NSLinguisticTagSchemeLanguage, nil];
        NSLinguisticTagger *tagger = [[NSLinguisticTagger alloc] initWithTagSchemes:tagschemes options:0];
        [tagger setString:self];
        NSString *language = [tagger tagAtIndex:0 scheme:NSLinguisticTagSchemeLanguage tokenRange:NULL sentenceRange:NULL];
        if ([language rangeOfString:@"he"].location != NSNotFound || [language rangeOfString:@"ar"].location != NSNotFound) {
            return NSTextAlignmentRight;
        } else {
            return NSTextAlignmentLeft;
        }
    }
    @end

    Para detectar la lengua que utiliza este MODO de respuesta.

    • «Natural» de la alineación sólo funciona si se permite la carga del sistema operativo la correcta localización para su aplicación basada en un sistema amplio de la configuración de usuario y tienes ar.lproj o él.lproj en su aplicación. Si usted tiene una aplicación selector de idioma, natural no funciona, y el código que se necesita.
    • Bueno, @lensovet, «Natural» significa la manera en que la naturaleza significaba. Y la naturaleza significaba para hb/ar a ser de derecha a izquierda. El sistema intenta hacerlo con setTextAlignment:NSTextAlignmentNatural pero desde mi experiencia, no funciona como debería, y mi solución, aunque no es «limpio», funciona; alinea el texto en su forma natural, independientemente del idioma del sistema. Lo que quiero es algo como «sistema-lang alineación», que no es «natural alineación».
    • Eres bienvenido para presentar un informe de error solicitando que. Todo lo que estoy diciendo es que es como funciona hoy en día. Se basa en el idioma de la interfaz de la aplicación, no el contenido del texto.
  3. 4

    Creo que usted no desea utilizar la alineación del texto en este caso, de una etiqueta.

    Puede dejar que el ancho se determina por intrinsicContentSize, y elimine todas las restricciones de ancho en la etiqueta. Usted va a conseguir el efecto deseado de la etiqueta de texto alineado a la vista.

    Para el eje x, sólo se necesita esta restricción entre la etiqueta y el imageview:
    [imageview]-[etiqueta]

    Este es sólo un espaciamiento horizontal de restricción. No al principio o al final de superview.

    • Así, es posible que desee agregar un ≥ estándar trailing restricción para asegurarse de que el texto no se ejecuta fuera del borde de la pantalla, que puede suceder con fuentes de mayor tamaño/tipo dinámico/otras cadenas. Pero sí, que es un legítimo solución para aplicaciones de orientación iOS 8 o más.
  4. 4

    El seguimiento de Ken respuesta

    Configuración textAlignment a NSTextAlignmentNatural no es posible en UILabel, se producirá una excepción despedidas:

    Terminating app due to uncaught exception 'NSInvalidArgumentException',
    reason: 'textAlignment does not accept NSTextAlignmentNatural'

    Se funciona cuando se utiliza atribuido texto y este puede se establece en el Interface Builder como se muestra:

    Diseño automático + RTL + UILabel la alineación del texto

    Sin embargo, parece que atribuye el texto no es recogido al localizar el guión gráfico.

    Para conseguir alrededor de esto, he dejado el UILabel configurado como normal en el Interface Builder y creó un NSAttributedString con el texto de la etiqueta, establecer la alineación en el atribuida cadena y asignar a la etiqueta del attributedText propiedad:

    -(void)viewDidLoad
    {
        [super viewDidLoad];
    
        NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
        paragraphStyle.alignment = NSTextAlignmentNatural;
    
        NSMutableAttributedString *string = [[NSMutableAttributedString alloc] initWithString:self.lbl.text];
        [string addAttribute:NSParagraphStyleAttributeName
                       value:paragraphStyle
                       range:NSMakeRange(0, string.length)];
    
        self.lbl.attributedText = string;
    }

    Esto funciona bien en este caso sencillo, pero puedo ver que se caiga cuando usted necesita el más complejo atribuido cadena estilo. Pero, obviamente, en el caso de que usted probablemente iba a ser sólo el uso de NSLocalizedString o equivalentes al crear el NSAttributedString.

    • Esto suena como un error. Ha presentado usted todavía? Me volvería a engañar a ti!
    • No he presentado un error como es mencionado en las notas de la versión 6.1, a la derecha en la parte inferior: developer.apple.com/library/ios/releasenotes/General/…
    • Buena captura! Pero ya que es una limitación grave, estaría tentado a llamar bug aunque solicitud de mejora sería más satisfacción 😉
    • Ya no se bloquea en iOS 7, pero no parece a la derecha de alinear texto RTL :/
    • Por lo tanto, me visita a esta pregunta. Creo que tienes que configurar la alineación de después de ajuste el texto. Has descubierto?
    • Este fragmento de + la definición de mi UILabel a la que se atribuye en mi guión no parece funcionar en iOS7 con texto en hebreo… Alguna idea? (He hecho asegurarse de que el texto está disponible y es correcto con el hebreo chars solo en el momento de la ejecución de estas líneas en mi viewWillAppear)
    • se esta trabajando para usted en iOS 8 o iOS 7?
    • La alineación Natural se basa en el idioma de la interfaz de la aplicación, no el contenido de la etiqueta.

  5. 4

    @Aviel respuesta como un swift UILabel extensión

    //MARK: UILabel extension
    extension UILabel {
        func decideTextDirection () {
            let tagScheme = [NSLinguisticTagSchemeLanguage]
            let tagger    = NSLinguisticTagger(tagSchemes: tagScheme, options: 0)
            tagger.string = self.text
            let lang      = tagger.tagAtIndex(0, scheme: NSLinguisticTagSchemeLanguage,
                tokenRange: nil, sentenceRange: nil)
    
            if lang?.rangeOfString("he") != nil ||  lang?.rangeOfString("ar") != nil {
                self.textAlignment = NSTextAlignment.Right
            } else {
                self.textAlignment = NSTextAlignment.Left
            }
        }
    }

    ¿Cómo se usa ?

    label.text = "كتابة باللغة العربية" //Assign text
    label.decideTextDirection()          //Decide direction
    • su mejor base de la textAlignment valor en (NS)configuración Regional del characterDirection valor
  6. 0

    Esta función me ayudó

    -(void)fnForWritingDirection:(UILabel*)label textFor:(NSString *)stringForText{
    
        NSMutableAttributedString* attrStr = [[NSMutableAttributedString alloc] initWithString: [stringForText stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
    
        NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
    
        [paragraphStyle setBaseWritingDirection:NSWritingDirectionRightToLeft];
    
        [attrStr addAttribute:NSParagraphStyleAttributeName value:paragraphStyle range:NSMakeRange(0, [attrStr length])];
    
        label.attributedText=attrStr;
    
    }
    • Nunca se debe forzar la base de la dirección de escritura de texto, a menos que sea absolutamente necesario. En este caso, no lo es.
  7. 0

    @Aviel respuesta como una rápida 4 UILabel extensión

    extension UILabel {
        func decideTextDirection () {
            let tagScheme = [NSLinguisticTagScheme.language]
            let tagger    = NSLinguisticTagger(tagSchemes: tagScheme, options: 0)
            tagger.string = self.text
            let lang      = tagger.tag(at: 0, scheme: NSLinguisticTagScheme.language,
                                              tokenRange: nil, sentenceRange: nil)
    
            if lang?.rawValue.range(of: "he") != nil ||  lang?.rawValue.range(of: "ar") != nil {
                self.textAlignment = NSTextAlignment.right
            } else {
                self.textAlignment = NSTextAlignment.left
            }
        }
    }

    uso

    label.text = "كتابة باللغة العربية" //Assign text
    label.decideTextDirection()          //Decide direction

Dejar respuesta

Please enter your comment!
Please enter your name here