98

我正在尝试向我的工具栏添加标签。按钮效果很好,但是当我添加标签对象时,它会崩溃。有任何想法吗?

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

10 回答 10

129

看看这个

[[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];
于 2008-12-02T09:59:34.443 回答
121

对于那些使用 Interface Builder 来布局的人UIToolBar,也可以单独使用 Interface Builder 来做到这一点。

要将 a 添加UILabel到 aUIToolBar您需要通过将新UIView对象UIToolBar拖到. 将自动创建一个将使用您的自定义初始化的. 接下来添加一个并以图形方式编辑以匹配您的首选样式。然后,您可以根据需要直观地设置固定和/或可变垫片以适当定位。UIViewUIToolBarIBUIBarButtonItemUIViewUILabelUIViewUILabelUILabel

您还必须同时设置UILabelUIViewto的背景,clearColor才能UIToolBarUILabel.

于 2011-01-07T21:15:50.630 回答
33

我发现 answerBot 的回答非常有用,但我认为我在 Interface Builder 中找到了一种更简单的方法:

  • 创建一个 UIBarButtonItem 并将其添加到 Interface Builder 中的工具栏

在此处输入图像描述

  • 取消选中此 BarButtonItem 的“启用”

在此处输入图像描述

  • 将此 BarButtonItem 插入您的类中的属性(这是在 Swift 中,但在 Obj-C 中非常相似):

    @IBOutlet private weak var lastUpdateButton: UIBarButtonItem! // Dummy barButtonItem whose customView is lastUpdateLabel
    
  • 为标签本身添加另一个属性:

    private var lastUpdateLabel = UILabel(frame: CGRectZero)
    
  • 在viewDidLoad中,添加如下代码来设置你的label的属性,并将其添加为你的BarButtonItem的customView

    // 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() 
    

结果 :

在此处输入图像描述

lastUpdateLabel.sizetoFit()每次更新标签文本时都必须调用

于 2014-09-12T13:01:33.487 回答
6

我使用这个技巧的一件事是UIActivityIndicatorView在 之上实例化 a UIToolBar,否则这是不可能的。例如,在这里我有 aUIToolBar和 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];}
于 2009-02-07T02:36:09.200 回答
4

细节

  • Xcode 10.2.1 (10E1001)、斯威夫特 5

完整样本

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

结果

在此处输入图像描述

于 2016-11-28T22:20:13.427 回答
2

类似于 Matt RI 使用的界面构建器。但是我想在UIWebView里面放 1,这样我就可以将一些文本加粗,而其他文本则不加粗(比如邮件应用程序)。所以

  1. 改为添加 web 视图。
  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];
于 2012-10-11T15:51:10.117 回答
1

试试这个:

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.barItemUIBarButtonItem从对象库中添加并放置在两个灵活空间之间的。

另一种方法是删除[self.barItem setCustom:view]线并更改label(宽度)的参数,使其填充整个工具栏并在代码中自行设置对齐方式为中间和字体,

于 2013-03-08T16:46:17.497 回答
1

如果你想在工具栏视图上添加一个视图,你可以试试这个:

[self.navigationController.tabBarController.view addSubview:yourView];
于 2013-07-04T10:13:54.597 回答
0

可以使用禁用的 BarButtonItem

let resultsLabel = UIBarButtonItem(title: "number of results", style: .plain, target: self, action: nil)
resultsLabel.isEnabled = false
于 2020-12-11T01:45:07.817 回答
0

Swift 中的解决方案

您可以做到这一点的一种方法是创建 aUILabel然后将其作为自定义视图添加到 aUIBarButtonItem然后添加到工具栏。例如:

    class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        navigationController?.setToolbarHidden(false, animated: false)
        
        let textLabel = UILabel()
        textLabel.font = UIFont.systemFont(ofSize: 17)
        textLabel.text = "Text Label" // Change this to be any string you want
        let textButton = UIBarButtonItem(customView: textLabel)
        let spacer = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil)
        setToolbarItems([spacer, textButton, spacer], animated: false)
    }
    
}

注意:flexibleSpace' 将标签放置在工具栏的中心

这是一个屏幕截图: 示例截图

注意:如果没有标签栏,工具栏将占据屏幕底部。

于 2021-08-04T02:54:27.820 回答