2016-06-30 13 views
0

Ich habe ein UIBarButtonItem am unteren Rand meines Bildschirms, dass ich volle Breite haben möchte, so dass, wenn der Benutzer irgendwo in der Navigationsleiste tippt, die Schaltfläche ausgelöst wird.UIBarButtonItem - volle Breite ohne flexiblen Platz

Momentan muss der Benutzer mit flexiblem Abstand auf jeder Seite speziell auf die Schaltfläche "Set erstellen" in der Mitte klicken, damit die Schaltfläche ausgelöst wird.

enter image description here

Allerdings, wenn ich den flexiblen Raum zu entfernen, habe ich nicht eine einfache Art und Weise für den Text sehen zentriert und in voller Breite werden.

Wie kann ich ein UIBarButtonItem in voller Breite erstellen?

+0

Sie könnten dem flexiblen Bereich die gleiche Tipp-Aktion hinzufügen. Oder füllen Sie einfach die 'create set'-Zeichenfolge mit gleichen Führungs-/Trainingsbereichen. – thelaws

+0

@thelaws Hinzufügen der gesendeten Aktion zum flexiblen Raum ist eine großartige Idee! als ich es jedoch über das Storyboard implementiert habe, scheint es nicht zu funktionieren. – scientiffic

Antwort

0

, wenn Sie ein UIBarButtonItem mit einer Breite von (automatischer Breitenberechnung) zu einem UIToolBar in Storyboard hinzufügen, und Sie können aus es nach Ansicht des Rahmens gedruckt sehen, dass es origin.x Wert ist, ist 12,0. Wenn Sie die Breite auf etwas Bestimmtes ändern (anstelle der automatischen Breitenberechnung) und den Rahmen erneut prüfen, können Sie sehen, dass es sich um ursprung.x handelt. Der Wert ist 20,0.

Da Sie in Ihrem Fall die Breite manuell einstellen müssen, werden wir mit diesem Wert 20.0 arbeiten.

, wenn Sie zwei UIBarButtonItems zu einem UIToolBar in Storyboard hinzufügen, und ihre Ansichten Frames ausdrucken können Sie sehen, dass es einen Raum von 10,0 Punkte zwischen ihnen.

mit, dass die Werte im Auge Sie so etwas wie das folgende tun könnte:

override func viewDidAppear(animated: Bool) { 
    super.viewDidAppear(animated) 

    let item = UIBarButtonItem(title: "create set", style: .Plain, target: nil, action: nil) 
    setupToolbarWithItems([item], animated: true) 

    printToolbarFrames() 
} 

private func setupToolbarWithItems(items: [UIBarButtonItem], animated: Bool) { 
    guard let toolbar = navigationController?.toolbar else { 
     print("there is no toolbar") 
     return 
    } 

    if items.isEmpty { 
     setToolbarItems(nil, animated: animated) 
     return 
    } 

    // change item widths to specific size for correct calculation 
    for item in items { 
     item.width = 44 
    } 

    setToolbarItems(items, animated: animated) 

    // calculate margin and innerItemSpace 
    let firstView = items.first?.valueForKey("view") as! UIView 
    let margin = firstView.frame.origin.x 
    var innerItemSpace = CGFloat(0) 
    if items.count > 1 { 
     let secondView = items[1].valueForKey("view") as! UIView 
     innerItemSpace = secondView.frame.origin.x - (firstView.frame.origin.x + firstView.frame.size.width) 
    } 

    // calculate and set correct itemWidth for each item 
    let toolbarWidth = toolbar.frame.size.width 
    let availableToolbarSpace = toolbarWidth - 2 * margin - (CGFloat(items.count) - 1) * innerItemSpace 
    let itemWidth = floor(availableToolbarSpace/CGFloat(items.count)) 

    for item in items { 
     item.width = itemWidth 
    } 
} 

hoffe, es hilft :)

EDIT

hier ist eine weitere Hilfsfunktion aus dem jeweiligen drucken Symbolleistenrahmen nach der Verwendung der setupToolbarWithItems Methode:

private func printToolbarFrames() { 
    guard let toolbar = navigationController?.toolbar else { 
     print("there is no toolbar") 
     return 
    } 

    print("toolbar frame: \(toolbar.frame)") 
    guard let items = toolbar.items else { 
     print("there are no items on the toolbar") 
     return 
    } 

    for item in items { 
     let view = item.valueForKey("view") as! UIView 
     print("item: \(item.title!), frame: \(view.frame)") 
    } 
}