Jak dodać 2 przyciski do paska nawigacji UIN po prawej stronie bez IB?

86

Jak mogę dodać 2 przyciski do UINavigationBarbez XIB?
2 przyciski powinny być wyrównane po prawej stronie UINavigationBar.

Wiem, jak mogę dodać jeden przycisk, ale co powiesz na dwa?

Aleksandra
źródło

Odpowiedzi:

142

Z iOS 5+ jest to tak proste, jak:

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]];
domsom
źródło
Myślę, że jest również dostępny w iOS 5.
iAmd,
1
Ładnie i prosto! Dołączyłem również istniejący prawy przycisk (ustawiony w IB) UIBarButtonItem * btnCurrent = self.navigationItem.rightBarButtonItem;
Duncan
43

I pisał kod (patrz poniżej), aby dodać dwa przyciski po prawej stronie navigationBar. Możesz ustawić barStyle = -1zamiast podklasy 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];
ma11hew28
źródło
to był pierwszy post, który znalazłem, który zawierał dodatkowy zestaw paska narzędzi, który sprawia, że ​​działa z różnymi kolorami tła, dzięki
Chris
To jest poprawna odpowiedź na to pytanie ... Kod w tym linku działa idealnie ... ty niesamowity człowieku ... okrzyki ... :) Wszystkie inne odpowiedzi w powyższym są błędne i nie działają
Sameera Chathuranga
Rozwiązanie nie działa idealnie, gdy przedstawiasz navigationController jako contentViewController UIPopoverController. Po ustawieniu UIToolbar jako niestandardowego widoku leftBarButtonItem obszar dotykowy drugiego przycisku jest nieprawidłowy (przesunięty w lewo, co oznacza, że ​​po prawej stronie drugiego przycisku nie można kliknąć). Jeśli chodzi o rightBarButtonItem, drugi przycisk jest źle rysowany (rysowana jest tylko jego lewa strona) ... W tym przypadku będę musiał trzymać się niestandardowego UIToolbar jako nagłówka zamiast UINavigationBar myślę ...
manicaesar
1
Jedną ze sztuczek jest tutaj tools.barStyle = -1linia: bez tego istnieją pewne wizualne artefakty, jeśli używasz UIBarStyleBlack z translucent = YES. (Mianowicie kolor tła nie pasuje do koloru paska nawigacji.) Czy to nieudokumentowana funkcja? Jeśli tak, ten kod jest kruchy. Nie widziałem tego nigdzie w dokumentach.
ettore
28

Możesz użyć przycisku paska zainicjowanego za pomocą paska narzędzi jako widoku niestandardowego.

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];

Dałby coś takiego:

tekst alternatywny

Uwaga: ta odpowiedź jest przestarzała w przypadku systemu iOS 6 lub nowszego

Nathan
źródło
3
@SameeraChathuranga nie możesz po prostu skopiować i wkleić tego kodu bez robienia czegokolwiek. Musisz upewnić się, że „self.editButtonItem” i „someOtherButton” są zdefiniowane jako pierwsze ...
Nathan,
Cześć! Dzięki za fragment. Korzystając z tego, pomyślnie dodałem dwa przyciski, ale jest mały problem. Oto jak to wygląda. Jak widać, wokół paska narzędzi widoczna jest niewielka kwadratowa ramka. Jak mogę to usunąć i sprawić, by było bezproblemowe, tak jak na powyższym zrzucie ekranu? Dzięki. :)
Isuru
Dziwne, nie widzę ramki na przycisku „dodaj”. Obramowanie pojawia się tylko wtedy, gdy używam UIBarButtonStyles, które nie mają ikony.
pojo
23

Oto działający przykład z mojego obecnego projektu:

dwa przyciski na UINavigationbar rightBarButtonItem

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];
Adnan
źródło
18
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];
Gurpreet Singh
źródło
14

Szybki:

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)

Metody dla przycisków:

func methodA() {
    performSegueWithIdentifier("segA", sender: nil)
}

func methodB() {
    performSegueWithIdentifier("segB", sender: nil)
}

func methodC() {
    performSegueWithIdentifier("segC", sender: nil)
}
LondonGuy
źródło
9

SZYBKI

Możesz to zrobić tak szybko

        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){
        
        }
Dharmbir Singh
źródło
7

Możesz utworzyć UIView i dodać dwa przyciski w tym widoku. I dodaj ten UIView jako prawy przycisk :)

UIView* rightItem = [UIView alloc] initWithFrame:frame];
//Create UIButton1 b1
//Create UIButton2 b2
[rightItem addSubview:b1];
[rightItem addSubview:b2];

self.navigationItem.rightBarButtonItem = rightItem;
prakash
źródło
@NathanReed, powinno być self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView: rightItem];(pełny działający kod poniżej [przeze mnie])
Adnan
7

Odpowiedź Prakash działa również w kreatorze interfejsów.

Przeciągnij a UIViewdo UINavigationItem, a następnie możesz umieścić kilka UIButtonjako potomków tego UIViewi utworzyć taką hierarchię:

Pasek nawigacji z 3 hierarchią przycisków

Ustaw kolor tła, UIViewaby wyczyścić i dodaj pewne ograniczenia, aby wyśrodkować przyciski w pionie i ustalić położenie w poziomie. Oto wynik, który otrzymałem z zerową linią kodu:

Wynik w symulatorze

Axel Guilmin
źródło
1
To działa! Dla tych, którzy są tak zdezorientowani jak ja, to, co zrobiłem, to zastąpienie elementu przycisku paska UIView, zamiast tego przeciągając go do UINavigationItem, jak opisano. Potem będzie to dokładnie to samo, co przeciąganie przycisków do sceny i dodawanie ograniczeń. Brawa za to rozwiązanie, ponieważ bez żadnego kodu mogę to teraz zrobić, a także stworzyć przejście do różnych scen, po prostu przeciągając przyciski w scenorysie :) Dzięki!
Bruce
2
To wcale nie jest potrzebne. Możesz po prostu przeciągnąć elementy przycisków paska do prawego przycisku paska. Xcode 7.3.1
João Nunes
4

W SWIFT możesz dodać ten kod, aby skonfigurować dwa przyciski po prawej (lub lewej) stronie:

self.navigationItem.rightBarButtonItems = [UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.Action, target: self, action: "barButtonItemClicked"), UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.Search, target: self, action: "barButtonItemClicked")]
Alberto Bailac Moreno
źródło
3

Oto kod 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){

  }
Mannam Brahmam
źródło
2

Nie musisz dodawać dwóch przycisków. Musisz tylko dodać

UIBarButtonSystemItemFlexibleSpace 

nie

UIBarButtonSystemItemFixedSpace

i guzik, żeby był po prawej stronie.

Lubię to:

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];   
bruno
źródło
2
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;
SURESH SANKE
źródło
1

Na wypadek, gdyby ktoś tu przyszedł, tak jak ja, szukając odpowiedzi MonoTouch, nie szukaj dalej niż NavigationItem.RightBarButtonItemsarray.

Dan Abramov
źródło
1

w SWIFT:

(załóżmy, że masz kontroler nawigacyjny) w głównym kontrolerze użyj tego kodu:

lewo: ..

    let leftBtn =  UIBarButtonItem(title: "Do It", style: UIBarButtonItemStyle.Plain,
        target: self, action: "doIt:")
    leftBtn.tag=100
    self.navigationItem.leftBarButtonItem = leftBtn

dobrze:

    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;

..

gdzie:

 func doIt(sender: AnyObject!){
    let tag = sender.tag

}
ing.conti
źródło
0
    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)
    }
AG
źródło