在UINavigationController的UINavigationBar内部或顶部显示UIProgressView

h34*_*4cr 16 uinavigationbar uitableview uinavigationcontroller uiprogressview ios

我想要一个UIProgressView来显示导航栏底部的进度(就像在iOS 7中发送iMessage或短信一样).但是我在导航控制器的每个表视图视图中都需要这一点.所以对我来说很清楚:我必须将它添加到UINavigationController中.但问题是,不可能将UIProgressView添加到UINavigationController.所以我尝试了两件事:

我尝试以编程方式将其添加到UINavigationController的视图中.但问题是定位UIProgressView并在更改设备旋转时使其看起来很好.

我尝试的第二件事是将UIProgressView添加到每个UITableView,但是我真的必须为每个视图执行此操作.它也不好看,因为它不在导航栏的顶部,而是在它下面.但是我不喜欢第二种解决方案的主要原因是因为ProgressViews带有他们的TableView,所以你没有静态的,而是改变它们.

在此之后,我不知道这样做,所以我问你......有没有人知道如何做到这一点?

它应该是这样的: 在此输入图像描述

Dav*_*d H 12

我重新设计了原始海报的答案,以便该栏实际上就在导航栏内.有趣的是,当它显示时,它与一个像素底线重叠(实际上取代它),所以当你将进度条设置为隐藏时,进度条淡出并且分隔线淡入.关键部分此解决方案是将进度条添加到导航控制器的视图,而不是导航栏.

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

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

#if 1
    [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[navBar]-0-[progress]"
                                                                        options:NSLayoutFormatDirectionLeadingToTrailing
                                                                        metrics:nil
                                                                          views:NSDictionaryOfVariableBindings(progress, navBar)]];

    [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[progress]|"
                                                                        options:NSLayoutFormatDirectionLeadingToTrailing
                                                                        metrics:nil
                                                                            views:NSDictionaryOfVariableBindings(progress)]];
#else
    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];

#endif
    [progress setTranslatesAutoresizingMaskIntoConstraints:NO];
    [progress setProgress:0.5 animated:NO];
}
Run Code Online (Sandbox Code Playgroud)

我不确定为什么有必要在NSLayoutContstraints代码中添加0.5偏移量来获得相同的匹配,但事实确实如此.我使用的不是视觉格式,而是你的选择.请注意,与底部相反,这也使其无缝旋转.


h34*_*4cr 11

我终于找到了解决方案:

我制作了一个自定义的UINavigationController并将其添加到 viewDidLoad

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

    progress = [[UIProgressView alloc] init];

    [[self view] addSubview:progress];

    UIView *navBar = [self navigationBar];


    [[self view] addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[navBar]-[progress(2@20)]"
                                                                        options:NSLayoutFormatDirectionLeadingToTrailing
                                                                        metrics:nil
                                                                          views:NSDictionaryOfVariableBindings(progress, navBar)]];

    [[self view] addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[progress]|"
                                                                        options:NSLayoutFormatDirectionLeadingToTrailing
                                                                        metrics:nil
                                                                          views:NSDictionaryOfVariableBindings(progress)]];

    [progress setTranslatesAutoresizingMaskIntoConstraints:NO];

    [progress setProgress:0 animated:NO];
}
Run Code Online (Sandbox Code Playgroud)

我创建了一个新的UIProgressView(我在声明中@interface)添加了约束来将它定位在导航栏下面(这一步很重要:)设置translatesAutoresizingMaskIntoConstraintsNO.

  • 再一次,很好的答案 - 没有看到其他人发现将导航栏添加到导航控制器的视图就是诀窍!大! (2认同)