在导航栏下添加进度条

时间:2013-11-20 15:49:30

标签: ios uinavigationbar uiprogressview

我是iOS开发的新手。

我想知道,如果在iOS 7中发送UINavigationBar下的消息,其标题名为:发送,则会有一个正在加载的进度条,直到消息成功发送。

我的问题是:

  1. 该栏是进度条吗?

  2. 在iOS 6中,进度条位于UINavigationBar内?

  3. 有人可以给我一些关于如何在iOS 7和iOS6上创建它的想法吗?

    我还没有尝试过任何事情。我想阅读一些有关此类问题的教程或示例。

    这是我的代码:

    int progress = 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];
    

    不幸的是,进度条不在navigationController下。为什么呢?

4 个答案:

答案 0 :(得分:12)

我在我的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;
 }

答案 1 :(得分:4)

我已经为iOS 9及更高版本创建了这个简单的UINavigationBar类别,它可以满足您的需求:

<强> 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中一样。因为它在导航栏上,即使用户导航到不同的屏幕,它也会继续出现,因此非常适合文件上传或同步等全局任务。

答案 2 :(得分:3)

可能会迟到但希望它会帮助别人....

我使用M13ProgressSuite用于同样的目的..

答案 3 :(得分:1)

对于iOS 6:使用进度条和UIlabel创建自定义UIView,然后将其设置为视图控制器导航项的titleView属性。

对于iOS 7:在导航项目导航栏下方添加UIProgressBar。