Ajouter le contrôle segmenté à la barre de navigation et garder le titre avec des boutons

je veux ajouter le contrôle segmenté à la barre de navigation mais aussi garder le titre et les boutons, comme dans iOS 7 Appstore acheté section ( exemple )

j'ai essayé d'ajouter le contrôle segmenté comme vue de titre et puis d'utiliser l'invite comme titre, mais alors les boutons sont sur le même niveau que le contrôle segmenté.

24
demandé sur sangi93 2013-09-15 18:36:47

8 réponses

j'ai essayé de résoudre votre problème en utilisant une autre approche car utiliser une barre de navigation ne semblait pas fonctionner (peut-être parce que L'application AppStore utilise une api privée, mais je ne suis pas assez informé pour le dire avec certitude...) Quoi qu'il en soit, j'ai simplement utilisé une barre d'outils placée juste en dessous de la barre de navigation sur laquelle j'ai ajouté un contrôle segmenté, le tout à l'intérieur d'un Contrôleuruiview.

C'est à ça que ça ressemble dans Storyboard: Storyboard

Et voici le résultat en simulateur:

Simulator

faites juste attention à décaler la vue de la table vers le bas pour tenir compte de l'espace vertical utilisé par la barre d'outils. Espérons que cette aide!

11
répondu neural5torm 2013-09-15 16:30:45

j'ai trouvé deux solutions:

1) comme suggéré par neural5torm, vous pouvez ajouter le contrôle segmenté à un uivi avec la même couleur de fond de la barre de navigation

vous pouvez enlever la ligne de cheveux UINavigationBar de cette façon:

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

c'est ok pour pas translucide barre de navigation.





si vous voulez un translucide barre de navigation:

2) sous-classe UINavigationBar pour créer une barre plus haute en remplaçant sizeThatFits

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



Pour utiliser votre barre de navigation personnalisée:

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



Les éléments de titre et de bouton seront en bas. Réglez leurs positions verticales (à l'intérieur de votre barre de navigation personnalisée ou via appearance proxy)

// Title view
[self setTitleVerticalPositionAdjustment:-dy forBarMetrics:UIBarMetricsDefault];

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

regarder la référence de classe UIBarButtonItem, Il ya aussi setTitlePositionAdjustment et d'autres méthodes pour bouton arrière



Lorsque vous créez votre contrôle segmenté, ajoutez-le à la barre de navigation

[self.navigationController.navigationBar addSubview:segmentedControl];



Le contrôle segmenté sera au sommet. Réglez sa position verticale en appuyant sur didAddSubview dans votre barre de navigation personnalisée

- (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;
    }
}
14
répondu user370773 2013-10-18 19:28:48

vous pouvez trouver barre de navigation avec UISegmentedControl dans le code D'échantillon D'Apple: https://developer.apple.com/library/ios/samplecode/NavBar/Introduction/Intro.html

Voici mon interprétation de ce code (créer par programmation):

// 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
9
répondu pigmasha 2014-10-12 12:36:04

vous pouvez utiliser la propriété Prompt élément de navigation pour cela. Il suffit de définir la propriété dans storyboard comme ceci et la barre de navigation se fanera automatiquement de haut en bas bien. Seul inconvénient, c'est que le texte est un peu petit.

enter image description here

6
répondu Zeezer 2015-08-10 12:50:16

j'ai essayé de le faire en Xamarin.iOS, de iOS 6, Vous pouvez hériter UINavigationBar et ajouter des contrôles, Bouton où vous voulez.

2
répondu Michal Dobrodenka 2013-09-26 13:50:24

essayez de créer la sous-classe UINavigationBar et laissez-la se conformer au protocole UIToolbarDelegate. Ensuite, la méthode in-init crée votre contrôle de segment, l'ajoute sur UIToolBar et définit son délégué à votre classe personnalisée UINavigationBar. Alors écrivez cette magie:

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

bonne chance!

2
répondu user1403629 2013-11-12 11:20:19

Je ne l'ai pas entièrement mis en œuvre, mais voici ce que j'ai l'intention de faire. (ios7) Ce serait pour avoir le titre et les boutons sur la même barre de navigation de l'autre côté.

dans storyboard, ajouter une vue à blanc à la barre de navigation. Ajoutez ensuite une étiquette et un contrôle segmenté à cette vue. Cela vous permet d'ajouter de tout contrôle que vous voulez à la barre de navigation. Jusqu'à présent, l'INTERFACE fonctionne, n'ont tout simplement pas câblé. Je voulais juste partager ce que j'ai trouvé jusqu'à présent.

0
répondu Kalel Wade 2014-05-14 16:49:07

ma solution était celle-ci:

Ajoutez la barre d'outils et le contrôle segmenté à votre fichier xib . Personnalisez - le selon vos besoins et connectez-le à une sortie de votre contrôleur de vue:

enter image description here

alors, mettez ceci dans la méthode viewDidLoad :

- (void)viewDidLoad
{
    [super viewDidLoad];

    // add after your setup code
    UIBarButtonItem *item = [[UIBarButtonItem alloc] initWithCustomView:self.segmentedControl];

    self.navigationItem.rightBarButtonItem = item;
}

enter image description here

0
répondu Nikolay Shubenkov 2017-06-08 19:44:58