具有自定义视图和边框的UIBarButton

时间:2012-04-04 11:52:37

标签: iphone ios uibutton uibarbuttonitem

我已经将UIBarButtonItem子类化了,并且我正在尝试创建一个按钮来正常显示刷新图像,但是在加载时会调用活动微调器。我遇到的问题是我无法获得带边框的样式来显示内部的自定义视图。它只是没有出现。

这是我的代码(来自我的UIBarButtonItem子类的构造函数):

self = [super initWithTitle:@"" style:UIBarButtonItemStyleBordered target:self action:nil];
UIView *viwInner = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 24,24)];
[self.customView addSubview:viwInner];

self.btnStandard = [UIButton buttonWithType:UIButtonTypeCustom];
[self.btnStandard setFrame:CGRectMake(0, 0, 24,24)];
UIImage *initialImage = [[UIImage imageNamed:@"refresh_24.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 0, 0, 0)];
[self.btnStandard setBackgroundImage:initialImage forState:UIControlStateNormal];
[self.btnStandard setBackgroundImage:initialImage forState:UIControlStateHighlighted];
[self.btnStandard setBackgroundImage:initialImage forState:UIControlStateSelected];
[self.btnStandard addTarget:self action:@selector(didTapInitialButton:) forControlEvents:UIControlEventTouchUpInside];
[viwInner addSubview:self.btnStandard];

self.btnLoading = [UIButton buttonWithType:UIButtonTypeCustom];
[self.btnLoading setFrame:CGRectMake(0, 0, 24,24)];
self.loadingView = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActionSheetStyleBlackOpaque];
[self.loadingView setHidesWhenStopped:true];
[self.loadingView stopAnimating];
[self.btnLoading addSubview:self.loadingView];
[self.btnLoading addTarget:self action:@selector(didTapAbortButton:) forControlEvents:UIControlEventTouchUpInside];
[viwInner addSubview:self.btnLoading];

return self;

这是不是有原因吗?

3 个答案:

答案 0 :(得分:3)

在iOS5中,有一个技巧可以将动画图像转换为UIBarButtonItem并维护UIBarButtonItemStyleBordered

UIImage *image = [UIImage animatedImageNamed:@"refresh-" duration:1.f];
self.button = [[UIBarButtonItem alloc] initWithImage:image
                                               style:UIBarButtonItemStyleBordered 
                                              target:self
                                              action:@selector(doSomething:)];

然后,创建一组图像,每个动画帧一个图像,然后命名为“refresh-0.png”,“refresh-1.png”等等:

refresh-0.png refresh-1.png refresh-2.png

如果要停止动画,请使用静态版本替换按钮图像:

self.button.image = [UIImage imageNamed:@"refresh-0.png"];

自己创建所有这些图片仍然是一个很大的麻烦,但它可能比创建自己的按钮边框背景更加一致。

答案 1 :(得分:1)

要使用UIActivityIndi​​catorView完成此操作,而不是替换它,您必须自己渲染按钮边框。我所做的是将UIBarButtonItem的customView设置为包含边框的UIImageView,并将活动视图添加为该图像的子视图。

这使您无法获得边框图像。如果您只需要一种条形颜色,那么您可以从模拟器截图中裁剪出来;如果你需要多种条形颜色,那么你不仅要获得边框像素,还要获得边框透明度,for which我写了一个Python脚本。

答案 2 :(得分:-1)

由于UIBarButtonItems(使用-initWithImage:style:target:action:-initWithTitle:style:target:action:创建)不支持按钮内的任意视图,因此无法执行您要执行的操作。

您可以尝试将UIActivityIndicatorView放在模拟按钮边框的图像上。然后,您可以使用initWithCustomView:将视图添加到按钮中。

希望这有帮助。