Bir UIToolbar'a bir UILabel eklemek


97

Araç çubuğuma bir etiket eklemeye çalışıyorum. Button harika çalışıyor, ancak etiket nesnesini eklediğimde çöküyor. Herhangi bir fikir?

UIBarButtonItem *setDateRangeButton = [[UIBarButtonItem alloc] initWithTitle:@"Set date range"
                                                                       style:UIBarButtonItemStyleBordered
                                                                      target:self
                                                                      action:@selector(setDateRangeClicked:)];

UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(5, 5, 20, 20)];
label.text = @"test";

[toolbar setItems:[NSArray arrayWithObjects:setDateRangeButton,label, nil]];

// Add the toolbar as a subview to the navigation controller.
[self.navigationController.view addSubview:toolbar];

// Reload the table view
[self.tableView reloadData];

Yanıtlar:


128

Şuna bir bak

[[UIBarButtonItem alloc] initWithCustomView:yourCustomView];

Esasen her öğe bir "düğme" olmalıdır, ancak istediğiniz herhangi bir görünümle somutlaştırılabilirler. İşte bazı örnek kod. Diğer düğmeler tipik olarak araç çubuğunda olduğundan, başlık düğmesinin her iki tarafına da ortalanmış olarak kalması için boşluk bırakıcılar yerleştirilir.

NSMutableArray *items = [[self.toolbar items] mutableCopy];

UIBarButtonItem *spacer = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];
[items addObject:spacer];
[spacer release];

self.titleLabel = [[UILabel alloc] initWithFrame:CGRectMake(0.0 , 11.0f, self.view.frame.size.width, 21.0f)];
[self.titleLabel setFont:[UIFont fontWithName:@"Helvetica-Bold" size:18]];
[self.titleLabel setBackgroundColor:[UIColor clearColor]];
[self.titleLabel setTextColor:[UIColor colorWithRed:157.0/255.0 green:157.0/255.0 blue:157.0/255.0 alpha:1.0]];
[self.titleLabel setText:@"Title"];
[self.titleLabel setTextAlignment:NSTextAlignmentCenter];

UIBarButtonItem *spacer2 = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];
[items addObject:spacer2];
[spacer2 release];

UIBarButtonItem *title = [[UIBarButtonItem alloc] initWithCustomView:self.titleLabel];
[items addObject:title];
[title release];

[self.toolbar setItems:items animated:YES];
[items release];

10
Bu rotaya gitmeyi seçerseniz, etiketinize uygun şekilde stil vermeniz gerektiğini unutmayın (label.backgroundColor = [UIColor clearColor], vb.). Ayrıca Düz stil verilecek bir UIBarButtonItem başlatabilir ve size benzer bir görünüm kazandırabilirsiniz
wisequark

Bunun gerçekten eski bir gönderi olduğunu biliyorum ama bu cevapla ilgili bir sorum var. Bu yapıldıktan sonra, daha sonra değiştirmek için titleLabel'e erişmenin bir yolu var mı, yoksa her şey piyasaya sürüldüğünden beri imkansız mı?
Ryan

Ryan, UILabel muhtemelen hala var - bu self.titleLabel. Bu örnek, UILabel * titleLabel için bildirilmiş ve sentezlenmiş bir özelliğe ihtiyaç duyar, ancak bu kod gösterilmemiştir. Bu kodu çalıştıran nesneye (muhtemelen bir UIViewController) erişiminiz varsa, titleLabel'e erişebilirsiniz. Örneğin, görünüm denetleyicisine bir yöntem ekleyebilir, istediğiniz yeni başlığı iletebilir ve ardından [self.titleLabel setText: newTitle] 'ı çağırabilirsiniz.
Steve Liddle

7
Başlık düğmesi çubuğu öğesinden sonra ikinci boşluk bırakıcının eklenmesini istemez misiniz?
len

121

Arayüz Oluşturucu'yu kullananlar için UIToolBar , bunu sadece Arayüz Oluşturucuyu kullanarak yapmak da mümkündür.

Bir eklemek için UILabelbir karşı UIToolBarbir jenerik eklemek gerekir UIViewadresinden Müşteri nesne UIToolBaryeni sürükleyerek IB UIViewsenin üzerinde nesneyi UIToolBar. IBotomatik olarak UIBarButtonItemsizin özeliniz ile başlatılacak bir oluşturacaktır UIView. Sonraki bir ekleme UILabeliçin UIViewve düzenlemek UILabelgrafiksel tercih tarzına uyması için. Ardından, UILabeluygun şekilde konumlandırmak için sabit ve / veya değişken ara parçalarınızı görsel olarak istediğiniz gibi ayarlayabilirsiniz .

Ayrıca hem arka planını ayarlamak gerekir UILabelve UIViewiçin clearColoralmak için UIToolBardoğru altında aracılığıyla göstermek için UILabel.


2
Güzel numara, bunu Interface Builder'da yapabileceğinizi bilmiyordum. Çok teşekkür ederim.
Rafael Bugajewski

Bu yöntemi kullanarak özel görüntüye sahip bir UIButton eklemenin bir yolu var mı? Bir UIB düğmesi ekleyebilirim, ancak resim görünmüyor.
cannyboy

4
Bunu çalıştıracak gibi görünmüyorum. Bir UIView'ı araç çubuğuna sürüklediğimde, araç çubuğuna değil, görünüm denetleyicisinin içine yerleştiriliyor. Ayrıca, bunu gezinme denetleyicisinde mi yoksa görünüm denetleyicisinde mi yapıyoruz?
guptron

1
Bu işe yaramıyor gibi görünüyor. Uzun zaman önce bir kez çalıştıysa, artık XCode 6'da değil ...
Frédéric Adda

1
Cevabınızı, bunun yalnızca bir görünüm denetleyicisine manuel olarak eklenen araç çubuklarıyla çalıştığını belirtmek için güncellemelisiniz; sizin için eklenen araç çubuğu ile çalışmaz.
James Bush

32

AnswerBot'un cevabını çok yararlı buldum, ancak Arayüz Oluşturucu'da daha da kolay bir yol bulduğumu düşünüyorum:

  • bir UIBarButtonItem oluşturun ve Arayüz Oluşturucu'daki Araç Çubuğunuza ekleyin

görüntü açıklamasını buraya girin

  • Bu BarButtonItem için "etkin" seçeneğinin işaretini kaldırın

görüntü açıklamasını buraya girin

  • bu BarButtonItem'i sınıfınızdaki bir özelliğe takın (bu Swift'dedir, ancak Obj-C'de çok benzer olacaktır):

    @IBOutlet private weak var lastUpdateButton: UIBarButtonItem! // Dummy barButtonItem whose customView is lastUpdateLabel
  • Etiketin kendisi için başka bir özellik ekleyin:

    private var lastUpdateLabel = UILabel(frame: CGRectZero)
  • viewDidLoad'da, etiketinizin özelliklerini ayarlamak için aşağıdaki kodu ekleyin ve bunu BarButtonItem'inizin customView olarak ekleyin

    // Dummy button containing the date of last update
    lastUpdateLabel.sizeToFit()
    lastUpdateLabel.backgroundColor = UIColor.clearColor()
    lastUpdateLabel.textAlignment = .Center
    lastUpdateButton.customView = lastUpdateLabel
  • UILabelMetni güncellemek için :

    lastUpdateLabel.text = "Updated: 9/12/14, 2:53"
    lastUpdateLabel.sizeToFit() 

Sonuç:

görüntü açıklamasını buraya girin

lastUpdateLabel.sizetoFit()Etiket metnini her güncellediğinizde aramanız gerekir


1
Sizinle aynı bir UIBarButtonItem oluşturdum, etkinleştirdim ve aşağıdaki kodu kullanarak bir etiketi üst üste ekledim: UILabel* label = [[UILabel alloc] init]; label.text = @"Hello"; label.font = [UIFont systemFontOfSize:16]; [label sizeToFit]; self.barItem.customView = label;
Brett Donald

6

Bu numarayı kullandığım şeylerden biri, başka türlü mümkün olmayacak bir şeyin UIActivityIndicatorViewüstüne bir örnek oluşturmaktır UIToolBar. Örneğin burada UIToolBar2 UIBarButtonItem, a FlexibleSpaceBarButtonItemve sonra başka bir ile bir var UIBarButtonItem. Ben eklemek istediğiniz UIActivityIndicatorViewiçine UIToolBaresnek boşluk ve nihai (sağ) düğmesi arasında. Yani RootViewControllerbende aşağıdakileri yapıyorum,

- (void)viewDidLoad {
[super viewDidLoad];// Add an invisible UIActivityViewIndicator to the toolbar
UIToolbar *toolbar = (UIToolbar *)[self.view viewWithTag:767];
NSArray *items = [toolbar items];

activityIndicator = [[UIActivityIndicatorView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 20.0f, 20.0f)];
[activityIndicator setActivityIndicatorViewStyle:UIActivityIndicatorViewStyleWhite];    

NSArray *newItems = [NSArray arrayWithObjects:[items objectAtIndex:0],[items objectAtIndex:1],[items objectAtIndex:2],
                     [[UIBarButtonItem alloc] initWithCustomView:activityIndicator], [items objectAtIndex:3],nil];
[toolbar setItems:newItems];}

Bu kod, özel etkinlik göstergesi görünümüyle UIBarButtonItem için ayrılan belleği sızdırıyor. (Etkinlik göstergesinin hafızasını da sızdırıyor, ancak bunun kod parçasının sonunun altında yayınlandığını varsayıyorum.
erikprice

3

Detaylar

  • Xcode 10.2.1 (10E1001), Swift 5

Tam örnek

import UIKit

class ViewController: UIViewController {

    private weak var toolBar: UIToolbar?

    override func viewDidLoad() {
        super.viewDidLoad()

        var bounds =  UIScreen.main.bounds
        let bottomBarWithHeight = CGFloat(44)
        bounds.origin.y = bounds.height - bottomBarWithHeight
        bounds.size.height = bottomBarWithHeight
        let toolBar = UIToolbar(frame: bounds)
        view.addSubview(toolBar)

        var buttons = [UIBarButtonItem]()
        buttons.append(UIBarButtonItem(barButtonSystemItem: .add, target: self, action: #selector(ViewController.action)))
        buttons.append(UIBarButtonItem(barButtonSystemItem: .camera, target: self, action: #selector(ViewController.action)))
        buttons.append(UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil))
        buttons.append(UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil))
        buttons.append(ToolBarTitleItem(text: "\(NSDate())", font: .systemFont(ofSize: 12), color: .lightGray))
        buttons.append(UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil))
        buttons.append(UIBarButtonItem(barButtonSystemItem: .cancel, target: self, action:  #selector(ViewController.action)))
        toolBar.items = buttons

        self.toolBar = toolBar
    }
    @objc func action() { print("action") }
}

class ToolBarTitleItem: UIBarButtonItem {

    init(text: String, font: UIFont, color: UIColor) {
        let label =  UILabel(frame: UIScreen.main.bounds)
        label.text = text
        label.sizeToFit()
        label.font = font
        label.textColor = color
        label.textAlignment = .center
        super.init()
        customView = label
    }
    required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) }
}

Sonuç

görüntü açıklamasını buraya girin


Bunu beğendim, ama ya TableView varsa, o zaman bu çubukla kayacak. Bunu nasıl düzeltirim?
Maksim Kniazev

Merhaba Maxim, problemini anlayamıyorum. Lütfen almak istediğiniz sonucu tanımlayınız.
Vasily Bodnarchuk

Tamam, UITableViewController kullanıyorum ve view.addSubview (toolBar!) 'I ayarlarsam ve tablo görünümümü kaydırırsam, çubuk tableView ile kayar, sabit bir alt pozisyona sahip olmasını istiyorum
Maksim Kniazev

Bence, UIViewController'ı UITableView ile (UITableViewController yerine) alt görünüm olarak kullanmalısınız.
Vasily Bodnarchuk

Tamam spasibo. Bunu deneyeceğim
Maksim Kniazev

2

Matt RI'ye benzer şekilde arayüz oluşturucu kullanılır. Ama UIWebViewbunun yerine 1 tane olmasını istedim, böylece bazı metinleri kalınlaştırabilir ve diğer metinleri (posta uygulaması gibi) alabilirim. Yani

  1. Bunun yerine web görünümünü ekleyin.
  2. Opak'ın işaretini kaldırın
  3. Arka planın net renkte olduğundan emin olun
  4. Her şeyi bağla IBOutlet
  5. htmlAraç çubuğunun öne çıkması için şeffaf bir arka plana sahip olmak için aşağıdakileri kullanın

Kod:

NSString *path = [[NSBundle mainBundle] bundlePath];
NSURL *baseURL = [NSURL fileURLWithPath:path];
NSString *html = [NSString stringWithFormat:@"<html><head><style>body{font-size:11px;text-align:center;background-color:transparent;color:#fff;font-family:helvetica;vertical-align:middle;</style> </head><body><b>Updated</b> 10/11/12 <b>11:09</b> AM</body></html>"];
[myWebView loadHTMLString:html baseURL:baseURL];

1

Araç çubuğu görünümüne bir görünüm eklemek istiyorsanız, şunu deneyebilirsiniz:

[self.navigationController.tabBarController.view addSubview:yourView];

1

Bunu dene:

UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(140 , 0, 50, 250)];
[label setBackgroundColor:[UIColor clearColor]];
label.text = @"TEXT";
UIView *view = (UIView *) label;
[self.barItem setCustomView:view];

Not: self.barItembirUIBarButtonItem nesne kütüphanesinden ilave edildi ve iki esnek boşluk arasına yerleştirilir.

başka bir yol, [self.barItem setCustom:view]satırı kaldırmak ve label(genişlik) ' in parametrelerini değiştirerek tüm araç çubuğunu doldurmak ve hizalamayı ortaya ve yazı tipini kodda kendiniz ayarlamaktır.

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.