我是iOS开发的新手。
我想知道,如果在iOS 7中发送UINavigationBar
下的消息,其标题名为:发送,则会有一个正在加载的进度条,直到消息成功发送。
我的问题是:
该栏是进度条吗?
在iOS 6中,进度条位于UINavigationBar
内?
有人可以给我一些关于如何在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下。为什么呢?
答案 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。