Agregar segmentado de control a la barra de navegación y mantener título con botones

Quiero añadir segmentado de control a la barra de navegación, pero también mantener el título y los botones, como en iOS 7 Appstore comprado sección (ejemplo)

He intentado añadir segmentado de control como el título de la vista y, a continuación, utilizando el símbolo del sistema como el título, pero, a continuación, los botones están en el mismo nivel que segmentado de control.

  • Como he escrito he intentado añadir segmentado de control como el título de la vista y el uso de las barras de navegación del sistema para configurar el título, sin embargo los botones que están a continuación.
InformationsquelleAutor sangi93 | 2013-09-15

8 Kommentare

  1. 12

    He intentado resolver su problema con otro enfoque, ya que el uso de una barra de navegación sólo no parecen funcionar (tal vez es porque la AppStore la aplicación es el uso de una api privada, pero no estoy bien informado lo suficiente como para saber con certeza…)
    De todos modos yo simplemente utiliza una barra de herramientas que se colocan justo debajo de la barra de navegación en la que he añadido una segmentación de control, dentro de un regular UIViewController.

    Esto es lo que se ve en el Guión gráfico:
    Agregar segmentado de control a la barra de navegación y mantener título con botones

    Y este es el resultado en el Simulador:

    Agregar segmentado de control a la barra de navegación y mantener título con botones

    Sólo tenga cuidado para compensar la vista de tabla de abajo para la cuenta para el espacio vertical por la barra de herramientas.
    Espero que esto ayude!

    • He pensado acerca de esto antes, y el único problema que tengo con este enfoque es la junta horizontal entre la barra de navegación y segmentado de control.
    • De hecho, este es el problema principal. Si usted viene para arriba con una solución mejor, por favor cree una respuesta con sus resultados. Gracias
    • Me deshice de él con un hack para ocultar la subvista que es el fondo y la construcción de una vista personalizada que es un nav-bar en un taller nav-bar para conseguir la alineación de las celdas de la parte superior. No sé qué limitaciones deben ser añadidos a la subvistas pero también se puede hacer así como así y quitar el anidado nav-bar de mi aplicación.
  2. 15

    He encontrado dos soluciones:

    1) Según lo sugerido por neural5torm, puede agregar la segmentación de control a una UIView con el mismo color de fondo de la barra de navegación

    Puede quitar UINavigationBar de la línea del cabello de esta manera:

    for (UIView *view in self.navigationController.navigationBar.subviews)
    {
        for (UIView *view2 in view.subviews)
        {
            if ([view2 isKindOfClass:[UIImageView class]])
            {
                [view2 removeFromSuperview];
            }
        }
    }

    Que esto está bien para no translúcido barra de navegación.

    Si quieres un translúcido barra de navegación:

    2) Subclase UINavigationBar para crear un taller de la barra reemplazando sizeThatFits

    - (CGSize)sizeThatFits:(CGSize)size
    {
        size.width = self.frame.size.width;
        size.height = your height (probably 88.0f);
        return size;
    }


    El uso de su barra de navegación personalizada:

    UINavigationController *navController = [[UINavigationController alloc] initWithNavigationBarClass:[YouNavigationBar class] toolbarClass:nil];
    [navController setViewControllers:@[viewController]];


    Título y elementos de botón estará en la parte inferior. Ajustar sus posiciones verticales (en el inicio de su barra de navegación personalizada o a través de la apariencia de proxy)

    //Title view
    [self setTitleVerticalPositionAdjustment:-dy forBarMetrics:UIBarMetricsDefault];
    
    //Button item as icon/image 
    [[UIBarButtonItem appearanceWhenContainedIn:[YourCustomNavigationBar class], nil] setBackgroundVerticalPositionAdjustment:-dy forBarMetrics:UIBarMetricsDefault];

    Vistazo a la UIBarButtonItem de referencia de la clase, también hay setTitlePositionAdjustment y otros métodos para el botón atrás


    Cuando usted crea su segmentado de control, agregar a la barra de navegación

    [self.navigationController.navigationBar addSubview:segmentedControl];


    La segmentación de control será en la parte superior. Ajustar la posición vertical reemplazando didAddSubview en su barra de navegación personalizada

    - (void)didAddSubview:(UIView *)subview
    {
        [super didAddSubview:subview];
    
        if ([subview isKindOfClass:[UISegmentedControl class]])
        {
            CGRect frame = subview.frame;
            frame.origin.y += your extra height (probably 44.0f);
            subview.frame = frame;
        }
    }
    • He seguido tus instrucciones y fue capaz de añadir ningún vista a la barra de navegación, pero por desgracia, no fue capaz de interactuar/haga clic en cualquiera de las subvistas. Lo estoy haciendo en un UITableViewController.
  3. 9

    Usted puede encontrar barra de navegación con UISegmentedControl en Apple Código de Ejemplo: https://developer.apple.com/library/ios/samplecode/NavBar/Introduction/Intro.html

    Aquí está mi interpretación de este código (crear mediante programación):

    //File MySegmController.h
    @interface MySegmController : UIViewController
    @end
    
    //File MySegmController.m
    #import "MySegmController.h"
    
    @interface MyNavBarView : UIView
    @end
    
    @interface MySegmController ()<UITableViewDataSource, UITableViewDelegate>
    {
        UISegmentedControl* _segm;
        UITableView* _table;
    }
    @end
    
    #define SEGM_WIDTH 250
    
    @implementation MySegmController
    
    - (void)loadView
    {
        [super loadView];
        self.view.backgroundColor = [UIColor whiteColor];
        self.title = @"Title";
    
        float w = self.view.bounds.size.width;
    
        NSArray* items = [[NSArray alloc] initWithObjects: @"One", @"Two", @"Three", nil];
        _segm = [[UISegmentedControl alloc] initWithItems: items];
        [items release];
        [_segm sizeToFit];
        _segm.frame = CGRectMake((w - SEGM_WIDTH) / 2, 0, SEGM_WIDTH, _segm.bounds.size.height);
        _segm.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin;
        _segm.selectedSegmentIndex = 0;
    
        MyNavBarView* topView = [[MyNavBarView alloc] initWithFrame: CGRectMake(0, 0, w, _segm.bounds.size.height + 10)];
        topView.backgroundColor = [UIColor whiteColor];
        topView.autoresizingMask = UIViewAutoresizingFlexibleWidth;
        [topView addSubview: _segm];
        [_segm release];
    
        _table = [[UITableView alloc] initWithFrame: CGRectMake(0, topView.bounds.size.height, w, self.view.bounds.size.height - topView.bounds.size.height) style: UITableViewStylePlain];
        _table.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
        _table.dataSource = self;
        _table.delegate = self;
        [self.view addSubview: _table];
        [_table release];
    
        //add topView AFTER _table because topView have a shadow
        [self.view addSubview: topView];
        [topView release];
    }
    
    - (void)viewDidLoad
    {
        [super viewDidLoad];
    
        self.navigationController.navigationBar.translucent = NO;
        //pixel_transp.png - 1x1 image with transparent background
        self.navigationController.navigationBar.shadowImage = [UIImage imageNamed: @"pixel_transp"];
        //pixel.png - 1x1 image with white background
        [self.navigationController.navigationBar setBackgroundImage: [UIImage imageNamed: @"pixel"] forBarMetrics: UIBarMetricsDefault];
    
        UIBarButtonItem* bt = [[UIBarButtonItem alloc] initWithBarButtonSystemItem: UIBarButtonSystemItemCancel target: self action: @selector(onCancel)];
        self.navigationItem.rightBarButtonItem = bt;
        [bt release];
    }
    
    - (void)onCancel
    {
        [self.presentingViewController dismissViewControllerAnimated: YES completion: NULL];
    }
    
    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
    {
        return 2;
    }
    
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier: @"MyId"];
        if (!cell) cell = [[[UITableViewCell alloc] initWithStyle: UITableViewCellStyleDefault reuseIdentifier: @"MyId"] autorelease];
        cell.textLabel.text = @"text";
        return cell;
    }
    
    @end
    
    @implementation MyNavBarView
    
    - (void)willMoveToWindow: (UIWindow *)newWindow
    {
        self.layer.shadowOffset = CGSizeMake(0, 1.0f / UIScreen.mainScreen.scale);
        self.layer.shadowRadius = 0;
        self.layer.shadowColor = [UIColor blackColor].CGColor;
        self.layer.shadowOpacity = 0.25f;
    }
    
    @end
    • ¿Cómo funciona esto cuando el segmentedControls muestra tres diferentes viewControllers?
    • No mostramos diferentes viewControllers en este código: acabamos de cambiar _table contenido cuando se selecciona otro elemento en segmentedControl
    • Sí, eso tiene sentido. Casualmente, he publicado una pregunta acerca de mi problema hace una hora: stackoverflow.com/questions/31761396/…
    • Ninguna de las soluciones que he visto me parecen especialmente elegante (incluidos los de Apple), pero el uso de Apple se acercó, parecía el más seguro. En Apple código de ejemplo, he utilizado EnhancedNavBarView y sustituye a la etiqueta con una segmentación de control.
  4. 6

    Usted podría utilizar la navegación elemento de Símbolo del sistema de propiedad de esta. Acaba de establecer la propiedad en el guión como este y la barra de navegación desaparecerán automáticamente hacia arriba y hacia abajo muy bien. El único inconveniente es el texto es un poco pequeño.

    Agregar segmentado de control a la barra de navegación y mantener título con botones

  5. 2

    Intentar crear UINavigationBar subclase y dejar que se ajustan a la UIToolbarDelegate protocolo. En el método init crear su segmento de control, agregar en UIToolBar y establecer su delegado personalizado UINavigationBar clase. Luego de escribir esta magia:

    - (UIBarPosition)positionForBar:(id <UIBarPositioning>)bar {
        return UIBarPositionTopAttached;
    }

    Buena suerte!

    • Se puede ampliar esto? Se sugiere la creación de un UIToolbar, añadiendo como una subvista a la UINavigationBar, y la adición de un UISegmentedControl a la barra de herramientas? Si no, ¿dónde la barra de herramientas se añaden?
  6. 1

    Mi solución fue esta:

    Agregar la Barra de herramientas y Segmentado de control para su xib archivo.
    Personalizar como usted necesita y conéctelo a una toma de corriente de su controlador de vista:

    Agregar segmentado de control a la barra de navegación y mantener título con botones

    A continuación, poner esto en el viewDidLoad método:

    - (void)viewDidLoad
    {
        [super viewDidLoad];
    
        //add after your setup code
        UIBarButtonItem *item = [[UIBarButtonItem alloc] initWithCustomView:self.segmentedControl];
    
        self.navigationItem.rightBarButtonItem = item;
    }

    Agregar segmentado de control a la barra de navegación y mantener título con botones

  7. 0

    No he aplicado plenamente, pero la siguiente es lo que pienso hacer. (ios7) Esto sería para tener el título y los botones en la misma barra de navegación de lado a lado.

    En el guión gráfico, agregar una vista en blanco a la barra de navegación. A continuación, agregue una etiqueta y una segmentación de control a la vista. Esto le permite agregar cualquier control que desee de la barra de navegación. Hasta ahora, la interfaz de usuario de las obras, no con cable de seguridad. Sólo quería compartir lo que he encontrado hasta ahora.

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Recent Articles

Python «set» con duplicados/elementos repetidos

Hay una forma estándar de representar un "conjunto" que puede contener elementos duplicados. Como yo lo entiendo, un conjunto tiene exactamente un cero o...

Python: generador de expresión vs rendimiento

En Python, ¿hay alguna diferencia entre la creación de un generador de objetos a través de un generador de expresión versus el uso de...

Cómo exportar/importar la Masilla lista de sesiones?

Hay una manera de hacer esto? O tengo que tomar manualmente cada archivo de Registro? InformationsquelleAutor s.webbandit | 2012-10-23

no distingue mayúsculas de minúsculas coincidentes en xpath?

Por ejemplo, para el xml a continuación <CATALOG> <CD title="Empire Burlesque"/> <CD title="empire burlesque"/> <CD...