Tengo un navigationBar con la Derecha y a la Izquierda de la barra de botones en cada lado. Tengo un customTitlelabel que, como el titleView de la UINavigationItem.

[auto.navigationItem setTitleView:customTitleLabel];

Todo está bien ahora. El problema, el tamaño de la rightbarButton es dinámica basada en la información que obtenga en uno de los campos de texto.

Por lo tanto, el título se centra automáticamente en función del espacio disponible entre los botones.

¿cómo puedo ajustar el título de una posición fija?

InformationsquelleAutor Neelesh | 2011-11-24

7 Comentarios

  1. 15

    Usted no puede hacer lo que quiera directamente-la posición de su título de vista está fuera de su control (cuando es gestionado por UINavigationBar).

    Sin embargo, hay al menos dos estrategias para conseguir el efecto que desea:

    1) Añadir el título de la vista no como la «correcta» título de la vista de la barra de navegación, pero como una subvista de la UINavigationBar. (Nota: esto no es ‘oficialmente sancionado, pero lo he visto hacer, y el trabajo. Obviamente, usted tiene que mirar hacia fuera para el título de la etiqueta de la sobreescritura de los bits de los botones, y manejar diferentes tamaño de las barras de navegación para diferentes orientaciones, etc. – un poco engorroso.)

    2) Hacer una inteligente UIView subclase que muestra un determinado subvista (que sería su UILabel) en una posición calculada para mostrar de manera efectiva la subvista perfectamente centrada en la pantalla. En orden a ello, su inteligente UIView subclase respondería a la presentación de eventos (o frame los cambios de propiedad, etc.) cambiando la posición (frame) de la etiqueta subvista.

    Personalmente, me gusta la idea de enfoque 2) la mejor.

  2. 28

    Configuración de la titleView propiedad de la barra de navegación funciona bien – no hay necesidad de subclase o alterar cualquier marcos distintos de los de la vista personalizada.

    El truco para conseguir que centrados en relación al ancho total de UINavigationBar es:

    1. establecer la anchura de su punto de vista según el tamaño del texto
    2. establecer la alineación centrada y
    3. conjunto de la autoresizingmask por lo que se obtiene el tamaño para el espacio disponible

    He aquí un ejemplo de código que crea una costumbre titleView con una etiqueta que sigue centrado en UINavigationBar independientemente de la orientación, a la izquierda o a la derecha barbutton ancho:

    self.title = @"My Centered Nav Title";
    
    //Init views with rects with height and y pos
    CGFloat titleHeight = self.navigationController.navigationBar.frame.size.height;
    UIView *titleView = [[UIView alloc] initWithFrame:CGRectZero];
    UILabel *titleLabel = [[UILabel alloc] initWithFrame:CGRectZero];
    
    //Set font for sizing width
    titleLabel.font = [UIFont boldSystemFontOfSize:20.f];
    
    //Set the width of the views according to the text size
    CGFloat desiredWidth = [self.title sizeWithFont:titleLabel.font
                                constrainedToSize:CGSizeMake([[UIScreen mainScreen] applicationFrame].size.width, titleLabel.frame.size.height)
                                    lineBreakMode:UILineBreakModeCharacterWrap].width;
    
    CGRect frame;
    
    frame = titleLabel.frame;
    frame.size.height = titleHeight;
    frame.size.width = desiredWidth;
    titleLabel.frame = frame;
    
    frame = titleView.frame;
    frame.size.height = titleHeight;
    frame.size.width = desiredWidth;
    titleView.frame = frame;
    
    //Ensure text is on one line, centered and truncates if the bounds are restricted
    titleLabel.numberOfLines = 1;
    titleLabel.lineBreakMode = UILineBreakModeTailTruncation;
    titleLabel.textAlignment = NSTextAlignmentCenter;
    
    //Use autoresizing to restrict the bounds to the area that the titleview allows
    titleView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin;
    titleView.autoresizesSubviews = YES;
    titleLabel.autoresizingMask = titleView.autoresizingMask;
    
    //Set the text
    titleLabel.text = self.title;
    
    //Add as the nav bar's titleview
    [titleView addSubview:titleLabel];
    self.navigationItem.titleView = titleView;
    • También me hizo trabajar con dos de línea de títulos de la configuración de un tamaño de fuente más pequeño y numberOfLines = 2 cuando la longitud del título es mayor de 25 caracteres. De esa manera usted tiene un multi-título de la línea de la etiqueta.
    • También, se olvidó de decir que en el cálculo de desiredWidth el código debe probablemente de referencia titleHeight en lugar de titleLabel.frame.size.height, que será igual a cero debido a CGRectZero de la construcción.
    • Gran respuesta! Me salvó un montón de tiempo
    • No me funciona (iOS7,8). Just replica de título estándar de comportamiento. Ok, permite además que el título de ser multilínea. Pero no pin de título de la barra de navegación de centro a pesar de los anchos de los botones de izquierda y derecha, tal como solicitó en cuestión.
  3. 12
    override func viewDidLoad() {
        super.viewDidLoad()
        navigationController?.navigationBar.topItem?.title = ""
    }
    
    override func viewWillAppear(animated: Bool) {
        super.viewWillAppear(animated)
        navigationItem.title = "Make peace soon"
    }
    • ¿Usted realmente cree que esta solución va a mantener título anclado a la barra de navegación de centro a pesar de los anchos de los botones de izquierda y derecha?
    • No tengo idea de por qué esto funciona… pero no! Si alguien podría explicar por qué, sería muy de agradecer.
    • Yo creo que esto tiene que ver con con la vista del ciclo de vida. viewDidLoad se llama antes de que viewWillLayout así que, básicamente, él es hacer una cadena vacía, que no requiere tamaños. Así que cuando viewWillLayout se llama, tamaños el título para casi nada. A continuación, en viewWillAppear que sucede DESPUÉS de que el diseño fue hecho, él agrega lo que él realmente quiere. No relayout se realiza después de eso.
    • Esto funciona bien. Pero que se reduce el ancho de defecto botón atrás
  4. 3

    La respuesta correcta es reemplazar sizeThatFits: de su costumbre titleView y devolver su contenido tamaño. Barra de navegación centros de título personalizado vista hasta que no queda espacio para hacerlo.

    Por ejemplo, si usted tiene UIView contenedor con UILabel interior:

    @interface CustomTitleView : UIView
    
    @property UILabel* textLabel;
    
    @end
    
    @implementation CustomTitleView
    
    - (CGSize)sizeThatFits:(CGSize)size {
        CGSize textSize = [self.textLabel sizeThatFits:size];
        CGSize contentSize = size;
        contentSize.width = MIN( size.width, textSize.width );
    
        return contentSize;
    }
    
    @end
    • Puede usted aclarar su respuesta? Tenga en cuenta que la pregunta es acerca de centrar el título de la vista horizontalmente en relación a la totalidad de la barra de navegación de ancho, no sólo en el espacio asignado.
  5. 2

    Traté de aopsfan la respuesta pero no funcionó. Un punto de interrupción reveló que el bar del centro fue «(480.0, 22.0)» (La coordenada X del modo off) .

    Así que he cambiado en este:

    - (void)layoutSubviews 
    {
        [super layoutSubviews];
    
        //Center Title View
    
        UINavigationItem* item = [self topItem]; //(Current navigation item)
    
        [item.titleView setCenter:CGPointMake(160.0, 22.0)]; 
        //(...Hard-coded; Assuming portrait iPhone/iPod touch)
    
    }

    …y funciona como un encanto. La diapositiva/efecto de fundido al empujar la vista de los controladores está intacto. (iOS 5.0)

  6. 1

    He tenido un problema similar.
    UINavigationItem centrar el título
    Mi solución es hacer ocultar la original de nuevo el botón, añadir su propia implementación. Dado que el sistema de reserva de espacio para la izquierda los elementos.

    UIImage* cancelIcon = [UIImage imageNamed:@"ic_clear"];
    UIBarButtonItem* cancelButton = [[UIBarButtonItem alloc] initWithImage:cancelIcon style:UIBarButtonItemStylePlain target:self action:@selector(back:)];

    y el selector es simple

    - (void)back:(UIButton *) sender
    {
        [self.navigationController popViewControllerAnimated:YES];
    }

    ahora se parece a esto:
    UINavigationItem centrar el título

    ah…y no te olvides de usar el diseño automático en el título personalizado ver si usted tiene longitud dinámica de contenido como etiqueta en él. Puedo añadir una disposición adicional en la customview para darle como «wrap_content» Android por la configuración se centró a los padres , y el espacio delante y detrás «>=» 0

    UINavigationItem centrar el título

  7. 0

    Tuve una situación similar, donde un titleView debe estar centrada en UINavigationBar. Me gusta occulus del enfoque de crear subclases de una UIView y primordial setFrame:. Entonces, puedo centro de la estructura dentro de las dimensiones de UINavigationBar.

    En el UIView subclase:

    -(void)setFrame:(CGRect)frame{
      super.frame = CGRectMake(320 / 2 - 50, 44 / 2 - 15, 100, 30);
    }

    El UIView subclase puede ser asignado normalmente a titleView para cada navigationItem. El desarrollador no tiene que agregar mediante programación y quitar especial subvistas de UINavigationBar.

Dejar respuesta

Please enter your comment!
Please enter your name here