Как установить индикатор активности в панели навигации?

Я новичок в разработке iphone. Я хочу установить индикатор активности на панели навигации. Я вижу индикатор своей активности под панелью навигации. Мой код здесь

- (IBAction) gomethod : (id) sender {
    xxMapSubviewcontroller = [[XxMapSubviewcontroller alloc] init];
    [self.navigationController pushViewController:xxMapSubviewcontroller animated:YES];

    activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
    activityIndicator.frame = CGRectMake(0.0, 0.0, 20.0, 20.0);
    [activityIndicator startAnimating];

    [xxMapSubviewcontroller.view addSubview:activityIndicator];
}

Как установить индикатор активности на панели навигации? Пожалуйста, помогите мне. Спасибо.


person Warrior    schedule 18.02.2010    source источник


Ответы (12)


Я добавляю приведенный ниже фрагмент кода в представление, где мне нужен индикатор активности на панели навигации.

activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
UIBarButtonItem * barButton = [[UIBarButtonItem alloc] initWithCustomView:activityIndicator];
[self navigationItem].rightBarButtonItem = barButton;
[activityIndicator startAnimating];
person Warrior    schedule 18.02.2010
comment
Обратил внимание, что на iOS 7 нужно использовать activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];, иначе индикатор не появится. - person antf; 07.01.2014

Быстрый код:

let activityIndicator = UIActivityIndicatorView(frame: CGRect(x: 0, y: 0, width: 20, height: 20))
let barButton = UIBarButtonItem(customView: activityIndicator)
self.navigationItem.setRightBarButton(barButton, animated: true)
activityIndicator.startAnimating()
person Mkey    schedule 12.04.2016

Здесь вы создаете новое представление индикатора активности, и это нормально, но вы не имеете в виду индикатор активности в строке состояния.

Чтобы отобразить индикатор активности в строке состояния, просто вызовите это:

[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];
person Zoran Simic    schedule 18.02.2010
comment
Я хочу отображать индикатор активности на панели навигации - person Warrior; 18.02.2010
comment
Мне требовалось решение Warrior, потому что я скрываю строку состояния. Конечно, с вашим решением нет ничего плохого! - person Andrew Duncan; 31.01.2015

Это сработало для меня в Swift:

let activityIndicator: UIActivityIndicatorView = UIActivityIndicatorView.init(activityIndicatorStyle: .White)
let refreshBarButton: UIBarButtonItem = UIBarButtonItem(customView: activityIndicator)
self.navigationItem.leftBarButtonItem = refreshBarButton
activityIndicator.startAnimating()
person Axe    schedule 15.07.2016
comment
В 10.1.1 происходит сбой: libc ++ abi.dylib: завершается неперехваченным исключением типа NSException - person Michael Garito; 08.11.2016
comment
На 11.4 работает без проблем. - person Baran Emre; 19.07.2018

Swift

  1. Подключите UIBarButtonItem от storyboard к yourViewController
  2. удалите week из его определения, например: @IBOutlet var btNavigaitonRight: UIBarButtonItem!
  3. Используйте эти методы для запуска и остановки индикатора активности:

    var activityIndicator = UIActivityIndicatorView()
    
    func startBarButtonIndicator() {
        activityIndicator = UIActivityIndicatorView(frame: CGRect(x: 0, y: 0, width: 20, height: 20))
        activityIndicator?.color = .gray
        let barButton = UIBarButtonItem(customView: activityIndicator!)
        self.navigationItem.setRightBarButton(barButton, animated: true)
        activityIndicator?.startAnimating()
    }
    
    func stopBarButtonIndicator() {
        activityIndicator?.stopAnimating()
        navigationItem.setRightBarButton(btNavigaitonRight, animated: true)
    }
    
person Hamed    schedule 17.07.2018

В раскадровке: создайте BarButtonItem на панели навигации. Добавьте View, чтобы быть сыном вашего BarButtonItem и ActivityIndicator, чтобы быть сыном вашего View.

person evya    schedule 15.12.2014
comment
Да, на StoryBoard: перетащите на панель навигации элемент BarButtonItem, теперь перетащите UIView, чтобы он стал частью BarButtonItem, теперь перетащите ActivityIndicator, чтобы он стал частью UIView. - person evya; 13.12.2017

Как WhatsApp:

// Объявить

let activityIndicator = UIActivityIndicatorView(activityIndicatorStyle: .gray)

// ViewDidLoad

self.activityIndicator.hidesWhenStopped = true

func showIndicator() {
    self.navigationItem.titleView = self.activityIndicator
    self.activityIndicator.isHidden = false
}

func hideIndicator() {
    self.navigationItem.titleView = nil
}
person Urvish Modi    schedule 21.11.2017

Спасибо! Мой индикатор сейчас работает.

Я поделюсь примером кода для других новичков, чтобы поместить это в контекст.

- (void) viewDidLoad

// custom button images
UIImage *customImage = [UIImage imageNamed:@"menu24"];
UIImage *customImage2 = [UIImage imageNamed:@"search24"];
UIImage *customImage3 = [UIImage imageNamed:@"back24"];

// These are linked in my story board to Navigation Item
[self customiseBarBtnItem:[self menu_button] 
    customImage:customImage selector:@selector(menuPressed:)];
[self customiseBarBtnItem:[self search_button] 
    customImage:customImage2 selector:@selector(searchPressed:)];
[self customiseBarBtnItem:[self backButton] 
    customImage:customImage3 selector:@selector(backPressed:)];

//initialize the activity indicator - as @antf comment suggests for ios7   
UIActivityIndicatorView *actInd=[[UIActivityIndicatorView alloc]                                      
     initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];

//store it as a property on the view controller
self.activityIndicator = actInd;

// this sets up activity indicator    
UIBarButtonItem *progress_indicator = [[UIBarButtonItem alloc] 
     initWithCustomView:[self activityIndicator]];

// link custom buttons AND activity indicator in desired order to navigation bar
self.navigationItem.rightBarButtonItems =
    [NSArray arrayWithObjects:
         self.menu_button,
         self.search_button, 
         progress_indicator, 
         nil];

// Для полноты - так я программно показываю / скрываю кнопку возврата

if ( bShowBack == YES ) 
     self.navItemBar.leftBarButtonItem = self.backButton;
else 
     self.navItemBar.leftBarButtonItem = Nil;

// Я использую индикатор активности с UIWebView, поэтому запускаю его следующим образом

  - (void)webViewDidStartLoad:(UIWebView *)webView
  {    
    [[self activityIndicator] startAnimating];
  }

  - (void)didFailLoadWithError:(UIWebView *)webView 
          didFailLoadWithError:(NSError *)error
  {    
     [[self activityIndicator] stopAnimating];
  }

  - (void)webViewDidFinishLoad:(UIWebView *) webView
  {
     [[self activityIndicator] stopAnimating];
  }
person Anthony De Souza    schedule 10.07.2014

В Swift я сделал следующее:

Включить: UIApplication.sharedApplication().networkActivityIndicatorVisible = true

Отключить: UIApplication.sharedApplication().networkActivityIndicatorVisible = false

person djbp    schedule 07.01.2015
comment
Это входит в строку состояния, хотя - person powerj1984; 10.02.2015
comment
Вы не ошиблись. Я неправильно прочитал OP - извинения. Сказав это, я наткнулся на этот пост в поисках ответа о том, как решить проблему отображения индикатора сетевой активности в строке состояния - надеюсь, мой ответ все равно окажет некоторую помощь кому-то, если не OP. - person djbp; 11.02.2015

У меня был аналогичный вопрос с ответом здесь: iphone - программно изменить навигацию полосковая кнопка к индикатору активности

Я хотел изменить кнопку обновления на панели навигации на индикатор активности и обратно.

person cagreen    schedule 18.02.2010

попробуйте это: self.navigationItem.leftBarButtonItem.customView = your_view

person iXcoder    schedule 19.02.2010

Я попытался использовать его сейчас, и код, упомянутый воином, не работал точно так, как есть. Пришлось изменить инициализацию activityIndicator:

activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];

С этим изменением все должно работать должным образом.

person Nir    schedule 01.01.2014