我正在尝试在工具栏中添加标签。按钮效果很好,但是当我添加标签对象时,它会崩溃。有什么想法吗?
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];
答案 0 :(得分:127)
看看这个
[[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];
答案 1 :(得分:117)
对于使用Interface Builder来布局UIToolBar
的用户,也可以单独使用Interface Builder来完成此操作。
要向UILabel
添加UIToolBar
,您需要通过拖动新的UIView
对象向IB中的UIToolBar
添加通用UIView
对象你的UIToolBar
。 IB
会自动创建一个UIBarButtonItem
,并使用您的自定义UIView
进行初始化。接下来将UILabel
添加到UIView
并以图形方式编辑UILabel
以匹配您的首选样式。然后,您可以根据需要直观地设置固定和/或可变间隔符,以便恰当地定位UILabel
。
您还必须将UILabel
和UIView
的背景设置为clearColor
,以使UIToolBar
在UILabel
下正确显示。
答案 2 :(得分:29)
我发现answerBot的答案非常有用,但我认为我在Interface Builder中找到了一种更简单的方法:
将此BarButtonItem插入您的类中的属性(这是在 Swift,但在Obj-C中非常相似):
@IBOutlet private weak var lastUpdateButton: UIBarButtonItem! // Dummy barButtonItem whose customView is lastUpdateLabel
为Label本身添加另一个属性:
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()
答案 3 :(得分:6)
我正在使用这个技巧的一个方面是在UIActivityIndicatorView
之上实例化一个UIToolBar
,否则这是不可能的。例如,我有一个UIToolBar
,其中包含2个UIBarButtonItem
,一个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];}
答案 4 :(得分:2)
与Matt R类似,我使用了界面构建器。但我希望内部有一个UIWebView
,这样我就可以使用粗体文本和其他文本(如邮件应用程序)。所以
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];
答案 5 :(得分:2)
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) }
}
答案 6 :(得分: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.barItem
是从对象库添加的UIBarButtonItem
,位于两个灵活空间之间。
另一种方法是删除[self.barItem setCustom:view]
行并更改label
(宽度)的参数,使其填充整个工具栏,并在代码中自行将对齐设置为中间和字体,
答案 7 :(得分:1)
如果要在工具栏视图中添加视图,可以尝试以下操作:
[self.navigationController.tabBarController.view addSubview:yourView];
答案 8 :(得分:0)
可以使用禁用的BarButtonItem
let resultsLabel = UIBarButtonItem(title: "number of results", style: .plain, target: self, action: nil)
resultsLabel.isEnabled = false
答案 9 :(得分:0)
Swift 中的解决方案
您可以这样做的一种方法是创建一个 UILabel
,然后将其作为自定义视图添加到 UIBarButtonItem
,然后您将其添加到工具栏。
例如:
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
将标签定位在工具栏的中心
注意:如果没有标签栏,工具栏将占据屏幕底部。