有没有办法来改变故事情节进行UINavigationBar的高度,而无需使用一个UINavigati

2019-05-13 03:00发布

我想用一个自定义的UINavigationBar在我的意见,这不是任何一个部分一个UINavigationController -hierarchy。 当我拖动一个UINavigationBar到故事板,它显示是这样的:

这间酒吧是44px,这将是不够的,如果状态栏将不会共享这个空间。 由于iOS7让我们使用整个屏幕,包括状态栏的空间, UINavigationBar应该是64PX高大,不是44px。

如果我连接视图一个UINavigationController的层次,那么就说明正确的是:

我读的地方, 如果 UINavigationBar有属性barPosition:设置为UIBarPositionTopAttached ,那么酒吧是64PX。 这一点,但是, readonly -属性。

我的搜索结果只显示我的东西考虑“变通”。 通过增加一个无用UINavigationController在此之前UIViewController ,我可以假装有一个层次,它会添加UINavigationBar与64PX自动。

难道真的没有办法有一个“流氓”(没有导航控制器的帮助下) UINavigationBar覆盖64PX? 如果是这样的话,有没有正当的理由,为什么?

(我不是说了UINavigationBar应该是默认64PX,但应在检查是一个选择它)

(我也看到有人用编程的方式回答,以解决这个问题。尽管这些答案的作品,我仍然要设计考虑到这一点(有差距故事板)。我想知道的是,如果有可能设置这故事板,或者说,为什么不是允许吗?)

Answer 1:

您可以设置该属性barPositionUIBarPositionTopAttached另一种方式!

  1. 委托添加到您的UINavigationBar的。
  2. 实施-positionForBar:在委托类:

     - (UIBarPosition)positionForBar:(id<UIBarPositioning>)bar { return UIBarPositionTopAttached; } 

您的导航栏的顶部,还必须固定在顶部布局指南。



Answer 2:

您可以以编程方式更改导航栏的高度:

[navBar setFrame:CGRectMake(0, 0, 320, 64)];

编辑:正如我在评论中写道,你可能不得不把这个线viewDidLayoutSubviews规避自动布局。



Answer 3:

你可以将其设置为连接到使用在Interface Builder“身份检查”“用户自定义属性运行”的视图的顶部。 设置barPosition财产。

下面是对文件barPosition属性: https://developer.apple.com/library/ios/documentation/uikit/reference/UIBarPositioning_Protocol/Reference/Reference.html



Answer 4:

有一种方法可以做到这一点,而不使用UINavigationController或编程方式设置它。 只要设定在这种情况下,导航栏上的高度限制,以任何你想要的,64。

您可以通过编程完成同样的事情,例如:

[self.view addConstraint:[NSLayoutConstraint constraintWithItem:navigationBar attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeHeight multiplier:1 constant:64.0f]];

编辑:

作为@ Nerdist频道菌落指出,与自动布局工作时,它一直设置translatesAutoresizingMaskIntoConstraintsNO否则可能会出现在约束冲突。



Answer 5:

我使用的是独立的UINavigationBar的也和我遇到了同样的问题,我发现有两种方式妥善解决这个。

我固定它使用约束和家长的UIView。 我在故事板作为我UINavigationBar的的具有{0,0,320,64}帧中的父视图设置此UIView的。 您可以添加一个约束或迫使UINavigationBar的具有所需大小的一组约束。 而鉴于你父母的UIView在你的故事板正确的框架,你可以在你的故事板布局像往常一样你的其他观点。

现在,如果自动布局被禁用,您可以在林赛的回答说明编程方式更改栏的高度。 -(void)viewDidLayoutSubviews似乎是一个好地方来做到这一点。



Answer 6:

如果您在使用自动布局,您可以设置UINavigationBar的的限制高度为64或事件的更多。



Answer 7:

@startupThekid:

如果你试图改变由一个UINavigationController管理的UINavigationBar的自动调整面具,iOS将产生异常。

但是,您发布的目标C代码的雨燕相当于是:

var navBar = self.navigationController!.navigationBar 

viewDidAppear():

navBar.setTranslatesAutoresizingMaskIntoConstraints = false

无论你需要设置约束:

var navBarHeightConstraint = 
      NSLayoutConstraint(item: navBar, attribute: .Height,
            relatedBy: .Equal, toItem: nil, 
            attribute: .Height, multiplier: 1, constant: height)

self.view.addConstraint(navBarHeightConstraint)

Therafter你应该能够根据需要修改的约束不变的性质改变导航栏的高度,如设备取向的变化



Answer 8:

我已经写了一篇博客文章中详细介绍了如何用最少的代码干预做到这一点。 您的栏将显示在故事板有差距,但它会正常工作的设备上。 总之,步骤如下:

1)导航栏添加到在故事板视图控制器。

2)设置在故事板导航栏的约束:
- 导航Bar.Top =顶面布置Guide.Bottom
- 导航Bar.Leading = Superview.Leading
- 导航Bar.Trailing = Superview.Trailing

3)故事板的导航栏连接到它的视图控制器作为@IBOutlet。

4)在视图控制器的类中,添加一个UINavigationBarDelegate协议到类声明。

5)在视图控制器的viewDidLoad方法中,导航条的委托设置为自我。

6)在视图控制器,添加棒定位委托的positionForBar方法。 返回表示TopAttached的UIBarPosition。 (注:UINavigationBarDelegate继承UIBarPositioningDelegate此方法。)

全文后用GIF图像是在这里:
轻松使用导航栏没有相应的导航控制器

这些步骤起作用的雨燕2.1 / 7.2的Xcode的



Answer 9:

在斯威夫特3使用的主要故事板,你可以使用约束来改变高度,使其发挥作用。 这是我发现的是容易实现的方式。

创建的约束。

它看起来像什么到底。



Answer 10:

我是在同一条船上,有问题,但现在我已经固定它。 我试图做正确的事情,以避免设定明确的框架,这是理想的适应未来发展和不同器件尺寸容易支持。 就我而言,我想要一个导航栏下方的网页流量。

我设置我的视图控制器是一个UINavigationBarDelegate和实施positionForBar:返回UIBarPositionTopAttached ,像user3269713的答案 。 这似乎是另一个诀窍是使用自动布局来定位topLayoutGuide楼下酒吧。

我使用的代码viewDidLoad创建的导航栏和网页流量编程后,我仍然看到了吧停留在高度44,但不能马上明白为什么:

    [navigationBar sizeToFit];
    navigationBar.delegate = self;
    [self.view addSubview:navigationBar];
    [self.view addSubview:webView];
    id guide = self.topLayoutGuide;
    NSDictionary *viewNamesDict = NSDictionaryOfVariableBindings(webView, navigationBar, guide);
    [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[webView]|" options:0 metrics:nil views:viewNamesDict]];
    [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[guide][navigationBar][webView]|" options:0 metrics:nil views:viewNamesDict]];

但我做了一些更多的思考,并与自动布局玩耍,而且事实证明它,仅仅是我的问题的原因。 我试图依靠其自动尺寸面具导航栏的翻译限制,但事实证明,我需要给他们明确的定义。 这是我的新viewDidLoad的作品代码:

    [navigationBar sizeToFit];
    navigationBar.delegate = self;
    navigationBar.translatesAutoresizingMaskIntoConstraints = NO;
    [self.view addSubview:navigationBar];
    [self.view addSubview:webView];
    id guide = self.topLayoutGuide;
    NSDictionary *viewNamesDict = NSDictionaryOfVariableBindings(webView, navigationBar, guide);
    [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[navigationBar]|" options:0 metrics:nil views:viewNamesDict]];
    [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[webView]|" options:0 metrics:nil views:viewNamesDict]];
    NSString *verticalLayoutVisualExpression = [NSString stringWithFormat:@"V:|[guide][navigationBar(%f)][webView]|", navigationBar.frame.size.height];
    [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:verticalLayoutVisualExpression options:0 metrics:nil views:viewNamesDict]];

是的,正如我所希望的,这种自动转向景观和状态栏皮时移动了吧。

(我衷心建议像砌筑自动布局助手,这使得布局代码更简洁,并砌体为一体,需要关闭的照顾translatesAutoresizingMaskIntoConstraints你)



Answer 11:

我知道这是这样做的一个非常哈克的方式,但对我来说它的工作。 我有一个NavigationViewController ,我想加载具有一个视图控制器模态UINavigationBar在用做和取消按钮上。 这是什么样子:

正如你可以看到有那个我想成为的颜色相同的情况顶部的白色带UINavigationBar 。 代替改变的高度的UINavigationBar编程,我只是做了一个新的观点,并设置其背景颜色等于的UINavigationBar (HEX = F8F8F8,RGBA = 248,248,248,1.0)。 同样,我知道这是超级哈克,但它会为我做这项工作。 下面是它看起来像现在



文章来源: Is there a way to change the height of a UINavigationBar in Storyboard without using a UINavigationController?