Menambahkan sebuah UILabel ke UIToolbar

97

Saya mencoba menambahkan label ke toolbar saya. Tombol berfungsi dengan baik, namun ketika saya menambahkan objek label, itu macet. Ada ide?

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

Jawaban:

128

Coba lihat ini

[[UIBarButtonItem alloc] initWithCustomView:yourCustomView];

Pada dasarnya setiap item harus berupa "tombol" tetapi dapat digunakan dengan tampilan apa pun yang Anda butuhkan. Berikut beberapa contoh kode. Perhatikan, karena tombol lain biasanya ada di toolbar, spacer ditempatkan di setiap sisi tombol judul sehingga tetap berada di tengah.

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];
Answererbot
sumber
10
Perhatikan bahwa jika Anda memilih untuk mengikuti rute ini, Anda harus memberi gaya label Anda dengan tepat (label.backgroundColor = [UIColor clearColor], dll). Anda juga dapat memulai UIBarButtonItem untuk diberi gaya Plain yang akan memberi Anda tampilan serupa
Wisequark
Saya tahu ini adalah posting yang sangat lama, tetapi saya memiliki pertanyaan tentang jawaban ini. Setelah ini selesai, apakah ada cara untuk mengakses titleLabel nanti untuk mengubahnya, atau tidak mungkin karena semuanya telah dirilis?
Ryan
Ryan, UILabel mungkin masih ada - itu self.titleLabel. Contoh ini membutuhkan properti yang dideklarasikan dan disintesis untuk UILabel * titleLabel, tetapi kode itu tidak ditampilkan. Jika Anda memiliki akses ke objek (mungkin UIViewController) yang menjalankan kode ini, Anda dapat mengakses titleLabel-nya. Misalnya, Anda dapat menambahkan metode pada pengontrol tampilan, meneruskan judul baru yang Anda inginkan, dan kemudian memanggil [self.titleLabel setText: newTitle].
Steve Liddle
7
Tidakkah Anda ingin spacer kedua ditambahkan setelah item bilah tombol judul?
len
121

Bagi mereka yang menggunakan Interface Builder untuk mengatur tata letak Anda UIToolBar, juga memungkinkan untuk melakukan ini hanya dengan menggunakan Interface Builder.

Untuk menambahkan a UILabelke UIToolBarAnda perlu menambahkan UIViewobjek generik ke UIToolBardalam IB Anda dengan menyeret UIViewobjek baru di atas Anda UIToolBar. IBsecara otomatis akan membuat UIBarButtonItemyang akan diinisialisasi dengan kustom Anda UIView. Selanjutnya, tambahkan a UILabelke UIViewdan edit secara UILabelgrafis agar sesuai dengan gaya pilihan Anda. Anda kemudian dapat secara visual mengatur spacer tetap dan / atau variabel sesuai keinginan untuk memposisikan Anda dengan UILabeltepat.

Anda juga harus mengatur latar belakang dari kedua UILabeldan UIViewuntuk clearColormendapatkan UIToolBaruntuk menunjukkan melalui dengan benar di bawah UILabel.

Matt R
sumber
2
Trik yang bagus, tidak tahu Anda bisa melakukannya di Interface Builder. Terima kasih banyak.
Rafael Bugajewski
Apakah ada cara untuk menambahkan UIButton dengan gambar kustom menggunakan metode itu? Saya dapat menambahkan UIButton, tetapi gambar tidak muncul.
nakal
4
Sepertinya aku tidak bisa membuat ini bekerja. Saat saya menyeret UIView ke bilah alat, UIView akan ditempatkan di dalam pengontrol tampilan, bukan di bilah alat. Juga, apakah kita melakukan ini di pengontrol navigasi atau di pengontrol tampilan?
guptron
1
Sepertinya itu tidak berhasil. Jika berhasil sekali waktu yang lalu, tidak lagi di XCode 6 ...
Frédéric Adda
1
Anda harus memperbarui jawaban Anda untuk menunjukkan bahwa ini hanya berfungsi dengan bilah alat yang ditambahkan ke pengontrol tampilan secara manual; itu tidak bekerja dengan toolbar yang ditambahkan untuk Anda.
James Bush
32

Saya menemukan jawaban answerBot sangat berguna, tetapi saya pikir saya menemukan cara yang lebih mudah, di Interface Builder:

  • buat UIBarButtonItem dan tambahkan ke Toolbar Anda di Interface Builder

masukkan deskripsi gambar di sini

  • Hapus centang "diaktifkan" untuk BarButtonItem ini

masukkan deskripsi gambar di sini

  • colokkan BarButtonItem ini ke properti di kelas Anda (ini di Swift, tapi akan sangat mirip di Obj-C):

    @IBOutlet private weak var lastUpdateButton: UIBarButtonItem! // Dummy barButtonItem whose customView is lastUpdateLabel
  • tambahkan properti lain untuk Label itu sendiri:

    private var lastUpdateLabel = UILabel(frame: CGRectZero)
  • di viewDidLoad, tambahkan kode berikut untuk menyetel properti label Anda, dan tambahkan sebagai customView dari BarButtonItem Anda

    // Dummy button containing the date of last update
    lastUpdateLabel.sizeToFit()
    lastUpdateLabel.backgroundColor = UIColor.clearColor()
    lastUpdateLabel.textAlignment = .Center
    lastUpdateButton.customView = lastUpdateLabel
  • Untuk memperbarui UILabelteks:

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

Hasil:

masukkan deskripsi gambar di sini

Anda harus menelepon lastUpdateLabel.sizetoFit()setiap kali Anda memperbarui teks label

Frederic Adda
sumber
1
Saya membuat UIBarButtonItem sama seperti Anda, membiarkannya aktif, dan melapiskan label menggunakan kode berikut: UILabel* label = [[UILabel alloc] init]; label.text = @"Hello"; label.font = [UIFont systemFontOfSize:16]; [label sizeToFit]; self.barItem.customView = label;
Brett Donald
6

Salah satu hal yang saya gunakan untuk trik ini adalah untuk membuat contoh UIActivityIndicatorViewdi atas UIToolBar, sesuatu yang sebaliknya tidak mungkin dilakukan. Misalnya di sini saya memiliki a UIToolBardengan 2 UIBarButtonItem, a FlexibleSpaceBarButtonItem, dan kemudian yang lainnya UIBarButtonItem. Saya ingin memasukkan a UIActivityIndicatorViewke UIToolBarantara ruang fleksibel dan tombol (kanan) terakhir. Jadi dalam diri saya, RootViewControllersaya melakukan hal berikut,

- (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];}
Alasdair Allan
sumber
Kode ini membocorkan memori yang dialokasikan untuk UIBarButtonItem dengan tampilan indikator aktivitas kustom. (Ini juga membocorkan memori indikator aktivitas, tapi saya berasumsi bahwa itu dirilis di bawah akhir fragmen kode.
erikprice
3

Detail

  • Xcode 10.2.1 (10E1001), Swift 5

Sampel lengkap

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

Hasil

masukkan deskripsi gambar di sini

Vasily Bodnarchuk
sumber
Saya suka ini, tetapi bagaimana jika saya memiliki TableView maka itu akan bergulir dengan bilah ini. Bagaimana cara memperbaikinya?
Maksim Kniazev
Halo Maxim, saya tidak mengerti masalah Anda. Tolong, jelaskan hasil yang ingin Anda dapatkan.
Vasily Bodnarchuk
Ok, saya menggunakan UITableViewController dan jika saya menyetel view.addSubview (toolBar!) Dan menggulir tampilan tabel saya, bilah akan menggulir dengan tableView, saya ingin posisi bawah tetap
Maksim Kniazev
Saya pikir, Anda harus menggunakan UIViewController dengan UITableView (bukan UITableViewController) sebagai subview.
Vasily Bodnarchuk
Oke spasibo. Saya akan mencobanya
Maksim Kniazev
2

Mirip dengan Matt RI menggunakan pembuat antarmuka. Tetapi saya ingin memiliki 1 UIWebViewdi dalamnya sehingga saya dapat memiliki beberapa teks yang dicetak tebal dan teks lainnya tidak (seperti aplikasi email). Begitu

  1. Tambahkan tampilan web sebagai gantinya.
  2. Hapus centang buram
  3. Pastikan latar belakang berwarna jelas
  4. Hubungkan semuanya dengan IBOutlet
  5. Gunakan di bawah ini htmluntuk memiliki latar belakang transparan sehingga bilah alat bersinar

Kode:

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];
Todd Horst
sumber
1

Jika Anda ingin menambahkan tampilan ke atas tampilan toolbar, Anda dapat mencoba ini:

[self.navigationController.tabBarController.view addSubview:yourView];
mrhevor
sumber
1

Coba ini:

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

Catatan: self.barItemadalahUIBarButtonItem ditambahkan dari perpustakaan objek dan ditempatkan di antara dua ruang yang fleksibel.

Cara lain adalah dengan menghapus [self.barItem setCustom:view]garis dan mengubah parameter label(lebar) sehingga memenuhi seluruh toolbar dan mengatur kesejajaran ke tengah dan font sendiri dalam kode,

pengguna1938695
sumber