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.
Réponses
Trop de publicités?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.
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
.
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.
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
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
3 - Ajoutez votre UISegmentedControl dans navigationBar
4 - Exécuter et de Plaisir ->ne pas oublier de mettre la même couleur sur les deux
la recherche de la source:
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