добавление индикатора выполнения под панелью навигации

Я новичок в iOS-разработке.

Я хотел бы знать, есть ли в iOS 7 при отправке сообщения под UINavigationBar, которое имеет заголовок «Отправка», есть индикатор выполнения, который загружается до тех пор, пока сообщение не будет успешно отправлено.

Мой вопрос:

  1. Это индикатор прогресса?

  2. В iOS 6 индикатор выполнения находится внутри UINavigationBar?

Может ли кто-нибудь дать мне несколько идей о том, как создать это на iOS 7 и iOS6?

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

Вот мой код:

прогресс = 50;

    CGRect navframe = [[self.navigationController navigationBar] frame];
    int height= navframe.size.height;
    sendView = [[UIView alloc] init];
    sendView.frame = CGRectMake(0, 0, 200, 30);
    sendView.backgroundColor = [UIColor clearColor];
    UILabel* lbl = [[UILabel alloc] init];
    lbl.frame = CGRectMake(0,0, 200, 15);
    lbl.backgroundColor = [UIColor clearColor];
    lbl.textColor = [UIColor whiteColor];
    lbl.shadowColor = [UIColor colorWithWhite:0 alpha:0.3];
    lbl.shadowOffset = CGSizeMake(0, -1);
    lbl.font = [UIFont boldSystemFontOfSize:12];
    lbl.text = @"";
    lbl.textAlignment = UITextAlignmentCenter;
    [sendView addSubview:lbl];
    UIProgressView* pv = [[UIProgressView alloc] initWithProgressViewStyle:UIProgressViewStyleBar];
    pv.frame = CGRectMake(0, 30-pv.frame.size.height, 200, pv.frame.size.height);
    pv.progress = progress/100.0;

  [sendView addSubview:pv];
    [self.navigationController.navigationBar addSubview:sendView];

К сожалению, индикатор выполнения не находится под навигационным контроллером. Почему?


person just ME    schedule 20.11.2013    source источник


Ответы (4)


Что я делаю в своем приложении для iOS, так это создаю и добавляю UIProgressBar в качестве подвида панели навигации, сообщаю ему [progressBar setTranslatesAutoresizingMaskIntoConstraints:NO] и добавляю ограничения, чтобы прикрепить его слева и справа к панели, а его нижнюю часть — к нижней части навигации. бар. Контроллер навигации поддерживает для него ivar и предлагает общедоступные методы для его отображения/скрытия и установки его значения. Выглядит так же, как в Safari при загрузке контента.

РЕДАКТИРОВАТЬ: вот код для создания и добавления его на панель навигации:

// in UINavigationController subclass
- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view.

    UIProgressView *progress = [[UIProgressView alloc] initWithProgressViewStyle:UIProgressViewStyleBar];
    progress.tag = DISPLAY_PROGRESS_VIEW;
    [self.view addSubview:progress];
    UINavigationBar *navBar = [self navigationBar];

    NSLayoutConstraint *constraint;
    constraint = [NSLayoutConstraint constraintWithItem:progress attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:navBar attribute:NSLayoutAttributeBottom multiplier:1 constant:-0.5];
    [self.view addConstraint:constraint];

    constraint = [NSLayoutConstraint constraintWithItem:progress attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:navBar attribute:NSLayoutAttributeLeft multiplier:1 constant:0];
    [self.view addConstraint:constraint];

    constraint = [NSLayoutConstraint constraintWithItem:progress attribute:NSLayoutAttributeRight relatedBy:NSLayoutRelationEqual toItem:navBar attribute:NSLayoutAttributeRight multiplier:1 constant:0];
    [self.view addConstraint:constraint];

    [progress setTranslatesAutoresizingMaskIntoConstraints:NO];
    progress.hidden = YES;
 }
person David H    schedule 20.11.2013
comment
не могли бы вы привести какой-нибудь конкретный пример? - person just ME; 21.11.2013
comment
Но как мне сказать моим ViewController'ам использовать этот класс как NavigationController? - person Sjakelien; 04.06.2017
comment
@Sjakelien Создайте подкласс. Затем в Interface Builder установите правильный класс в инспекторе классов. - person David H; 04.06.2017

Я создал эту простую категорию UINavigationBar для iOS 9 и более поздних версий, которая будет делать то, что вы хотите:

UINavigationBar+MH.h

#import <UIKit/UIKit.h>

@interface UINavigationBar (MH)

@property (strong, nonatomic, readonly) UIProgressView *mh_progressView;

@end

UINavigationBar+MH.m

#import "UINavigationBar+MH.h"
#import <objc/runtime.h>

@implementation UINavigationBar (MH)

- (UIProgressView *)mh_progressView{
    // find prev instance
    UIProgressView *progress = objc_getAssociatedObject(self, "mh_progressView");
    if(!progress){
        progress = [UIProgressView.alloc initWithProgressViewStyle:UIProgressViewStyleBar];
        [self addSubview:progress];
        // pin to bottom
        [progress.leadingAnchor constraintEqualToAnchor:self.leadingAnchor].active = YES;
        [progress.trailingAnchor constraintEqualToAnchor:self.trailingAnchor].active = YES;
        [progress.bottomAnchor constraintEqualToAnchor:self.bottomAnchor].active = YES;
        progress.translatesAutoresizingMaskIntoConstraints = NO;
        // remember it
        objc_setAssociatedObject(self, "mh_progressView", progress, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
    }
    return progress;
}

@end

В вашем контроллере представления в viewDidLoad или более поздней версии просто выполните:

self.navigationController.navigationBar.mh_progressView.value = 0.5;

И он будет выглядеть точно так же, как в Safari. Поскольку он находится на панели навигации, он будет отображаться, даже если пользователь перейдет на другой экран, что отлично подходит для глобальных задач, таких как загрузка или синхронизация файлов.

person malhal    schedule 05.01.2016
comment
Да из-за анкеров - person malhal; 26.05.2016
comment
Не могли бы вы предоставить этот вызов для использования в Swift. У меня есть ситуация, например, обновление представления прогресса с разных контроллеров представления, нажимая друг на друга. Может ли у кого-нибудь быть идея, пожалуйста, предоставьте образец в Swift. заранее спасибо - person Steve Gear; 04.06.2018
comment
Это отличный вопрос, я не думаю, что Swift еще имеет динамические функции. - person malhal; 04.06.2018

может поздно, но надеюсь, что это поможет другим ....

я использовал M13ProgressSuite для той же цели..

person Naveen Murthy    schedule 04.12.2014

Для iOS 6: создайте собственный UIView с индикатором выполнения и UIlabel, а затем установите его в качестве свойства titleView элемента навигации вашего контроллера представления.

Для iOS 7: добавьте UIProgressBar сразу под панелью навигации.

person Nikos M.    schedule 20.11.2013
comment
Спасибо за повтор. Я обновил свой код Не могли бы вы помочь? - person just ME; 21.11.2013