Hinzufügen einer UILabel zu einem UIToolbar
-
22-07-2019 - |
Frage
Ich versuche, ein Etikett zu meiner Symbolleiste hinzuzufügen. Taste funktioniert gut, aber wenn ich das Label-Objekt hinzufügen, es stürzt ab. Irgendwelche Ideen?
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];
Lösung
Haben Sie einen Blick in diesen
[[UIBarButtonItem alloc] initWithCustomView:yourCustomView];
Im Wesentlichen muss jeder Punkt ein „Knopf“ sein, aber sie können Sie benötigen mit einem beliebigen Ansicht instanziert werden. Hier ist ein Beispiel-Code. Beachten Sie, da andere Tasten der Regel auf der Symbolleiste sind, Abstandshalter auf jeder Seite der Titeltaste platziert werden, so dass es zentriert bleibt.
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];
Andere Tipps
Für diejenigen, Interface Builder mit Ihrem UIToolBar
Layout, es ist auch möglich, dies mit Interface Builder allein zu tun.
Um ein UILabel
zu einem UIToolBar
hinzufügen Sie benötigen ein allgemeines UIView
Objekt in den UIToolBar
in IB hinzufügen, indem Sie ein neues UIView
Objekt über Ihren UIToolBar
ziehen. IB
wird automatisch ein UIBarButtonItem
erstellen, die mit Ihrem eigenen UIView
initialisiert werden. Als nächstes fügen Sie eine UILabel
zum UIView
und bearbeiten Sie die UILabel
grafisch Ihre bevorzugten Stil anzupassen. Sie können dann visuell richten Sie Ihre festen und / oder variablen Abstandshalter wie gewünscht Ihre UILabel
entsprechend zu positionieren.
Sie müssen dann auch den Hintergrund sowohl der UILabel
und der UIView
clearColor
die UIToolBar
erhalten durch korrekt unter der UILabel
zu zeigen.
fand ich answerBot Antwort sehr nützlich, aber ich denke, dass ich eine noch einfachere Art und Weise zu finden, in Interface Builder:
- erstellen UIBarButtonItem und fügen Sie sie der Toolbar im Interface Builder
- Deaktivieren Sie die Option "aktiviert" für diese BarButtonItem
-
Dieses BarButtonItem auf eine Eigenschaft in der Klasse stecken (dies ist in Swift, würde aber in Obj-C sehr ähnlich sein):
@IBOutlet private weak var lastUpdateButton: UIBarButtonItem! // Dummy barButtonItem whose customView is lastUpdateLabel
-
fügen Sie eine weitere Eigenschaft für das Label selbst:
private var lastUpdateLabel = UILabel(frame: CGRectZero)
-
in viewDidLoad, fügen Sie den folgenden Code, um die Eigenschaften Ihres einstellen beschriften, und fügen Sie es als Custom Ihrer BarButtonItem
// Dummy button containing the date of last update lastUpdateLabel.sizeToFit() lastUpdateLabel.backgroundColor = UIColor.clearColor() lastUpdateLabel.textAlignment = .Center lastUpdateButton.customView = lastUpdateLabel
-
den
UILabel
Text zu aktualisieren:lastUpdateLabel.text = "Updated: 9/12/14, 2:53" lastUpdateLabel.sizeToFit()
Ergebnis:
Sie haben lastUpdateLabel.sizetoFit()
jedes Mal, rufen Sie den Beschriftungstext aktualisieren
Eines der Dinge, die ich diesen Trick bin mit für ist ein UIActivityIndicatorView
auf dem UIToolBar
zu instanziiert, etwas, das sonst nicht möglich wäre. Zum Beispiel hier habe ich eine UIToolBar
mit 2 UIBarButtonItem
, einem FlexibleSpaceBarButtonItem
und dann einem anderen UIBarButtonItem
. Ich möchte ein UIActivityIndicatorView
in die UIToolBar
zwischen dem flexiblen Raum einzufügen und die endgültige (rechte) Taste. Also in meinem RootViewController
ich die folgenden,
- (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];}
Ähnlich wie Matt R verwendet I Interface Builder. Aber ich wollte innen statt 1 UIWebView
haben, so dass ich einige Texte fett gedruckt und andere haben kann Text nicht (wie der Mail-App). So
- Fügen Sie die Webansicht statt.
- Deaktivieren Sie die Option undurchsichtig
- Stellen Sie sicher, Hintergrund ist klar Farbe
- alles Schalte mit
IBOutlet
- Verwenden Sie die unten
html
einen transparenten Hintergrund haben, so dass die Symbolleiste durchscheint
Code:
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];
Details
- Xcode 10.2.1 (10E1001), Swift 5
Voll Probe
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) }
}
Ergebnis
Wenn Sie die Symbolleiste Ansicht, die einen Blick bis zum Hinzufügen Sie diese ausprobieren können:
[self.navigationController.tabBarController.view addSubview:yourView];
Versuchen Sie folgendes:
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];
Hinweis: self.barItem
ist ein UIBarButtonItem
aus der Objektbibliothek hinzugefügt und zwischen zwei flexible Räumen
eine andere Art und Weise ist es, die [self.barItem setCustom:view]
Linie zu entfernen und die Parameter der label
(Breite) ändern, so dass sie die gesamte Werkzeugleiste füllt und stellen Sie die Ausrichtung auf mittlere und die Schrift selbst in Code,