Comment puis-je ajouter 2 boutons dans le UINavigationBar
sans XIB?
Les 2 boutons doivent être alignés sur le côté droit du UINavigationBar
.
Je sais comment ajouter un bouton, mais qu'en est-il de deux?
Réponses:
Avec iOS 5+, c'est aussi simple que:
UIBarButtonItem *btnShare = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAction target:self action:@selector(share)];
UIBarButtonItem *btnRefresh = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemRefresh target:self action:@selector(refresh)];
[self.navigationItem setRightBarButtonItems:[NSArray arrayWithObjects:btnShare, btnRefresh, nil]];
J'ai posté du code (voir ci-dessous) pour ajouter deux boutons à droite de la barre de navigation. Vous pouvez définir barStyle = -1
au lieu de sous-classer UIToolbar
.
UIToolbar *tools = [[UIToolbar alloc]
initWithFrame:CGRectMake(0.0f, 0.0f, 103.0f, 44.01f)]; // 44.01 shifts it up 1px for some reason
tools.clearsContextBeforeDrawing = NO;
tools.clipsToBounds = NO;
tools.tintColor = [UIColor colorWithWhite:0.305f alpha:0.0f]; // closest I could get by eye to black, translucent style.
// anyone know how to get it perfect?
tools.barStyle = -1; // clear background
NSMutableArray *buttons = [[NSMutableArray alloc] initWithCapacity:3];
// Create a standard refresh button.
UIBarButtonItem *bi = [[UIBarButtonItem alloc]
initWithBarButtonSystemItem:UIBarButtonSystemItemRefresh target:self action:@selector(refresh:)];
[buttons addObject:bi];
[bi release];
// Create a spacer.
bi = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace target:nil action:nil];
bi.width = 12.0f;
[buttons addObject:bi];
[bi release];
// Add profile button.
bi = [[UIBarButtonItem alloc] initWithTitle:@"Profile" style:UIBarButtonItemStylePlain target:self action:@selector(goToProfile)];
bi.style = UIBarButtonItemStyleBordered;
[buttons addObject:bi];
[bi release];
// Add buttons to toolbar and toolbar to nav bar.
[tools setItems:buttons animated:NO];
[buttons release];
UIBarButtonItem *twoButtons = [[UIBarButtonItem alloc] initWithCustomView:tools];
[tools release];
self.navigationItem.rightBarButtonItem = twoButtons;
[twoButtons release];
tools.barStyle = -1
ligne: sans cela, il y a des artefacts visuels si vous utilisez UIBarStyleBlack avec translucent = YES. (À savoir, la couleur d'arrière-plan ne correspond pas à celle de la barre de navigation.) Est-ce une fonctionnalité non documentée? Si c'est le cas, ce code est assez fragile. Je n'ai vu cela nulle part dans les documents.
Vous pouvez utiliser un bouton de barre initialisé avec une barre d' outils comme vue personnalisée.
UIToolbar* toolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 103.0f, 44.01f)];
NSArray* buttons = [NSArray arrayWithObjects:self.editButtonItem, someOtherButton, nil];
[toolbar setItems:buttons animated:NO];
self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:toolbar];
Donnerait quelque chose comme ça:
Remarque: cette réponse est obsolète pour iOS 6 ou version ultérieure
Voici l'exemple de travail de mon projet actuel:
UIButton *homeBtn = [UIButton buttonWithType:UIButtonTypeCustom];
[homeBtn setImage:[UIImage imageNamed:@"home-icon"] forState:UIControlStateNormal];
//[homeBtn addTarget:self action:@selector(home) forControlEvents:UIControlEventTouchUpInside];
[homeBtn setFrame:CGRectMake(0, 0, 32, 32)];
UIButton *settingsBtn = [UIButton buttonWithType:UIButtonTypeCustom];
[settingsBtn setImage:[UIImage imageNamed:@"settings-icon"] forState:UIControlStateNormal];
//[settingsBtn addTarget:self action:@selector(settings) forControlEvents:UIControlEventTouchUpInside];
[settingsBtn setFrame:CGRectMake(44, 0, 32, 32)];
UIView *rightBarButtonItems = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 76, 32)];
[rightBarButtonItems addSubview:homeBtn];
[rightBarButtonItems addSubview:settingsBtn];
self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:rightBarButtonItems];
UINavigationBar *navBarView = [[UINavigationBar alloc] initWithFrame: CGRectMake(0.0f, 0.0f, 320.0f, 42.0f)];
navBarView.tintColor= [UIColor colorWithRed:90.0/255.0f green:53.0/255.0f blue:45.0/255.0f alpha:1.0];
UIBarButtonItem *left=[[UIBarButtonItem alloc]initWithTitle:@"Back" style:UIBarButtonItemStylePlain target:self action:@selector(backView)];
UIBarButtonItem *right=[[UIBarButtonItem alloc]initWithTitle:@"Save" style:UIBarButtonItemStylePlain target:self action:@selector(SaveImage)];
UIBarButtonItem *Add=[[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(AddComment:)];
UINavigationItem *navigationItem = [[UINavigationItem alloc] init];
navigationItem.leftBarButtonItem = left;
NSMutableArray *buttonArray=[[NSMutableArray alloc]initWithCapacity:2];
[buttonArray addObject:right];
[buttonArray addObject:Add];
navigationItem.rightBarButtonItems = buttonArray;
[navBarView pushNavigationItem:navigationItem animated:NO];
[self.view addSubView:navBarView];
Rapide:
override func viewDidLoad() {
super.viewDidLoad()
// Additional bar button items
let button1 = UIBarButtonItem(image: UIImage(named: "image1.png"), style: .Plain, target: self, action: "methodA")
let button2 = UIBarButtonItem(image: UIImage(named: "image2.png"), style: .Plain, target: self, action: "methodB")
let button3 = UIBarButtonItem(image: UIImage(named: "image3.png"), style: .Plain, target: self, action: "methodC")
navigationItem.leftItemsSupplementBackButton = true
navigationItem.setLeftBarButtonItem(button1, animated: true)
navigationItem.setRightBarButtonItems([button2, button3], animated: true)
Méthodes pour les boutons:
func methodA() {
performSegueWithIdentifier("segA", sender: nil)
}
func methodB() {
performSegueWithIdentifier("segB", sender: nil)
}
func methodC() {
performSegueWithIdentifier("segC", sender: nil)
}
Tu peux faire vite comme ça
var editImg : UIImage = UIImage(named: "plus")!
var searchImg : UIImage = UIImage(named: "search")!
var editBtn : UIBarButtonItem = UIBarButtonItem(image: editImg, style: UIBarButtonItemStyle.Plain, target: self, action: Selector("editBtnPressed:"))
var searchBtn : UIBarButtonItem = UIBarButtonItem(image: searchImg, style: UIBarButtonItemStyle.Plain, target: self, action: Selector ("searchBtnPressed:"))
var buttons : NSArray = [editBtn, searchBtn]
self.navigationItem.rightBarButtonItems = buttons
func editBtnPressed(sender: AnyObject){
}
func searchBtnPressed(sender: AnyObject){
}
Vous pouvez créer une vue UIV et ajouter deux boutons dans cette vue. Et ajoutez cet UIView comme bouton droit :)
UIView* rightItem = [UIView alloc] initWithFrame:frame];
//Create UIButton1 b1
//Create UIButton2 b2
[rightItem addSubview:b1];
[rightItem addSubview:b2];
self.navigationItem.rightBarButtonItem = rightItem;
self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView: rightItem];
( Exemple de code de travail complet ci-dessous [par moi])
La réponse Prakash fonctionne également dans le constructeur d'interface.
Faites glisser un UIView
dans le UINavigationItem
, puis vous pouvez en mettre plusieurs UIButton
comme enfants de ceci UIView
et créer une hiérarchie comme ceci:
Définissez la couleur d'arrière-plan du UIView
pour effacer et ajoutez des contraintes pour centrer verticalement les boutons et fixer la position horizontale. Voici le résultat que j'ai obtenu avec zéro ligne de code:
Dans SWIFT, vous pouvez ajouter ce code pour configurer deux boutons sur le côté droit (ou gauche):
self.navigationItem.rightBarButtonItems = [UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.Action, target: self, action: "barButtonItemClicked"), UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.Search, target: self, action: "barButtonItemClicked")]
À partir d'iOS 5, c'est facile à réaliser. UINavigationItem a la capacité d'avoir plusieurs boutons à gauche et à droite de la barre.
Voici le code Swift 4:
let editImage = UIImage(named: "plus")!
let searchImage = UIImage(named: "search")!
let editButton = UIBarButtonItem(image: editImage, style: .plain, target: self, action:#selector(didTapEditButton))
let searchButton = UIBarButtonItem(image: searchImage, style: .plain, target: self, action:#selector(didTapSearchButton))
navigationItem.rightBarButtonItems = [editButton, searchButton]
@objc func didTapEditButton(sender: AnyObject){
}
@objc func didTapSearchButton(sender: AnyObject){
}
Vous n'avez pas besoin d'ajouter deux boutons. Vous avez juste besoin d'ajouter
UIBarButtonSystemItemFlexibleSpace
ne pas
UIBarButtonSystemItemFixedSpace
et un bouton, de sorte qu'il soit du côté droit.
Comme ça:
UIToolbar *toolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, 320, 40)];
toolbar.barStyle = UIBarStyleBlackTranslucent;
UIBarButtonItem *spaceButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];
UIBarButtonItem *infoButtonItem1 = [[UIBarButtonItem alloc] initWithTitle:@"Done" style:UIBarButtonItemStyleDone target:self action:@selector(empresaTextFieldDone)];
toolbar.items = [NSArray arrayWithObjects: spaceButton, infoButtonItem1, nil];
UIView* buttonsView= [[UIView alloc] initWithFrame:CGRectMake(10, 6, 84, 32)];
buttonsView.backgroundColor=[UIColor clearColor];
btn_back = [UIButton buttonWithType:UIButtonTypeCustom];
[btn_back addTarget:self action:@selector(backButtonClick)
forControlEvents:UIControlEventTouchUpInside];
btn_back.frame = CGRectMake(0, 0, 32, 32);
btn_back.backgroundColor=[UIColor colorWithPatternImage:[UIImage imageNamed:@"close.png"]];
btn_help = [UIButton buttonWithType:UIButtonTypeCustom];
[btn_help addTarget:self action:@selector(helpButtonClick)
forControlEvents:UIControlEventTouchUpInside];
btn_help.frame = CGRectMake(42, 0, 32, 32);
btn_help.backgroundColor=[UIColor colorWithPatternImage:[UIImage imageNamed:@"info.png"]];
[buttonsView addSubview:btn_back];
[buttonsView addSubview:btn_help];
segmentItem = [[UIBarButtonItem alloc] initWithCustomView:buttonsView];
self.navigationItem.rightBarButtonItem = segmentItem;
Au cas où quelqu'un viendrait ici, comme moi, à la recherche d'une réponse MonoTouch, ne cherchez pas plus loin que NavigationItem.RightBarButtonItems
array.
dans SWIFT:
(supposons que vous ayez un contrôleur de navigation) dans le contrôleur racine, utilisez ce code:
la gauche: ..
let leftBtn = UIBarButtonItem(title: "Do It", style: UIBarButtonItemStyle.Plain,
target: self, action: "doIt:")
leftBtn.tag=100
self.navigationItem.leftBarButtonItem = leftBtn
droite:
let rightView = UIView(frame: CGRectMake(0, 0, 100, 30))
rightView.backgroundColor = UIColor.redColor()
let btn1 = UIButton(frame: CGRectMake(0,0,60, 20))
btn1.setTitle("R1", forState: UIControlState.Normal)
btn1.tag=101
btn1.addTarget(self, action: "doIt:", forControlEvents: UIControlEvents.TouchUpInside)
rightView.addSubview(btn1)
let btn2 = UIButton(frame: CGRectMake(30,0,60, 20))
btn2.setTitle("R2", forState: UIControlState.Normal)
btn2.tag=102
btn2.addTarget(self, action: "doIt:", forControlEvents: UIControlEvents.TouchUpInside)
rightView.addSubview(btn2)
let rightBtn = UIBarButtonItem(customView: rightView)
self.navigationItem.rightBarButtonItem = rightBtn;
..
où:
func doIt(sender: AnyObject!){
let tag = sender.tag
}
func makeCustomNavigationBar () {
// Create the navigation bar
let navigationBar = UINavigationBar(frame: CGRectMake(0, 20, self.view.frame.size.width, 44)) // Offset by 20 pixels vertically to take the status bar into account
navigationBar.backgroundColor = UIColor.init(hexString: "E43037")
navigationBar.delegate = self;
navigationBar.setBackgroundImage(UIImage(), forBarMetrics: .Default)
navigationBar.shadowImage = UIImage()
navigationBar.translucent = true
// Create a navigation item with a title
let navigationItem = UINavigationItem()
navigationBar.tintColor = UIColor.whiteColor()
navigationItem.title = "Forgot Password"
navigationBar.titleTextAttributes = [NSForegroundColorAttributeName : UIColor.whiteColor()]
// Create left and right button for navigation item
let leftButton = UIBarButtonItem(title: "", style: UIBarButtonItemStyle.Plain, target: self, action: nil)
leftButton.action = "returnToLoginView"
let backbuttonImageView = UIImageView(frame: CGRectMake(0, 0, 30, 30))
backbuttonImageView.image = UIImage(named: "nav-arrow-left")
leftButton.image = backbuttonImageView.image
navigationItem.leftBarButtonItem = leftButton
let rightButton = UIBarButtonItem(title: "Right", style: UIBarButtonItemStyle.Plain, target: self, action: nil)
rightButton.action = "navigateToDashBoardView"
let rightButtonImageView = UIImageView(frame: CGRectMake(0, 0, 30, 30))
rightButtonImageView.image = UIImage(named: "nav-arrow-left")
rightButton.image = backbuttonImageView.image
navigationItem.rightBarButtonItem = rightButton
// Assign the navigation item to the navigation bar
navigationBar.items = [navigationItem]
// Make the navigation bar a subview of the current view controller
self.view.addSubview(navigationBar)
}