具有CustomView和边框的UIBarButton

我已经subclassed UIBarButtonItem,并试图做一个button,通常刷新图像,但加载时的活动微调。 我有的问题是我无法得到有边框的样式,以显示一个自定义视图里面。 它只是不显示。

这是我的代码(从我的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; 

有没有理由不工作?

在iOS5中,将animation图像放入UIBarButtonItem并维护UIBarButtonItemStyleBordered是一个技巧:

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

然后,创build一组图像,为animation的每一帧创build一个图像,然后命名为“refresh-0.png”,“refresh-1.png”等等。

刷新0.png刷新1.png刷新2.png

当您想要停止animation时,请使用静态版本replace该button的图像:

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

要自己创build所有这些图像仍然是一个很大的麻烦,但它可能比创build自己的Button-border背景更加一致。

要使用UIActivityIndi​​catorView来完成这个任务,而不是replace它,你必须自己渲染button边框。 我所做的是将UIBarButtonItem的customView设置为包含边框的UIImageView,然后将活动视图添加为该图像的子视图。

这让您面临获取边框图像的问题。 如果你只需要一个条形的颜色,那么你可以把它从模拟器的截图中剪出来; 如果你需要多栏颜色,那么你不仅需要获取边界像素,还需要获得边界透明度, 为此我编写了一个Python脚本。

由于UIBarButtonItems(使用-initWithImage -initWithImage:style:target:action:-initWithTitle:style:target:action: )不支持button内部的任意视图,因此不可能完成要做的事情。

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

希望这可以帮助。