Выравнивание элементов UIToolBar


112

Я UIBarButtonItemсоздал три, как показано ниже. Они выровнены по левому краю, и я хотел бы выровнять по центру, чтобы не было зазора с правой стороны. Я не вижу свойства align UIToolBar. Есть ли другой способ добиться этого?

//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];

Ответы:


259

Добавьте два элемента UIBarButtonSystemItemF flexibleSpace на панель инструментов слева и справа от элементов.

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

Добавление их, как и любых других элементов панели инструментов, равномерно распределит пространство между ними.


25
Нет никакой реальной причины делать несколько гибких пространств. Вы можете добавить один и тот же множественный гибкий космический объект на панель инструментов несколько раз, если вам нужно больше одного.
mmc

mmc правильный. Фактически, было бы вполне разумно сделать singleton flexibleSpace и повторно использовать его во всем вашем продукте. Я слышал, как утверждается, что это было истинное первоначальное использование синглтонов: не для обеспечения соблюдения правил программы, а для уменьшения накладных расходов.
Amagrammer 01

2
Вы забыли обновить вызов релиза, следует прочитать [освобождение гибкого пространства];
Дэниел Хеппер,

Да, извините, он читал [релиз flexibleSpaceLeft] вместо [релиз flexibleSpace]. Исправлена
опечатка

30

Это также можно сделать прямо из раскадровки.

Просто перетащите элементы на панели инструментов и превратите некоторые из них в гибкое или фиксированное пространство, чтобы получить желаемый эффект. См. Два примера ниже.

Равномерно распределенный

По центру


8

В Xamarin iOS

Выровнено по правому краю:

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

По центру:

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

5
Это не в тему. Здесь мы говорим о чистой iOS.
jturolla

4
Именно на это нацелена MonoTouch.
Herman Schoenfeld

2
Объективный вопрос C, а не MonoTouch / C #
Макс МакЛауд

6
@MaxMacLeod: он не помечен как obj-c, он помечен как iPhone. Поэтому мой ответ верен. Также хорошо противопоставить C # и obj-c. Ясно, что C # современнее, тоньше, красивее, быстрее и лучше во всех отношениях.
Herman Schoenfeld

12
Хотя, возможно, было ясно, что код в вопросе был Objective-C, я нашел этот ответ полезным. Это тоже вопрос высокого ранга в Google.
jacob.toye

7

Быстрая версия:

    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]
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.