2

我正在尝试实现类似于 iOS 7 上的新消息应用程序(也是 Safari)中看到的效果,导航栏本身有一个进度条:

iOS 7 导航栏中的进度条

我尝试了几种方法,并找到了一种几乎可行的方法。我正在使用的是一个自定义子类,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添加了 s),但崩溃了:

- (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,那么代码可以工作,但我指定的布局约束被忽略,有利于自动调整掩码约束。

任何人都可以解释一下吗?

PS我最初确实考虑将进度条添加为 UINavigationBar 上方的视图(因此根本不在其层次结构中),但我找不到有关如何在导航栏上方视觉定位视图的信息(以 Z 坐标术语,而不是 Y)。

注意:我在 Apple 开发者论坛上发布了这个,但没有得到回复。

4

3 回答 3

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;
于 2014-04-08T16:15:04.767 回答
1

只需将此视图放入 NavigationController,而不是 NavigarionBar。

于 2013-09-22T15:59:59.690 回答
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;

快乐的编码......

于 2013-08-30T10:54:24.963 回答