添加一个UILabel到UIToolbar

我试图给我的工具栏添加一个标签。 button效果很好,但是当我添加标签对象时,它会崩溃。 有任何想法吗?

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

看看这个

 [[UIBarButtonItem alloc] initWithCustomView:yourCustomView]; 

基本上每个项目必须是一个“button”,但他们可以实例化您所需要的任何视图。 这里是一些示例代码。 请注意,由于其他button通常位于工具栏上,所以标题button的每一侧都会放置一个间隔符,以保持居中。

 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您需要通过在您的UIToolBar上拖动一个新的UIView对象,将通用的UIView对象添加到IB中的UIToolBarIB将自动创build一个UIBarButtonItem ,它将用您的自定义UIView进行初始化。 接下来,将UILabel添加到UIView并以graphics方式编辑UILabel以匹配您的首选样式。 然后,您可以根据需要直观地设置固定和/或可变间隔器,以适当地定位UILabel

您还必须将UILabelUIView的背景设置为clearColor以使UIToolBarUILabel下正确显示。

我发现answerBot的答案非常有用,但是我想我在Interface Builder中发现了一个更简单的方法:

  • 创build一个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中,添加以下代码来设置标签的属性,并将其添加为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()

我使用这个技巧的一个事情是在UIToolBar上实例化一个UIActivityIndicatorView ,否则这是不可能的。 例如在这里我有一个UIToolBar与2 UIBarButtonItem ,一个FlexibleSpaceBarButtonItem ,然后另一个UIBarButtonItem 。 我想插入一个UIActivityIndicatorView到灵活的空间和最后(右手)button之间的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 RI使用的界面构build器。 但我想有一个uiwebview里面,所以我可以有一些文字粗体和其他文字没有(如邮件应用程序)。 所以

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

使用swift 3以编程方式将UILabel添加到UIToolbar

完整的例子

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

结果

在这里输入图像说明

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

 [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的参数(宽度),以便填充整个工具栏并将代码中的alignment方式设置为中间和字体,