Ios 在独立UINavigationBar上应用bar度量

Ios 在独立UINavigationBar上应用bar度量,ios,iphone,uikit,Ios,Iphone,Uikit,我的应用程序有一个视图控制器,由于它可以播放自己的自定义过渡动画,因此在顶部提供了自己的独立UINavigationBar视图(而不是使用UINavigationController) 使用iPhone和旋转设备时,我希望UINavigationBar自动应用横向UIBarMetrics属性(例如,更改高度、更改背景图像、调整按钮大小等),但默认情况下,它不会。这在iOS 7上是个问题,因为即使我手动更改UINavigationBar的高度,uiBarButtonim元素也不会更改其垂直位置 是

我的应用程序有一个视图控制器,由于它可以播放自己的自定义过渡动画,因此在顶部提供了自己的独立UINavigationBar视图(而不是使用UINavigationController)

使用iPhone和旋转设备时,我希望UINavigationBar自动应用横向UIBarMetrics属性(例如,更改高度、更改背景图像、调整按钮大小等),但默认情况下,它不会。这在iOS 7上是个问题,因为即使我手动更改UINavigationBar的高度,uiBarButtonim元素也不会更改其垂直位置


是否有办法手动“告诉”UINavigationBar将特定的条形度量属性应用于自身?或者,这实际上是UINavigationController内部的实现,而不是UINavigationBar?

可以在UINavigation栏上设置的栏度量属性类似于背景图像和标题垂直位置。需要从视图控制器中设置高度和宽度

如果需要在方向更改时手动通知导航栏更改其大小,可以在视图控制器中实现方法
-(void)将InterfaceOrientation:(UIInterfaceOrientation)旋转到InterfaceOrientation duration:(NSTimeInterval)duration1
,并更改其中的大小

您可以使用的另一个选项是使用autolayout指定导航栏的宽度固定在其superview的左侧和右侧,并让它计算出应该有多宽。比如说

UINavigationBar *bar = [[UINavigationBar alloc] init];
bar.translatesAutoresizingMaskIntoConstraints = NO;
[self.view addSubview:bar];
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[bar]|"
                                                                     options:0
                                                                     metrics:nil
                                                                       views:NSDictionaryOfVariableBindings(bar)]];

[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[bar(44)]|"
                                                                  options:0
                                                                  metrics:nil
                                                                    views:NSDictionaryOfVariableBindings(bar)]];

可以在导航栏上设置的栏度量属性类似于背景图像和标题垂直位置。需要从视图控制器中设置高度和宽度

如果需要在方向更改时手动通知导航栏更改其大小,可以在视图控制器中实现方法
-(void)将InterfaceOrientation:(UIInterfaceOrientation)旋转到InterfaceOrientation duration:(NSTimeInterval)duration1
,并更改其中的大小

您可以使用的另一个选项是使用autolayout指定导航栏的宽度固定在其superview的左侧和右侧,并让它计算出应该有多宽。比如说

UINavigationBar *bar = [[UINavigationBar alloc] init];
bar.translatesAutoresizingMaskIntoConstraints = NO;
[self.view addSubview:bar];
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[bar]|"
                                                                     options:0
                                                                     metrics:nil
                                                                       views:NSDictionaryOfVariableBindings(bar)]];

[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[bar(44)]|"
                                                                  options:0
                                                                  metrics:nil
                                                                    views:NSDictionaryOfVariableBindings(bar)]];

在问了这个问题之后,经过各种测试和反复试验,我最终找到了一个解决方案,解决了我所有的问题,所以我将把它发布在我以前接受的解决方案下

当我的应用程序在iPhone上以横向显示时,我希望顶部的UINavigationBar缩小到标准认可的32点高度,就像任何使用UINavigationController类的应用程序一样。但是,由于我没有为这个特定的视图使用UINavigationController(出于各种可行性原因),所以我需要手动实现它

为了解释iOS 7中新的透明状态栏,我调整了UINavigationBar的原点和大小,使其包含状态栏的边界和正常的UINavigationBar区域(即,UINavigationBar帧原点为{0,0},高度为52点)

不幸的是,这种情况发生了:

当条形图本身以适当的位置和高度呈现时,条形图中的所有内容(包括标题和按钮)都未正确定位,高度过高,几乎接触到状态栏内容

很明显发生了什么。导航栏内容垂直对齐到它自己的中间位置,完全不考虑状态栏内容的存在

当我用普通的UINavigationController测试相同的方向时,情况并非如此,UINavigationController的UINavigationBar中的标题和按钮工作得非常好。苹果在那里做了一些不属于正常UINavigationBar实现的事情

接下来,我分离了uinavigationcontroller的视图布局层次结构,以查看其中的UINavigationBar发生了什么(主要调用大量NSLog()语句,这些语句将转储导航栏的子视图)

这就是我发现的:

从外观上看,苹果公司采用了一种相对狡猾的黑客手段来实现这一效果。事实证明,实际的UINavigationBar实际上位于状态栏的正下方(即{0,20}点),并且只有32个点的高度。然后,在UINavigationBar内负责渲染背景的私有子视图向上扩展,超出导航栏的边界,以包含状态栏后面的区域(即,其原点为{0,-20},高度为52点,位于导航栏的子视图坐标空间的局部)

因此,这样做不仅可以使内容垂直对齐,而且半透明效果仍然延伸到状态栏后面


无论如何,在我发现这一点之后,编写一个解决方案是非常简单的。我所需要做的就是重新定位和调整UINavigationBar的大小,使其恢复到我在iOS 6上的状态(即,向下20点,仅高32点),然后实现一个UINavigationBar子类,该子类覆盖layoutSubviews方法,抓取内部背景视图(对类名与“background”匹配的视图进行快速子视图检查),然后手动扩展它。

在经过各种测试和反复试验后,我终于找到了一个解决方案,解决了我所有的问题,所以我将把它发布在我以前接受的解决方案下

当我的应用程序在iPhone上以横向显示时,我希望顶部的UINavigationBar缩小到标准认可的32点高度,就像任何使用UINavigationController类的应用程序一样。但是,由于不同的原因,我没有为这个特定的视图使用UINavigationController