Подтвердить что ты не робот

Как удалить пробелы в UIToolbar между пользовательскими представлениями?

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

Помощь приветствуется.

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

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];
4b9b3361

Ответ 1

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

UIToolBar расставляет его частным образом. Инженеры Apple никогда не ожидают, что разработчики переписывают это. Использование фиксированных пространств для перезаписи стандартного 10-процентного горизонтального интервала недостаточно. Поскольку 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]];

Ответ 2

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

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. В то время как UIBarButtonSystemItemFlexibleSpace работает для вас, это казалось бы.

Ответ 3

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

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

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

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

Ответ 4

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

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

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

Вот оно...

Ответ 5

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

UIBarButtonItem *fixedSpace = [[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace target:nil action:nil] autorelease];
fixedSpace.width = -12.0f;

Ответ 6

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

Ответ 7

Я встретил ту же проблему. Наконец, я решил это, подклассифицируя UIToolbar и переопределяя метод представления subviews.

- (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;
  }

}

Ответ 8

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

enter image description here
enter image description here

Ответ 9

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. Значение по умолчанию width равно 0, что делает его достаточно большим, чтобы соответствовать его изображению/названию.

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

Ответ 10

Сегодня я столкнулся с такой же проблемой и решил ее простым способом, Итак, делитесь.

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

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