Как программно добавить простую панель загрузки (выполнения) по умолчанию в приложении iphone - PullRequest
37 голосов
/ 02 апреля 2012

Я использую http-связь в приложении «Мой iPhone».Я хочу показать индикатор выполнения во время загрузки данных с сервера.Как я могу сделать это программно?

Я просто хочу индикатор выполнения по умолчанию.Ничего особенного, как в Android мы делаем ProgressDialog.show();, есть ли один вкладыш для отображения индикатора прогресса в iphone?

Ответы [ 16 ]

81 голосов
/ 02 апреля 2012
UIActivityIndicatorView *indicator = [[UIActivityIndicatorView alloc]initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
indicator.frame = CGRectMake(0.0, 0.0, 40.0, 40.0);
indicator.center = self.view.center;    
[self.view addSubview:indicator];
[indicator bringSubviewToFront:self.view];
[UIApplication sharedApplication].networkActivityIndicatorVisible = TRUE;

Напишите ниже код, когда вы хотите показать индикатор

[indicator startAnimating];

напишите код ниже, когда хотите скрыть индикатор

[indicator stopAnimating];
34 голосов
/ 14 июля 2015

Перевод @ ответа Хирена на Swift

 var indicator: UIActivityIndicatorView = UIActivityIndicatorView(activityIndicatorStyle: UIActivityIndicatorViewStyle.gray)
 indicator.frame = CGRect(x: 0, y: 0, width: 40, height: 40)
 indicator.center = view.center
 self.view.addSubview(indicator)
 self.view.bringSubview(toFront: indicator)
 UIApplication.shared.isNetworkActivityIndicatorVisible = true

Показать индикатор

indicator.startAnimating()

Индикатор остановки

indicator.stopAnimating()
11 голосов
/ 02 апреля 2012

Я бы порекомендовал использовать NSURLConnection.Вам понадобятся следующие методы:

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
  [self.resourceData setLength:0];
  self.filesize = [NSNumber numberWithLongLong:[response expectedContentLength]];
}

-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
  [self.resourceData appendData:data];
  NSNumber *resourceLength = [NSNumber numberWithUnsignedInteger:[self.resourceData length]];
  self.progressBar.progress = [resourceLength floatValue] / [self.filesize floatValue];
}

-(void)connectionDidFinishLoading:(NSURLConnection *)connection
{
  self.progressBar.hidden = YES;
}

И заголовочный файл:

@property (nonatomic, retain) UIProgressView *progressBar;
@property (nonatomic, retain) NSMutableData *resourceData;
@property (nonatomic, retain) NSNumber *filesize;

Надеюсь, это поможет

9 голосов
/ 21 октября 2016

Чтобы этот вопрос был полностью обновлен, я перевел ответ @ enrique7mc на Swift3.0 после его перевода из ответа @ Хирен.

var indicator: UIActivityIndicatorView = UIActivityIndicatorView(activityIndicatorStyle: UIActivityIndicatorViewStyle.gray)
indicator.frame = CGRect(x: 0.0, y: 0.0, width: 40.0, height: 40.0)
indicator.center = view.center
view.addSubview(indicator)
indicator.bringSubview(toFront: view)
UIApplication.shared.isNetworkActivityIndicatorVisible = true

Запуск и остановка индикатора выполнения аналогичны указаниям @ enrique7mc.

indicator.startAnimating()
indicator.stopAnimating()
6 голосов
/ 02 апреля 2012

Вы можете использовать встроенный в IOS UIProgressView.Ниже приведен фрагмент кода:

UIProgressView *progressView = [[UIProgressView alloc] initWithProgressViewStyle:UIProgressViewStyleDefault];
[self.view addSubview:progressView];
[progressView setProgress:50.0];

Вы можете использовать setFrame: для позиционирования индикатора на экране.

6 голосов
/ 02 апреля 2012

UIProgressView - это класс, который вы ищете: Apple Docs

Вам необходимо использовать метод setProgress:animated:, чтобы обновить отображаемый прогресс.Скорее всего, там, где вы обрабатываете полученные данные из сети.

5 голосов
/ 02 апреля 2012

Попробуйте код ниже

float progress;

//components
UIProgressView *progressBar;
progressBar=[[UIProgressView alloc]initWithProgressViewStyle:UIProgressViewStyleDefault];
[progressBar setFrame:CGRectMake(30.0, 75.0, 200.0, 80.0)];

int prog=progress*100;
progressStr=[NSString stringWithFormat:@"%d%%",prog];
[progressBar setProgress:progress];
4 голосов
/ 01 июня 2016

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

Основные обновления:

  • поддержка дополнительного непрозрачного наложения за индикатором активности
  • использование размера кадра по умолчанию для индикатора активности
  • использование стиля индикатора .WhiteLarge

Inмой AppHelper.swift:

static func showActivityIndicator(view: UIView, withOpaqueOverlay: Bool) {

    // this will be the alignment view for the activity indicator
    var superView: UIView = view

    // if we want an opaque overlay, do that work first then put the activity indicator within that view; else just use the passed UIView to center it
    if withOpaqueOverlay {
        let overlay = UIView()
        overlay.frame = CGRectMake(0.0, 0.0, view.frame.width, view.frame.height)
        overlay.layer.backgroundColor = UIColor.blackColor().CGColor
        overlay.alpha = 0.7
        overlay.tag = activityIndicatorOverlayViewTag

        overlay.center = superView.center
        overlay.hidden = false
        superView.addSubview(overlay)
        superView.bringSubviewToFront(overlay)

        // now we'll work on adding the indicator to the overlay (now superView)
        superView = overlay
    }

    let indicator: UIActivityIndicatorView = UIActivityIndicatorView(activityIndicatorStyle: .WhiteLarge)

    indicator.center = superView.center
    indicator.tag = activityIndicatorViewTag
    indicator.hidden = false

    superView.addSubview(indicator)
    superView.bringSubviewToFront(indicator)

    indicator.startAnimating()

    // also indicate network activity in the status bar
    UIApplication.sharedApplication().networkActivityIndicatorVisible = true
}

static func hideActivityIndicator(view: UIView) {

    // stop the network activity animation in the status bar
    UIApplication.sharedApplication().networkActivityIndicatorVisible = false

    // remove the activity indicator and optional overlay views
    view.viewWithTag(activityIndicatorViewTag)?.removeFromSuperview()
    view.viewWithTag(activityIndicatorOverlayViewTag)?.removeFromSuperview()
}
2 голосов
/ 09 марта 2014

Попробуйте MBProgressHUD .

Это довольно просто, имеет несколько параметров анимации прогресса и может добавить некоторые настройки. Он отображает полный экран. И это должно работать с любыми последними версиями iOS.

Или попробуйте LDProgressView , если вы хотите что-то более модное :) Это как-то похоже на индикатор выполнения OSX.

1 голос
/ 06 июля 2018

@ перевод ответа нанятого на Swift4.0

let indicator: UIActivityIndicatorView = UIActivityIndicatorView(activityIndicatorStyle: UIActivityIndicatorView.Style.gray)
        indicator.frame = CGRect(x: 0.0, y: 0.0, width: 40.0, height: 40.0)
        indicator.center = view.center
        view.addSubview(indicator)
        indicator.bringSubviewToFront(view)
        UIApplication.shared.isNetworkActivityIndicatorVisible = true


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