Как удалить пробелы в UIToolbar между пользовательскими представлениями? - PullRequest
12 голосов
/ 03 августа 2009

Я пытаюсь создать UIToolbar с 5 кнопками, используя пользовательские изображения. Я делаю это, создавая кнопки типа UIButtonTypeCustom, затем создавая UIBarButtonItems из них, затем добавляя их на панель инструментов с помощью setItems:animated:. Тем не менее, это добавляет пробелы между изображениями, которые приводят к тому, что 5-е изображение оказывается наполовину с правой стороны панели инструментов. Как мне избавиться от этих мест? Я перепробовал все, что мог придумать.

Помощь очень ценится.

Вот пример кода о том, как я об этом:

UIButton *button;
UIBarButtonItem *barButton1,*barButton2;

button = [UIButton buttonWithType:UIButtonTypeCustom];
[button setImage:[UIImage imageNamed:@"image1.png"] forState:UIControlStateNormal];
button.bounds = CGRectMake(0,0,button.imageView.image.size.width, button.imageView.image.size.height);
[button addTarget:self action:@selector(action:) forControlEvents:UIControlEventTouchUpInside];
barButton1 = [[UIBarButtonItem alloc] initWithCustomView:button];


button = [UIButton buttonWithType:UIButtonTypeCustom];
[button setImage:[UIImage imageNamed:@"bart_tb.png"] forState:UIControlStateNormal];
button.bounds = CGRectMake(0,0,button.imageView.image.size.width, button.imageView.image.size.height);
[button addTarget:self action:@selector(action:) forControlEvents:UIControlEventTouchUpInside];
barButton2 = [[UIBarButtonItem alloc] initWithCustomView:button];

NSArray *items = [NSArray arrayWithObjects: barButton1, barButton2, nil];
[self.toolbar setItems:items animated:NO];

Ответы [ 10 ]

17 голосов
/ 09 октября 2011

Если вы ищете, чтобы расположить UIBarButtonItems с меньшим, чем по умолчанию или даже 0 вертикальным интервалом (как я), это автоматически делается для вас, чтобы купить UIToolBar; Вот что я бы порекомендовал:

UIToolBar размещает свои предметы в частном порядке. Инженеры Apple никогда не ожидают, что разработчики перезапишут это. Использование фиксированных пробелов для перезаписи стандартного горизонтального расстояния 10Point недостаточно. Поскольку UIToolbar размещает свои элементы как минимум на 10 пунктов, вы устанавливаете ширину этих UIBarButtonItems равной -10, чтобы не было пробелов, как показано в следующем коде:

CGFloat toolbarHeight = 44.0;
CGRect toolbarFrame = CGRectMake(0,0, self.view.bounds.size.width, toolbarHeight);
UIToolbar *toolbar = [[UIToolbar alloc] initWithFrame:toolbarFrame];

UIBarButtonItem* noSpace = [[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace target:nil action:nil] autorelease];
UIBarButtonItem* noSpace1 = [[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace target:nil action:nil] autorelease];

noSpace.width = -10.0;
noSpace1.width = -10.0;

[toolbar setItems:[NSArray arrayWithObjects:
                   [[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:nil action:nil] autorelease],
                   noSpace,
                   [[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemTrash target:nil action:nil] autorelease],
                   noSpace1,
                   [[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCompose target:nil action:nil] autorelease]
                   , nil]];
5 голосов
/ 25 ноября 2009

Если вы добавляете проставки между каждым элементом, интервал должен работать сам. В вашем случае вы можете поставить проставку с обеих сторон от двух кнопок и одну между ними. Вы можете сделать это так:

UIBarButtonItem *spacer = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];

NSArray *items = [[NSArray alloc] initWithObjects: spacer, barButton1, spacer, barButton2, spacer, nil];

[spacer release];

Обратите внимание, что вы также можете использовать UIBarButtonSystemItemFixedSpace, но вам необходимо явно указать его свойство 'width'. В то время как UIBarButtonSystemItemF FlexibleSpace решает эту проблему за вас, кажется,

2 голосов
/ 02 февраля 2012

Между двумя кнопками панели вы можете взять UIBarButtonSystemItemFixedSpace. И отрегулируйте ширину. Это сработало для меня.

2 голосов
/ 22 июня 2011

Можно добавить элемент фиксированного пространства с отрицательной шириной между элементами, чтобы компенсировать расстояние.

UIBarButtonItem *fixedSpace = [[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace target:nil action:nil] autorelease];
fixedSpace.width = -12.0f;
2 голосов
/ 16 февраля 2011

Ну, это действительно старый вопрос, но я столкнулся с той же проблемой и сумел ее решить.

Магический пароль устанавливает стиль UIBarButtonItem в UIBarButtonItemStyleBordered.

UIBarButtonItem *item = [[UIBarButtonItem alloc] initWithCustomView:aView];
item.style = UIBarButtonItemStyleBordered;

Вот так ...

2 голосов
/ 16 сентября 2010

Я решил эту проблему, вы должны использовать гибкий элемент до и после каждой кнопки.

    UIBarButtonItem *flexibleSpace = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];

Просто добавьте FlexibleSpace к вашему массиву элементов, который будет установлен на панели инструментов.

p.s. Я почти убил себя, прежде чем избавиться от этого, и попробовал все типы решений, включая использование других баров вместо UIToolBar.

1 голос
/ 04 января 2012

Мне удалось решить эту проблему в Xcode4, поставив гибкий пробел в качестве самого левого элемента, а затем еще один в качестве самого правого элемента.

enter image description here
enter image description here

1 голос
/ 25 августа 2011

Я встречал ту же проблему. Наконец, я решил эту проблему с помощью создания подкласса UIToolbar и переопределил метод подвидов макета.

- (void)layoutSubviews {

  [super layoutSubviews];

  if (leftItem_ && leftItem_.customView
      && [leftItem_.customView isKindOfClass:[UIButton class]]) {
    CGRect newFrame = leftItem_.customView.frame;
    newFrame.origin.x = 0;   // reset the original point x to 0; default is 12, wired number
    leftItem_.customView.frame = newFrame;    
  }

  if (rightItem_ && rightItem_.customView
      && [rightItem_.customView isKindOfClass:[UIButton class]]) {
    CGRect newFrame = rightItem_.customView.frame;
    newFrame.origin.x = self.frame.size.width - CGRectGetWidth(newFrame);
    rightItem_.customView.frame = newFrame;
  }

}
0 голосов
/ 16 сентября 2013

Я столкнулся с той же проблемой сегодня и решил ее простым способом, Так что делимся.

Вы можете взять новый UIView с тем же номером. кнопки на панели инструментов, которую вы хотите показать. а затем просто установите размер в соответствии с панелью инструментов.

Короче говоря, обычные кнопки над панелью инструментов будут выглядеть как кнопки панели инструментов.

0 голосов
/ 03 августа 2009
UIBarButtonItem *barButton1,*barButton2;

barButton1 = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"image1.png"] style:UIBarButtonItemStylePlain
    target:self action:@selector(action:)];

barButton2 = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"bart_tb.png"] style:UIBarButtonItemStylePlain
    target:self action:@selector(action:)];

NSArray *items = [[NSArray alloc] initWithObjects: barButton1, barButton2, nil];
[barButton1 release];
[barButton2 release];
[self.toolbar setItems:items animated:NO];
[items release];

Сделайте так ... и если вы хотите изменить ширину кнопок, установите свойство width объектов UIBarButtonItem. Значение по умолчанию для ширины равно 0, что делает его достаточно большим, чтобы соответствовать его изображению / заголовку.

Надеюсь, это поможет.

...