Ios 有没有一种方法可以在不使用UINavigationController的情况下更改情节提要中UINavigationBar的高度?

Ios 有没有一种方法可以在不使用UINavigationController的情况下更改情节提要中UINavigationBar的高度?,ios,objective-c,cocoa-touch,uinavigationcontroller,uinavigationbar,Ios,Objective C,Cocoa Touch,Uinavigationcontroller,Uinavigationbar,我想在我的一个视图中使用自定义的UINavigationBar,它不是任何UINavigationController-层次结构的一部分。当我将UINavigationBar拖动到情节提要中时,它显示如下: 此栏为44px,如果状态栏不共享此空间,这就足够了。因为iOS7允许我们使用整个屏幕,包括状态栏的空间,所以UINavigationBar的高度应该是64px,而不是44px 如果我将视图连接到UINavigationController的层次结构,则它将显示正确的: 我在某个地方读到如

我想在我的一个视图中使用自定义的
UINavigationBar
,它不是任何
UINavigationController
-层次结构的一部分。当我将
UINavigationBar
拖动到情节提要中时,它显示如下:

此栏为44px,如果状态栏不共享此空间,这就足够了。因为iOS7允许我们使用整个屏幕,包括状态栏的空间,所以
UINavigationBar
的高度应该是64px,而不是44px

如果我将视图连接到
UINavigationController
的层次结构,则它将显示正确的:

我在某个地方读到如果
UINavigationBar
的属性
barPosition:
设置为
uibarpositiontopassed
,则该条将为64px。但是,这是一个
只读属性

我的搜索结果只显示了一些我认为是“工作”的东西。通过在此
UIViewController
之前添加一个无用的
UINavigationController
,我可以假装有一个层次结构,它会自动添加带有64px的
UINavigationBar

真的没有办法让一个覆盖64px的“无赖”(没有导航控制器的帮助)
UINavigationBar
? 如果是这样的话,有没有合理的理由说明原因

(我不是说默认情况下,
UINavigationBar
应该是64px,但在inspector中应该有一个选项)


(我也看到有人用编程的方法来解决这个问题。即使这些答案有效,我仍然必须在设计情节提要时考虑到这一点(一个缺口)。我想知道的是,是否可以在情节提要中设置,或者说,为什么不允许设置?)

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

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

编辑:正如我在评论中所写,您可能必须将此行放入
viewDidLayoutSubviews
以避免自动布局。

您可以通过另一种方式将属性
barPosition
设置为
UIBarPositionTopAttached

  • 将代理添加到UINavigationBar
  • 在委托类中实现
    -positionForBar:

    - (UIBarPosition)positionForBar:(id<UIBarPositioning>)bar
    {
        return UIBarPositionTopAttached;
    }
    
    -(UIBAR位置)位置FORBAR:(id)bar
    {
    返回UIBarPositionTopAttached;
    }
    

  • 导航栏的顶部也必须锚定到顶部布局指南。

    我也在使用独立的UINavigationBar,我遇到了相同的问题,我发现有两种方法可以正确修复此问题

    我使用约束和父视图修复了它。我在故事板中将此UIView设置为带有{0,0,320,64}帧的UINavigationBar的父视图。可以添加一个约束或一组约束,强制UINavigationBar具有所需的大小。 如果您的父UIView在情节提要中具有正确的框架,您可以像往常一样在情节提要中布局其他视图

    现在,如果禁用了autolayout,您可以按照Lindsey的回答中所述以编程方式更改条形图高度。
    -(void)viewDidLayoutSubviews
    似乎是一个很好的选择。

    您可以使用Interface Builder中“Identity Inspector”中的“用户定义的运行时属性”将其设置为附加到视图顶部。设置
    barPosition
    属性


    以下是
    barPosition
    属性的文档:

    有一种方法可以实现这一点,而无需使用
    UINavigationController
    或以编程方式设置它。只需将导航栏上的高度约束设置为任意值,在本例中为64

    您可以通过编程方式完成相同的任务,如下所示:

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

    正如@nerdist colony所指出的,在使用Autolayout时,总是要将
    TranslatesAutoResizingMacSkinToConstraints
    设置为
    NO
    ,否则约束中可能会有冲突。

    @startupThekid:

    如果您尝试更改由UINavigationController管理的UINavigationBar的自动调整大小掩码,iOS将生成异常

    但是,您发布的目标C代码的Swift等价物是:

    var navBar = self.navigationController!.navigationBar 
    
    视图中显示():

    需要设置约束的位置:


    Therafter您应该能够根据需要修改约束的常量属性,以改变导航条高度,例如改变设备方向,我在同一条船上遇到了问题,但现在我已经修复了它。我正在尝试做正确的事情来避免显式设置框架,这对于未来的打样和对不同设备尺寸的轻松支持是可取的。在我的例子中,我希望在导航栏下面有一个webview

    我正在将视图控制器设置为
    UINavigationBarDelegate
    ,并实现
    positionForBar:
    以返回
    uibarpositiontopatted
    ,如。另一个技巧似乎是使用“自动布局”将条定位在topLayoutGuide下方

    这是我在以编程方式创建导航栏和webview后在
    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]];
    
    是的,正如我所希望的,这会在转向横向时自动移动条,而状态条会隐藏


    (我诚恳地推荐一个自动布局辅助工具,如Mashine,它可以使布局代码更加简洁,而Mashine则负责为您关闭
    TranslatesAutoResizingMackintoConstraints

    我知道这是一种非常老套的方法,但f
        [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]];
    
        [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]];