Как я могу создать кнопку с UIActivityIndicator на панели навигации в том же стиле, что и обычные кнопки? - PullRequest
11 голосов
/ 12 марта 2009

Все примеры, которые я видел здесь и на других сайтах, касались создания UIActivityIndicatorView и загрузки его примерно так:

self.navigationItem.rightBarButtonItem = [[[UIBarButtonItem alloc] 
                   initWithCustomView:myActivityIndicatorView 
                   target:nil 
                   action:nil] 
                  autorelease];

Однако это просто создает простой индикатор активности на панели навигации. То, что я хочу сделать, это иметь кнопку, которая выглядит как обычные кнопки UIBarButtonSystemItem, но с индикатором активности вместо одного из изображений по умолчанию. Я попытался выполнить initWithImage и initWithTitle с нулевыми изображениями или заголовками, а затем добавить индикатор активности в качестве подпредставления, но это не работает.

Есть идеи?

Ответы [ 4 ]

6 голосов
/ 09 марта 2010

Мое решение - создать подкласс 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

Затем использовать его:

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 здесь должен иметь один.

1 голос
/ 29 мая 2009

У меня это работает, и это очень просто. Просто поместите индикатор активности туда, где вы хотите, с IB, но убедитесь, что он находится ниже в списке, чем панель, на которой вы хотите его видеть, и находится на «верхнем уровне» (а не в подвиде чего-либо еще). Затем управляйте этим кодом через розетку.

1 голос
/ 21 августа 2009

Вот что может помочь:

activityIndicator = [[UIActivityIndicatorView alloc] initWithFrame:CGRectMake(0, 0, 20, 20)];
[activityIndicator startAnimating];
UIBarButtonItem *activityItem = [[UIBarButtonItem alloc] initWithCustomView:activityIndicator];
[activityIndicator release];
self.navigationItem.rightBarButtonItem = activityItem;
[activityItem release];
[activityIndicator startAnimating];
1 голос
/ 12 марта 2009

пытались ли вы создать UIB-кнопку на панели кнопок, а затем добавить индикатор активности в качестве подпросмотра UIB-кнопки?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...