UIBarButtonItem在UIToolBar和UINavigationBar中的显示方式不同

时间:2012-05-30 07:42:09

标签: ios xcode uinavigationbar uibarbuttonitem uitoolbar

我需要在UIToolBar中使用一个简单的UIBarButtonItem。

我使用此代码将带有自定义图像的按钮添加到导航栏:

UIBarButtonItem *cloneButton = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"image_sheep.png"] style:UIBarButtonItemStylePlain target:self action:@selector(clone)];
NSArray *rightItems = [NSArray arrayWithObject:cloneButton];
self.navigationItem.rightBarButtonItems = rightItems;

结果是我想要的,看起来像这样

navigation bar http://img207.imageshack.us/img207/3383/navigationbara.jpg

在UIToolBar中做同样的事情,我正在添加到UITableViewCell的contentView

UIBarButtonItem *cloneButton = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"image_sheep.png"] style:UIBarButtonItemStylePlain target:self action:@selector(clone)];
UIBarButtonItem *leftSpace = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];
toolbar.items = [NSArray arrayWithObjects:leftSpace, cloneButton, nil];

问题是我得到这样的东西:

toolbar http://img209.imageshack.us/img209/1374/toolbary.jpg

这肯定是因为UINavigationBar和UIToolBar没有以相同的方式绘制... 有人可以指出如何解决这个问题吗?

3 个答案:

答案 0 :(得分:2)

UIToolbar上使用 UIBarButtonItemStyleBordered 而不是 UIBarButtonItemStylePlain

如果没有按钮外观,

UINavigationBar将不会绘制相同的按钮。

答案 1 :(得分:1)

这就是UIToolbar的工作方式。根据文件:

  

表示项目的正常和突出显示状态的工具栏图像源自使用UIBarItem类中的继承图像属性设置的图像。例如,图像将转换为白色,然后通过为正常状态添加阴影来斜切。

也就是说,您可以通过使用自定义视图而不是图像创建UIBarButtonItem来获得所需的结果。像这样:

UIImage *sheepImage = [UIImage imageNamed:@"image_sheep.png"];
UIButton *sheepButton = [UIButton buttonWithType:UIButtonTypeCustom];
[sheepButton setImage:sheepImage forState:UIControlStateNormal];
[sheepButton addTarget:self action:@selector(clone) forControlEvents:UIControlEventTouchUpInside];
[sheepButton setShowsTouchWhenHighlighted:YES];
[sheepButton sizeToFit];
UIBarButtonItem *cloneButton = [[UIBarButtonItem alloc] initWithCustomView:sheepButton];

我没有测试过这个,所以我不知道它是否会起作用。

答案 2 :(得分:0)

我再也看不到问题中张贴的图片了。但我很确定我们正试图在UINavigationBar中模仿UIToolBar的UIBarButtonItemStylePlain。

除了这一行之外,Benzado非常适合:

[sheepButton setImage:sheepImage forState:UIControlStateNormal];

这会将图像放在触摸指示器前面。 UIToolBar显示图像前面的触摸。所以模仿UINavigationBar中的UIToolBar样式:

UIImage *sheepImage = [UIImage imageNamed:@"image_sheep.png"];
UIButton *sheepButton = [UIButton buttonWithType:UIButtonTypeCustom];
[sheepButton setBackgroundImage:sheepImage forState:UIControlStateNormal];
[sheepButton addTarget:self action:@selector(clone) forControlEvents:UIControlEventTouchUpInside];
[sheepButton setShowsTouchWhenHighlighted:YES];
[sheepButton sizeToFit];
UIBarButtonItem *cloneButton = [[UIBarButtonItem alloc] initWithCustomView:sheepButton];