Wyrównywanie elementów UIToolBar

112

Mam trzy UIBarButtonItemutworzone jak poniżej. Są wyrównane do lewej i chciałbym wyrównać do środka, aby nie było przerwy po prawej stronie. Nie widzę właściwości wyrównywania UIToolBar. Czy jest inny sposób na osiągnięcie tego?

//create some buttons
UIBarButtonItem *aboutButton = [[UIBarButtonItem alloc] initWithTitle:@"About" style:UIBarButtonItemStyleBordered target:self action:@selector(showAbout:)];
[toolbar setItems:[NSArray arrayWithObjects:settingsButton,deleteButton,aboutButton,nil]];
//Add the toolbar as a subview to the navigation controller.
[self.navigationController.view addSubview:toolbar];
4thSpace
źródło

Odpowiedzi:

259

Dodaj dwa elementy UIBarButtonSystemItemF flexibleSpace do paska narzędzi, po lewej i prawej stronie elementów

UIBarButtonItem *flexibleSpace = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];
[toolbar setItems:[NSArray arrayWithObjects:flexibleSpace, settingsButton,deleteButton,aboutButton, flexibleSpace, nil]];

Dodanie ich tak jak innych elementów paska narzędzi spowoduje równomierne rozłożenie przestrzeni między nimi.

nduplessis
źródło
25
Nie ma prawdziwego powodu, aby tworzyć wiele elastycznych przestrzeni. Jeśli potrzebujesz więcej niż jednego, możesz wielokrotnie dodać ten sam wielokrotny elastyczny obiekt do paska narzędzi.
mmc
mmc jest poprawne. W rzeczywistości prawdopodobnie byłoby całkowicie rozsądne, gdyby singleton był elastyczny i ponownie używał go w całym produkcie. Słyszałem, że twierdził, że to było prawdziwe oryginalne użycie singletonów: nie do egzekwowania reguł programu, ale do zmniejszenia narzutu.
Amagrammer
2
Zapomniałeś zaktualizować wywołanie wydania, przeczytaj [wydanie flexibleSpace];
Daniel Hepper,
Tak, przepraszam, odczytano [wydanie flexibleSpaceLeft] zamiast [wydanie flexibleSpace]. Naprawiono
literówkę
30

Można to również zrobić bezpośrednio z storyboardu.

Po prostu przeciągnij i upuść elementy na pasku narzędzi i zamień niektóre z nich w elastyczną lub stałą przestrzeń, aby uzyskać pożądany efekt. Zobacz dwa przykłady poniżej.

Równomiernie rozmieszczone

Wyśrodkowany

Arnaud
źródło
8

W Xamarin iOS

Wyrównanie do prawej:

yourBar.SetItems(new [] { new UIBarButtonItem(UIBarButtonSystemItem.FlexibleSpace), yourButton }, false);

Wyśrodkowany:

var flexibleSpace = new UIBarButtonItem(UIBarButtonSystemItem.FlexibleSpace);
yourBar.SetItems(new [] { flexibleSpace, yourButton, flexibleSpace}, false);
Herman Schoenfeld
źródło
5
To nie jest temat. Mowa tutaj o czystym iOS.
jturolla
4
I właśnie to jest celem MonoTouch.
Herman Schoenfeld
2
Cel C pytanie nie MonoTouch / C #
Max MacLeod
6
@MaxMacLeod: nie jest oznaczony jako obj-c, jest oznaczony jako iPhone. Dlatego moja odpowiedź jest ważna. Dobrze jest też porównać c # z obj-c. Oczywiście c # jest nowoczesny, smuklejszy, ładniejszy, szybszy i lepszy pod każdym względem.
Herman Schoenfeld
12
Chociaż mogło być jasne, że kod w pytaniu to Objective-C, ta odpowiedź okazała się pomocna. Jest to również ważne pytanie w Google.
jacob.toye
7

Wersja Swift:

    let toolbar = UIToolbar(frame: CGRectMake(0, 0, viewController.view.frame.size.width, 35.0))
    let flexibleSpace = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.FlexibleSpace, target: viewController, action: nil)
    let button1 = UIBarButtonItem(title: "A", style: UIBarButtonItemStyle.Plain, target: viewController, action: foo)
    let button2 = UIBarButtonItem(title: "B", style: UIBarButtonItemStyle.Plain, target: viewController, action: bar)
    let button3 = UIBarButtonItem(title: "C", style: UIBarButtonItemStyle.Plain, target: viewController, action: blah)
    toolbar.items = [button1, flexibleSpace, button2, flexibleSpace, button3]
rgamber
źródło