添加一个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中的UIToolBar
。 IB
将自动创build一个UIBarButtonItem
,它将用您的自定义UIView
进行初始化。 接下来,将UILabel
添加到UIView
并以graphics方式编辑UILabel
以匹配您的首选样式。 然后,您可以根据需要直观地设置固定和/或可变间隔器,以适当地定位UILabel
。
您还必须将UILabel
和UIView
的背景设置为clearColor
以使UIToolBar
在UILabel
下正确显示。
我发现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里面,所以我可以有一些文字粗体和其他文字没有(如邮件应用程序)。 所以
- 添加webview。
- 取消选中不透明
- 确保背景是清晰的颜色
- 用iboutlet钩住一切
- 使用下面的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方式设置为中间和字体,