如何在自定义视图之间删除UIToolbar中的空格?

时间:2009-08-02 21:57:26

标签: iphone user-interface uitoolbar

我正在尝试使用自定义图片创建一个带有5个按钮的UIToolbar。我这样做的方法是创建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 个答案:

答案 0 :(得分:17)

如果你正在寻找的是布局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]];

答案 1 :(得分:5)

如果在每个项目之间添加间隔符,则间距应该自行运行。在您的情况下,您可能希望在两个按钮的两侧放置一个垫片,一个放在两者之间。你可以这样做:

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可以为您解决这个问题。

答案 2 :(得分:2)

我已经解决了这个问题,你应该在每个按钮之前和之后使用灵活的项目。

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

只需将flexibleSpace添加到您将在工具栏中设置的项目数组中。

P.S。在摆脱这种情况之前我几乎已经杀了自己,并尝试了所有类型的解决方案,包括使用其他条形而不是UIToolBar。

答案 3 :(得分:2)

嗯,这是一个非常古老的问题,但我遇到了同样的问题并设法解决了它。

魔术密码将UIBarButtonItem样式设置为UIBarButtonItemStyleBordered。

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

多数民众赞成......

答案 4 :(得分:2)

可以在项目之间添加一个负宽度的固定空间项目以补偿间距。

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

答案 5 :(得分:2)

在两个小节按钮之间,您可以使用UIBarButtonSystemItemFixedSpace。 并调整宽度。它对我有用。

答案 6 :(得分:1)

我遇到了同样的问题。最后,我通过继承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;
  }

}

答案 7 :(得分:1)

我能够在Xcode4中解决这个问题,方法是将一个灵活空间作为最左边的项目,然后将另一个作为最右边的项目。

enter image description here
enter image description here

答案 8 :(得分:0)

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

这样做..如果你想改变按钮的宽度,设置UIBarButtonItem对象的width属性。 width的默认值为0,这使得它足够大以适合其图像/标题。

希望有所帮助。

答案 9 :(得分:0)

我今天面临同样的问题并以一种简单的方式解决了它, 所以分享。

你可以选择一个新的UIView。您要显示的工具栏上的按钮。 然后根据工具栏设置大小。

简而言之,工具栏上方的正常按钮看起来像工具栏按钮。