it-swarm.com.de

Hinzufügen eines UILabels zu einer UIToolbar

Ich versuche, meiner Symbolleiste eine Beschriftung hinzuzufügen. Die Schaltfläche funktioniert gut, aber wenn ich das Beschriftungsobjekt hinzufüge, stürzt es 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];
95
user8359

Schauen Sie sich das an

[[UIBarButtonItem alloc] initWithCustomView:yourCustomView];

Grundsätzlich muss jedes Element eine "Schaltfläche" sein, sie kann jedoch mit jeder gewünschten Ansicht instanziiert werden. Hier ist ein Beispielcode. Da sich normalerweise andere Schaltflächen in der Symbolleiste befinden, werden Abstandshalter auf jeder Seite der Titelschaltfläche platziert, damit sie 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];
127
adam

Für Benutzer, die Interface Builder zum Layouten Ihrer UIToolBar verwenden, ist dies auch allein mit Interface Builder möglich.

Um ein UILabel zu einem UIToolBar hinzuzufügen, müssen Sie ein generisches UIView - Objekt zu Ihrem UIToolBar in IB hinzufügen, indem Sie ein neues UIView ziehen. Objekt über Ihrem UIToolBar. IB erstellt automatisch eine UIBarButtonItem, die mit Ihrer benutzerdefinierten UIView initialisiert wird. Fügen Sie als Nächstes ein UILabel zu UIView hinzu und bearbeiten Sie das UILabel grafisch, um es Ihrem bevorzugten Stil anzupassen. Sie können dann Ihre festen und/oder variablen Abstandshalter wie gewünscht visuell einrichten, um Ihre UILabel entsprechend zu positionieren.

Sie müssen auch den Hintergrund von UILabel und UIView auf clearColor einstellen, damit UIToolBar unter UILabel korrekt angezeigt wird. ].

119
Matt R

Ich fand die Antwort von answerBot sehr nützlich, aber ich glaube, ich habe im Interface Builder einen noch einfacheren Weg gefunden:

  • erstellen Sie ein UIBarButtonItem und fügen Sie es Ihrer Symbolleiste in Interface Builder hinzu

enter image description here

  • Deaktivieren Sie "enabled" für dieses BarButtonItem

enter image description here

  • stecken Sie dieses BarButtonItem in eine Eigenschaft in Ihrer Klasse (dies ist in Swift, wäre aber in Obj-C sehr ähnlich):

    @IBOutlet private weak var lastUpdateButton: UIBarButtonItem! // Dummy barButtonItem whose customView is lastUpdateLabel
    
  • fügen Sie eine weitere Eigenschaft für das Label selbst hinzu:

    private var lastUpdateLabel = UILabel(frame: CGRectZero)
    
  • fügen Sie in viewDidLoad den folgenden Code hinzu, um die Eigenschaften Ihres Etiketts festzulegen, und fügen Sie ihn als customView Ihres BarButtonItem hinzu

    // Dummy button containing the date of last update
    lastUpdateLabel.sizeToFit()
    lastUpdateLabel.backgroundColor = UIColor.clearColor()
    lastUpdateLabel.textAlignment = .Center
    lastUpdateButton.customView = lastUpdateLabel
    
  • So aktualisieren Sie den Text UILabel:

    lastUpdateLabel.text = "Updated: 9/12/14, 2:53"
    lastUpdateLabel.sizeToFit() 
    

Ergebnis:

enter image description here

Sie müssen lastUpdateLabel.sizetoFit() jedes Mal aufrufen, wenn Sie den Etikettentext aktualisieren

29
Frédéric Adda

Ich benutze diesen Trick unter anderem, um ein UIActivityIndicatorView über dem UIToolBar zu instanziieren, was sonst nicht möglich wäre. Zum Beispiel habe ich hier ein UIToolBar mit 2 UIBarButtonItem, einem FlexibleSpaceBarButtonItem und dann einem anderen UIBarButtonItem. Ich möchte ein UIActivityIndicatorView in das UIToolBar zwischen dem flexiblen Leerzeichen und der letzten (rechten) Schaltfläche einfügen. Also tue ich in meinem RootViewController Folgendes:

- (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];}
6
Alasdair Allan

Einzelheiten

  • Xcode 10.2.1 (10E1001), Swift 5

Vollständige 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

enter image description here

2

Ähnlich wie Matt R habe ich Interface Builder verwendet. Aber ich wollte stattdessen 1 UIWebView im Inneren haben, damit ich Text fett und anderen Text nicht (wie die Mail-App) haben kann. So

  1. Fügen Sie stattdessen die Webansicht hinzu.
  2. Deaktivieren Sie Opak
  3. Stellen Sie sicher, dass der Hintergrund eine klare Farbe hat
  4. Verbinde alles mit IBOutlet
  5. Verwenden Sie das unten stehende html, um einen transparenten Hintergrund zu erhalten, damit 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];
2
Todd Horst

Wenn Sie eine Ansicht in der Symbolleistenansicht hinzufügen möchten, können Sie dies versuchen:

[self.navigationController.tabBarController.view addSubview:yourView];
1

Versuche dies:

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, der aus der Objektbibliothek hinzugefügt und zwischen zwei flexiblen Räumen platziert wird.

eine andere Möglichkeit besteht darin, das [self.barItem setCustom:view] Zeile und ändern Sie die Parameter von label (width) so, dass sie die gesamte Symbolleiste ausfüllen und die Ausrichtung auf middle und die Schriftart selbst im Code festlegen.

1
user1938695