101 votes

UISegmentedControl ci-dessous UINavigationbar dans iOS 7

Comment puis-je faire une UISegmentedControl comme une partie d'un UINavigationBar dessous? Est-il connecté à l' UINavigationBar ou une vue séparée venez d'ajouter une sous-vue de l' UINavigationController'- vue-contrôleur. Regarde comme il fait partie de l' UINavigationBar puisqu'il y a une ombre au-dessous de la barre.

enter image description here

153voto

Leo Natan Points 25262

C'est un simple effet d'accomplir.

Tout d'abord, placez un segment dans une barre d'outils. Placer cette barre d'outils juste en dessous de la barre de navigation. Définissez le délégué de la barre d'outils à votre vue-contrôleur, et de revenir UIBarPositionTopAttached en positionForBar:. Vous pouvez le voir dans l'app store, si vous effectuez une interactive pop geste, que le segment de la barre ne bouge pas la même que la barre de navigation. C'est parce qu'ils ne sont pas la même barre.

enter image description here

Maintenant, pour enlever la racine des cheveux. Le "filet" est un UIImageView qui est une sous-vue de la barre de navigation. Vous pouvez le trouver et de le définir comme caché. C'est ce que fait Apple dans leur création et leur calendrier d'application, par exemple, ainsi que le magasin d'app. N'oubliez pas de le montrer lorsque l'affichage disparaît. Si vous jouez un peu avec les apps Apple, vous verrez que la racine des cheveux est la valeur hidden sur viewWillAppear: et mis à montré en viewDidDisappear:.

Pour atteindre le style de la barre de recherche, il suffit de mettre la barre searchBarStyle de UISearchBarStyleMinimal.

14voto

Simon Points 291

Maintenant, pour enlever la racine des cheveux. Le "filet" est une UIImageView qui est une sous-vue de la barre de navigation. Vous pouvez le trouver et de le définir comme caché. C'est ce que fait Apple dans leur création et leur calendrier d'application, par exemple, ainsi que le magasin d'app. N'oubliez pas de le montrer lorsque l'affichage disparaît. Si vous jouez un peu avec les apps Apple, vous verrez que la racine des cheveux est la valeur hidden sur viewWillAppear: et jeu pour être montré dans viewDidDisappear:.

Une autre approche consisterait à étudier la naissance des cheveux et de la déplacer au-dessous de l'ajout de la barre d'outils. Voici ce que j'ai trouvé.

@interface ViewController ()
@property (weak, nonatomic) IBOutlet UIToolbar *segmentbar;
@property (weak, nonatomic) UIImageView *navHairline;
@end

@implementation ViewController

#pragma mark - View Lifecycle

- (void)viewDidLoad
{
    [super viewDidLoad];

    // find the hairline below the navigationBar
    for (UIView *aView in self.navigationController.navigationBar.subviews) {
        for (UIView *bView in aView.subviews) {
            if ([bView isKindOfClass:[UIImageView class]] &&
                bView.bounds.size.width == self.navigationController.navigationBar.frame.size.width &&
                bView.bounds.size.height < 2) {
                self.navHairline = (UIImageView *)bView;
            }
        }
    }
}

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    [self _moveHairline:YES];
}

- (void)viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated];
    [self _moveHairline:NO];
}

- (void)_moveHairline:(BOOL)appearing
{
    // move the hairline below the segmentbar
    CGRect hairlineFrame = self.navHairline.frame;
    if (appearing) {
        hairlineFrame.origin.y += self.segmentbar.bounds.size.height;
    } else {
        hairlineFrame.origin.y -= self.segmentbar.bounds.size.height;
    }
    self.navHairline.frame = hairlineFrame;
}

@end

J'ai aussi trouvé l' Apple barre de navigation de Code de l'Échantillon (Personnalisation de UINavigationBar) très utile pour résoudre ce problème.

Veillez également à gérer la bordure supérieure de la UIToolbar, il pourrait se montrer et de vous pourrait confondre avec la racine des cheveux de la barre de navigation. Je voulais aussi le UIToolbar de regarder exactement comme la barre de navigation, vous voulez probablement ajuster les Barres d'outils barTintColor ensuite.

8voto

pigmasha Points 21

Vous pouvez trouver la barre de navigation avec UISegmentedControl dans Apple Exemple de Code: https://developer.apple.com/library/ios/samplecode/NavBar/Introduction/Intro.html

Ou vous pouvez le créer par programmation, voici le code dans ma réponse dans l'autre thread Ajouter sectorielle de contrôle de la barre de navigation et de conserver la propriété avec des boutons

6voto

iTSangar Points 101

Je voulais faire la même chose.. Et obtenu ceci:

1 - UINavigationBar sous-classe

//-------------------------
// UINavigationBarCustom.h
//-------------------------
#import <UIKit/UIKit.h>

@interface UINavigationBarCustom : UINavigationBar

@end


//-------------------------
// UINavigationBarCustom.m
//-------------------------
#import "UINavigationBarCustom.h"

const CGFloat MyNavigationBarHeightIncrease = 38.f;

@implementation UINavigationBarCustom


- (id)initWithCoder:(NSCoder *)aDecoder {

    self = [super initWithCoder:aDecoder];

    if (self) {
        [self initialize];
    }

    return self;
}

- (id)initWithFrame:(CGRect)frame {

    self = [super initWithFrame:frame];

    if (self) {
        [self initialize];
    }

    return self;
}

- (void)initialize {
    // Set tittle position for top
    [self setTitleVerticalPositionAdjustment:-(MyNavigationBarHeightIncrease) forBarMetrics:UIBarMetricsDefault];
}

- (CGSize)sizeThatFits:(CGSize)size {
    // Increase NavBar size
    CGSize amendedSize = [super sizeThatFits:size];
    amendedSize.height += MyNavigationBarHeightIncrease;

    return amendedSize;
}

- (void)layoutSubviews {
// Set buttons position for top
    [super layoutSubviews];

    NSArray *classNamesToReposition = @[@"UINavigationButton"];

    for (UIView *view in [self subviews]) {

        if ([classNamesToReposition containsObject:NSStringFromClass([view class])]) {

            CGRect frame = [view frame];
            frame.origin.y -= MyNavigationBarHeightIncrease;

            [view setFrame:frame];
        }
    }
}

- (void)didAddSubview:(UIView *)subview
{
    // Set segmented position
    [super didAddSubview:subview];

    if ([subview isKindOfClass:[UISegmentedControl class]])
    {
        CGRect frame = subview.frame;
        frame.origin.y += MyNavigationBarHeightIncrease;
        subview.frame = frame;
    }
}

@end

2 - Définissez votre NavigationController avec sous-classe

Set your NavigationController with subclass


3 - Ajoutez votre UISegmentedControl dans navigationBar

enter image description here


4 - Exécuter et de Plaisir ->ne pas oublier de mettre la même couleur sur les deux

enter image description here


la recherche de la source:

Piratage UINavigationBar

S. O question

0voto

sangony Points 4402

Il existe de nombreuses façons de faire ce que vous avez demandé. Le plus simple étant bien sûr de ne créer que dans interface builder, mais je suppose que ce n'est pas ce que vous aviez à l'esprit. J'ai créé un exemple de l'image affichée ci-dessus. Ce n'est pas exactement la même, mais vous pouvez jouer avec les nombreuses propriétés pour obtenir le look et la sensation de ce que vous êtes recherche pour.

Dans le ViewController.h

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController <UITableViewDataSource, UITableViewDelegate, UISearchBarDelegate>

@end

Dans le ViewController.m

#import "ViewController.h"

@interface ViewController ()

@property (strong, nonatomic) UISegmentedControl *mySegmentControl;
@property (strong, nonatomic) UISearchBar *mySearchBar;
@property (strong, nonatomic) UITableView *myTableView;
@property (strong, nonatomic) NSMutableArray *tableDataArray;

@end

@implementation ViewController

- (void)viewDidLoad {
[super viewDidLoad];

// create a custom UIView
UIView *myView = [[UIView alloc] initWithFrame:CGRectMake(0, 64, 320, 84)];
myView.tintColor = [UIColor lightGrayColor]; // change tiny color or delete this line to default

// create a UISegmentControl
self.mySegmentControl = [[UISegmentedControl alloc] initWithItems:[NSArray arrayWithObjects:@"All", @"Not on this iPhone", nil]];
self.mySegmentControl.selectedSegmentIndex = 0;
[self.mySegmentControl addTarget:self action:@selector(segmentAction:) forControlEvents:UIControlEventValueChanged];
self.mySegmentControl.frame = CGRectMake(20, 10, 280, 30);
[myView addSubview:self.mySegmentControl]; // add segment control to custom view

// create UISearchBar
self.mySearchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0, 40, 320, 44)];
[self.mySearchBar setDelegate:self];
self.mySearchBar.searchBarStyle = UISearchBarStyleMinimal;
[myView addSubview:self.mySearchBar]; // add search bar to custom view

[self.view addSubview:myView]; // add custom view to main view

// create table data array
self.tableDataArray = [[NSMutableArray alloc] initWithObjects:
                       @"Line 1",
                       @"Line 2",
                       @"Line 3",
                       @"Line 4",
                       @"Line 5",
                       @"Line 6",
                       @"Line 7",
                       @"Line 8",
                       @"Line 9",
                       @"Line 10",
                       @"Line 11",
                       @"Line 12", nil];
self.myTableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 160, 320, 320)];
[self.myTableView setDataSource:self];
[self.myTableView setDelegate:self];
[self.view addSubview:self.myTableView]; // add table to main view
}

-(void)searchBarSearchButtonClicked:(UISearchBar *)searchBar {
[searchBar resignFirstResponder];
NSLog(@"search text = %@",searchBar.text);
// code for searching...
}

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return 1;
}

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return [self.tableDataArray count];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil)
    {
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
    }

cell.textLabel.text = [self.tableDataArray objectAtIndex:indexPath.row];

return cell;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
NSLog(@"Selected table item: %@",[self.tableDataArray objectAtIndex:indexPath.row]);

// do something once user has selected a table cell...
}

-(void)segmentAction:(id)sender {
NSLog(@"Segment control changed to: %@",[self.mySegmentControl titleForSegmentAtIndex:[self.mySegmentControl selectedSegmentIndex]]);

// do something based on segment control selection...
}

- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}

@end

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X