如何在导航栏中创建一个带有UIActivityIndicator的按钮,其样式与普通按钮相同? [英] How can I create a button with a UIActivityIndicator in my navigation bar with the same style as normal buttons?
问题描述
我在这里和其他网站上看到的所有示例都涉及创建一个UIActivityIndicatorView并加载它:
self.navigationItem.rightBarButtonItem = [[[UIBarButtonItem alloc]
initWithCustomView:myActivityIndicatorView
target:nil
action:nil]
autorelease];
但是,这只是在导航栏中创建一个简单的活动指示器。我想做的是有一个按钮,看起来像正常的UIBarButtonSystemItem按钮,但具有活动指示器,而不是默认图像之一。我试过做initWithImage和initWithTitle与nil图像或标题,然后添加活动指示器作为一个子视图,但不起作用。
任何想法? p>
我的解决方案是创建UIButton的子类:
SOActivityButton.h ::
@interface SOActivityButton:UIButton
{
UIActivityIndicatorView * activityIndicator;
}
@end
在 SOActivityButton.m :
@implementation SOActivityButton
- (id)initWithFrame:(CGRect)frame
{
if(self = [super initWithFrame:frame])
{
CGRect innerFrame = CGRectInset(frame,8.0f,8.0f);
activityIndicator = [[UIActivityIndicatorView alloc]
initWithFrame:innerFrame];
activityIndicator.activityIndicatorViewStyle = UIActivityIndicatorViewStyleWhite;
[self addSubview:activityIndicator];
}
return self;
}
- (void)dealloc
{
[activityIndicator release],activityIndicator = nil;
[super dealloc]
}
- (void)startAnimating
{
[activityIndicator startAnimating];
}
- (void)stopAnimating
{
[activityIndicator stopAnimating];
}
@end
然后使用它:
SOActivityButton * activityButton = [[SOActivityButton alloc]
initWithFrame:CGRectMake(0.0f,0.0f,32.0f,32.0f)];
[activityButton setImage:[UIImage imageNamed:@button-background.png]
forState:UIControlStateNormal];
[activityButton addTarget:self action:@selector(myAction :)
forControlEvents:UIControlEventTouchUpInside];
UIBarButtonItem * activityBarButtonItem = [[UIBarButtonItem alloc]
initWithCustomView:activityButton];
[activityButton release];
self.navigationItem.rightBarButtonItem = activityBarButtonItem;
[activityBarButtonItem release];
您需要找到或创建一个 button-background.png 。 PSD 此处应该有一个。
All of the examples I've seen on here and other sites involved creating a UIActivityIndicatorView and loading it with something like:
self.navigationItem.rightBarButtonItem = [[[UIBarButtonItem alloc]
initWithCustomView:myActivityIndicatorView
target:nil
action:nil]
autorelease];
However, that just creates a plain activity indicator in the navigation bar. What I want to do is have a button that looks just like the normal UIBarButtonSystemItem buttons but with an activity indicator instead of one of the default images. I've tried doing initWithImage and initWithTitle with nil images or titles and then adding the activity indicator as a subview, but that doesn't work.
Any ideas?
My Solution is to create a subclass of UIButton:
in SOActivityButton.h:
@interface SOActivityButton : UIButton
{
UIActivityIndicatorView* activityIndicator;
}
@end
in SOActivityButton.m:
@implementation SOActivityButton
- (id)initWithFrame:(CGRect)frame
{
if (self = [super initWithFrame:frame])
{
CGRect innerFrame = CGRectInset(frame, 8.0f, 8.0f);
activityIndicator = [[UIActivityIndicatorView alloc]
initWithFrame:innerFrame];
activityIndicator.activityIndicatorViewStyle = UIActivityIndicatorViewStyleWhite;
[self addSubview:activityIndicator];
}
return self;
}
- (void)dealloc
{
[activityIndicator release], activityIndicator = nil;
[super dealloc];
}
- (void) startAnimating
{
[activityIndicator startAnimating];
}
- (void) stopAnimating
{
[activityIndicator stopAnimating];
}
@end
Then to use it:
SOActivityButton* activityButton = [[SOActivityButton alloc]
initWithFrame:CGRectMake(0.0f, 0.0f, 32.0f, 32.0f)];
[activityButton setImage:[UIImage imageNamed:@"button-background.png"]
forState:UIControlStateNormal];
[activityButton addTarget:self action:@selector(myAction:)
forControlEvents:UIControlEventTouchUpInside];
UIBarButtonItem *activityBarButtonItem = [[UIBarButtonItem alloc]
initWithCustomView:activityButton];
[activityButton release];
self.navigationItem.rightBarButtonItem = activityBarButtonItem;
[activityBarButtonItem release];
You will need to find or create a button-background.png. The PSD here should have one.
这篇关于如何在导航栏中创建一个带有UIActivityIndicator的按钮,其样式与普通按钮相同?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!