Добавление UILabel в UIToolbar


Я пытаюсь добавить метку на панель инструментов. Кнопка отлично работает,однако, когда я добавляю объект label, он падает. Есть идеи?

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

8 ответов:

взгляните на это

[[UIBarButtonItem alloc] initWithCustomView:yourCustomView];

по существу, каждый элемент должен быть" кнопкой", но они могут быть созданы с любым представлением, которое вам требуется. Вот несколько примеров кода. Обратите внимание, поскольку другие кнопки обычно находятся на панели инструментов, распорки размещаются по обе стороны от кнопки заголовка, чтобы она оставалась центрированной.

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

для тех, кто использует Interface Builder для компоновки вашего UIToolBar, Это также можно сделать с помощью Interface Builder в одиночку.

добавить UILabel до UIToolBar вам нужно добавить универсальный UIView возражаю против вашего UIToolBar В IB путем перетаскивания нового

Я нашел ответ answerBot очень полезным, но я думаю, что нашел еще более простой способ, в Interface Builder:

  • создайте UIBarButtonItem и добавьте его на панель инструментов в интерфейсе Строитель

enter image description here

  • снимите флажок "включено" для этого BarButtonItem

enter image description here

  • подключите этот BarButtonItem к свойству в вашем классе (это в Быстро, но было бы очень похоже в Obj-C):

    @IBOutlet private weak var lastUpdateButton: UIBarButtonItem! // Dummy barButtonItem whose customView is lastUpdateLabel
    
  • добавить еще одно свойство для самой этикетке:

    private var lastUpdateLabel = UILabel(frame: CGRectZero)
    
  • в viewDidLoad добавьте следующий код для установки свойств вашего метка, и добавить его в качестве пользовательского представления Вашего BarButtonItem

    // Dummy button containing the date of last update
    lastUpdateLabel.sizeToFit()
    lastUpdateLabel.backgroundColor = UIColor.clearColor()
    lastUpdateLabel.textAlignment = .Center
    lastUpdateButton.customView = lastUpdateLabel
    
  • обновить UILabel текст:

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

результат :

enter image description here

нужно позвонить lastUpdateLabel.sizetoFit() каждый раз при обновлении метки текст

одна из вещей, которые я использую этот трюк для того, чтобы создать экземпляр UIActivityIndicatorView сверху UIToolBar, что-то, что иначе было бы невозможно. Например здесь у меня есть UIToolBar С 2 UIBarButtonItem, a FlexibleSpaceBarButtonItem, потом еще UIBarButtonItem. Я хочу вставить UIActivityIndicatorView на UIToolBar между гибким пространством и последней (Правой) Кнопкой. Так что в моем RootViewController Я делаю следующее,

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

аналогично Matt R я использовал interface builder. Но я хотел иметь 1 uiwebview внутри, чтобы у меня был какой-то текст, выделенный жирным шрифтом, а другой текст-нет (например, приложение mail). Так что

  1. вместо этого добавьте webview.
  2. снимите флажок непрозрачный
  3. убедитесь, что фон прозрачный цвет
  4. подключить все с iboutlet
  5. используйте ниже html, чтобы иметь прозрачный фон, так что панель инструментов светит через

код:

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

добавить UILabel в UIToolbar программно с помощью swift 3

полный пример

import UIKit

class ViewController: UIViewController {

    var toolBar: ToolBar!

    override func viewDidLoad() {
        super.viewDidLoad()

        toolBar = ToolBar(bottomBarWithHeight: 44, target: self)
        view.addSubview(toolBar!)

        toolBar.appendButton(buttonItem: toolBar.buttonItem(systemItem: .add, selector: #selector(ViewController.action)))
        toolBar.appendButton(buttonItem: toolBar.buttonItem(systemItem: .camera, selector: #selector(ViewController.action)))
        toolBar.appendButton(buttonItem: toolBar.flexibleSpace)
        toolBar.appendButton(buttonItem: toolBar.titleItem(text: "\(NSDate())", font: UIFont.systemFont(ofSize: 12), color: UIColor.lightGray))
        toolBar.appendButton(buttonItem: toolBar.flexibleSpace)
        toolBar.appendButton(buttonItem: toolBar.buttonItem(systemItem: .cancel, selector: #selector(ViewController.action)))
    }

    func action() {
        print("action")
    }

}

class ToolBarTitleItem: UIBarButtonItem {

    var label: UILabel

    init(text: String, font: UIFont, color: UIColor) {

        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) {
        fatalError("init(coder:) has not been implemented")
    }
}

class ToolBar: UIToolbar {

    let target: Any?

    init(bottomBarWithHeight: CGFloat, target: Any?) {
        self.target = target

        var bounds =  UIScreen.main.bounds
        bounds.origin.y = bounds.height - bottomBarWithHeight
        bounds.size.height = bottomBarWithHeight

        super.init(frame: bounds)
    }

    init(frame: CGRect, target: Any?) {
        self.target = target
        super.init(frame: frame)
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    func buttonItem(systemItem: UIBarButtonSystemItem, selector: Selector?) -> UIBarButtonItem {
        return UIBarButtonItem(barButtonSystemItem: systemItem, target: target, action: selector)
    }

    var flexibleSpace: UIBarButtonItem {
        return buttonItem(systemItem: UIBarButtonSystemItem.flexibleSpace, selector:nil)
    }

    func titleItem (text: String, font: UIFont, color: UIColor) -> UIBarButtonItem {
        return ToolBarTitleItem(text: text, font: font, color: color)
    }

    func appendButton(buttonItem: UIBarButtonItem) {
        if items == nil {
            items = [UIBarButtonItem]()
        }

        items!.append(buttonItem)
    }
}

результат

enter image description here

Если вы хотите добавить вид вид панели инструментов, вы можете попробовать это:

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

попробуйте это:

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

Примечание: self.barItem это UIBarButtonItem добавлено из библиотеки объектов и помещено между двумя гибкими пространствами.

другой способ-удалить [self.barItem setCustom:view] линия и изменить параметры label (ширина), чтобы он заполнял всю панель инструментов и устанавливал выравнивание на середину и шрифт самостоятельно в коде,