IB olmadan sağ taraftaki UINavigasyon çubuğuna 2 düğme nasıl eklenir?


86

UINavigationBarXIB olmadan 2 düğmeyi nasıl ekleyebilirim ?
2 düğme, sağ tarafına hizalanmalıdır UINavigationBar.

Nasıl bir düğme ekleyebileceğimi biliyorum, peki ya iki?

Yanıtlar:


142

İOS 5+ ile şu kadar kolay:

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

Sanırım iOS 5'te de mevcut.
iAmd

1
Güzel ve basit! Ayrıca var olan sağ düğmeyi de dahil ettim (IB'de ayarlanmış) UIBarButtonItem * btnCurrent = self.navigationItem.rightBarButtonItem;
Duncan

43

Ben kodu yayınlanmıştır NavigationBar sağına iki düğme eklemek için (aşağıya bakınız). barStyle = -1Alt sınıflandırma yerine ayarlayabilirsiniz 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];

Bu, farklı arka plan renkleriyle çalışmasını sağlayan ekstra araç çubuğu kurulumunu içeren bulduğum ilk gönderiydi, teşekkürler
Chris

Bu soru için doğru cevap bu .... Bu bağlantıdaki kod mükemmel çalışıyor ... seni harika adam ... şerefe ... :) Yukarıdaki tüm diğer cevaplar yanlış ve çalışmıyor
Sameera Chathuranga

NavigationController'ı UIPopoverController'ın contentViewController'ı olarak sunduğunuzda çözüm mükemmel çalışmıyor. UIToolbar'ı leftBarButtonItem'in özel bir görünümü olarak ayarladığınızda, ikinci düğmenin dokunma alanı yanlıştır (sola kaydırılmıştır, yani ikinci düğmenin sağ tarafı tıklanabilir değildir). RightBarButtonItem'e gelince, ikinci düğme yanlış çekiliyor (sadece sol tarafı çizilmiş) ... Bu durumda UINavigationBar yerine özel UIToolbar'ı başlık olarak kullanmaya devam etmem gerekeceğini düşünüyorum ...
manicaesar

1
Buradaki püf noktalarından biri tools.barStyle = -1çizgi: eğer UIBarStyleBlack'i yarı saydam = YES ile kullanırsanız bazı görsel eserler vardır. (Yani arka plan rengi gezinme çubuğunun rengiyle eşleşmiyor.) Bu belgelenmemiş bir özellik mi? Eğer öyleyse, bu kod biraz kırılgandır. Bunu belgelerin hiçbir yerinde görmedim.
ettore

28

Bir araç çubuğuyla başlatılan bir çubuk düğmesini özel bir görünüm olarak kullanabilirsiniz.

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

Bunun gibi bir şey verirdi:

alternatif metin

Not: Bu yanıt, iOS 6 veya sonraki sürümler için geçersizdir


3
@SameeraChathuranga hiçbir şey yapmadan bu kodu kopyalayıp yapıştıramazsınız. 'Self.editButtonItem' ve 'someOtherButton' öğelerinin önce bir yerde tanımlandığından emin olmalısınız ...
Nathan

Selam! Snippet için teşekkürler. Bunu kullanarak iki düğmeyi başarıyla ekledim ancak küçük bir sorun var. İşte nasıl göründüğü. Gördüğünüz gibi, araç çubuğunun etrafında hafif kare benzeri bir kenarlık görünüyor. Bunu nasıl kaldırabilirim ve yukarıdaki ekran görüntünüzde olduğu gibi sorunsuz hale getirebilirim? Teşekkürler. :)
Isuru

Tuhaf, "ekle" düğmesinin sınırını alamıyorum. Yalnızca simgesi olmayan UIBarButtonStyles kullanırsam bir kenarlık alırım.
pojo

23

İşte mevcut projemden çalışma örneği:

UINavigationbar rightBarButtonItem içine iki düğme

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

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

14

Swift:

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)

Düğmeler için yöntemler:

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

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

func methodC() {
    performSegueWithIdentifier("segC", sender: nil)
}

9

SWIFT

İçeri yapabilirsiniz swift böyle

        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){
        
        }

7

Bir UIVView oluşturabilir ve bu görünüme iki düğme ekleyebilirsiniz. Ve bu UIView'ı sağ düğme olarak ekleyin :)

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

self.navigationItem.rightBarButtonItem = rightItem;

@NathanReed, Olmalı self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView: rightItem];(Tam çalışma kodu örneği aşağıda [tarafımdan])
Adnan

7

Prakash yanıtı, arayüz oluşturucuda da çalışır.

Bir sürükleyin UIViewiçinde UINavigationItemo zaman birkaç koyabilirsiniz, UIButtonbu çocukları olarak UIViewve şöyle bir hiyerarşi oluşturun:

3 düğmeli hiyerarşiye sahip gezinti çubuğu

Arka plan rengini UIViewtemizlemek için ayarlayın ve düğmeleri dikey olarak ortalamak ve yatay konumu sabitlemek için bazı sınırlamalar ekleyin. İşte sıfır satır kodla aldığım sonuç:

Simülatördeki sonuç


1
Bu çalışıyor! Benim kadar kafası karışmış olanlar için, Bar Düğmesi Öğesini UIView ile değiştirmek yerine açıklandığı gibi UINavigationItem'e sürükledim. Bundan sonra, düğmeleri sahnenize sürükleyip kısıtlamalar eklemekle tamamen aynı olacaktır. Bu çözüm için tebrikler çünkü artık herhangi bir kod olmadan bunu yapabilir ve ayrıca sadece storyboard'daki düğmeleri sürükleyerek farklı sahnelere segment oluşturabilirim :) Teşekkürler!
Bruce

2
Buna hiç gerek yok. Sadece çubuk düğmesi öğelerini sağ çubuk düğmesine sürükleyebilirsiniz. Xcode 7.3.1
João Nunes

4

SWIFT'te, sağ (veya sol) tarafta iki düğme ayarlamak için bu kodu ekleyebilirsiniz:

self.navigationItem.rightBarButtonItems = [UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.Action, target: self, action: "barButtonItemClicked"), UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.Search, target: self, action: "barButtonItemClicked")]


3

İşte Swift 4 kodu:

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

  }

2

İki düğme eklemeniz gerekmez. Sadece eklemelisin

UIBarButtonSystemItemFlexibleSpace 

değil

UIBarButtonSystemItemFixedSpace

ve sağ tarafta olması için bir düğme.

Bunun gibi:

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

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;

1

Buraya benim gibi biri gelirse, bir MonoTouch cevabı ararsa, diziden başkasına bakmayın NavigationItem.RightBarButtonItems.


1

SWIFT'de:

(bir gezinti denetleyiciniz olduğunu varsayalım) Kök Denetleyicide şu kodu kullanın:

ayrıldı: ..

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

sağ:

    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;

..

nerede:

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

}

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)
    }
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.