我正在尝试实现类似于在iOS 7上的新消息应用程序(Safari也是如此)中看到的效果,其中导航栏中有一个进度条:
我尝试过几种方法,并找到一种几乎可行的方法。我正在使用的是UINavigationBar
的自定义子类,它在初始化时将我的自定义进度条添加为子视图。这种方法几乎没问题,但是当我尝试向其添加NSLayoutConstraints
时应用程序崩溃。
工作代码(没有布局限制,因此不会调整方向更改):
- (void)commonInit
{
if (!self.progressIndicator) {
self.progressIndicator = [[ECourseProgressIndicatorView alloc] initWithFrame:CGRectMake(0, self.bounds.size.height - 3, self.bounds.size.width, 3)];
[self addSubview:self.progressIndicator];
}
}
代码我希望能够使用(添加了NSLayoutConstraint
),但崩溃了:
- (void)commonInit
{
if (!self.progressIndicator) {
self.progressIndicator = [[ECourseProgressIndicatorView alloc] initWithFrame:CGRectMake(0, self.bounds.size.height - 3, self.bounds.size.width, 3)];
[self addSubview:self.progressIndicator];
self.progressIndicator.translatesAutoresizingMaskIntoConstraints = NO;
[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"|-0-[progressIndicator]-0-|" options:0 metrics:nil views:@{@"progressIndicator": self.progressIndicator}]];
[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[progressIndicator(==3)]-0-|" options:0 metrics:nil views:@{@"progressIndicator": self.progressIndicator}]];
}
}
运行带有布局约束的代码时遇到的错误包含在Gist here中。如果我没有设置translatesAutoresizingMaskIntoConstraints = NO
,那么代码可以工作,但是我指定的布局约束会被忽略,以支持自动调整遮罩约束。
任何人都可以放弃任何光明吗?
P.S。我最初想到将进度条添加为UINavigationBar上方的视图(因此根本不在其层次结构中),但我找不到有关如何在导航栏上方直观地定位视图的信息(以Z坐标表示,不是Y)。
注意:我在Apple开发人员论坛中posted this,但没有得到回复。
答案 0 :(得分:5)
诀窍是将视图添加到navigationItem的titleView。将该视图的cliptobounds设置为NO,并在其中添加进度视图。
UIView *test = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 128, 33)];
[test setBackgroundColor:[UIColor redColor]];
[test setClipsToBounds:NO];
// Add the progress view
UIProgressView *progressView = [[UIProgressView alloc] initWithProgressViewStyle:UIProgressViewStyleBar];
[progressView setFrame:CGRectMake(-96, 36, 320, 2)];
[progressView setProgress:1.0];
[progressView setProgressTintColor:SYSTEM_BLUE];
[test addSubview:progressView];
self.navigationItem.titleView=test;
答案 1 :(得分:1)
只需将此视图放入UINavigationController,而不是UINavigationBar。
答案 2 :(得分:0)
您可以为导航栏设置Titleview ...只需将任何UIView设置为导航栏titleview ..然后您就可以在该UIView上设置任何子视图..
UIView *viewBar=[[UIView alloc]initWithFrame:CGRectMake(0, 0, 800, 44)];
UILabel *label=[[UILabel alloc]initWithFrame:CGRectMake(50, 0, 50, 50)];
[label setText:@"Sending"];
[viewBar addSubview:label];
self.navigationItem.titleView=viewBar;
快乐编码......