我有一个应用程序到目前为止我一直在使用UINavigationController和UINavigationBar,其属性为translucent = YES。这意味着UINavigationController的内容视图(即您推送的视图控制器中的视图)是全屏(减去状态栏)。
但是,如果你设置navigationBar.translucent = NO,这个容器视图会缩短44pt,因为我认为Apple认为你不需要在不透明的navigationBar下的任何内容。
...除非你正在做我们正在做的事情并使用一个滚动的导航栏(见This Post on how to do that)所以我想知道这是否可行。
我希望半透明= NO,但是一切都表现得好像仍然设置为YES。我喜欢半透明= YES的功能,但我实际上并不希望UIKit将条形图变成半透明。
答案 0 :(得分:15)
对我有用的是添加
extendedLayoutIncludesOpaqueBars = true
在
viewDidLoad
类似这样的事情
override func viewDidLoad() {
super.viewDidLoad()
extendedLayoutIncludesOpaqueBars = true
}
希望它也适合你
答案 1 :(得分:1)
这不一定是一个好的答案,但如果你不是半透明的话,你可以把你的观点偏高。
//This won't take into account orientation and probably other details
if(!self.navigationController.navigationBar.isTranslucent)
{
self.view.frame = CGRectMake(0,0,-44,self.view.bounds.size.height);
}
您可以将它放在viewDidLoad或viewWillAppear中,如果您有一堆视图控制器,您可以将它们全部子类化并将您的逻辑放在子类中。
答案 2 :(得分:0)
我找到了一个有效的解决方案,虽然它确实有点像黑客。
这个想法是为半透明导航栏提供不透明的支持。不幸的是,我对解决方案不满意,因为它很脏而且没有封装并引入了一些潜在的问题,但我很高兴,因为它完成了工作。
在我的应用程序的基本视图控制器类(即MyViewController:UIViewController)中,在viewDidLoad方法中,我实例化一个新的ivar UIView * _navigationBarBG,并为它提供与self.navigationController.navigationBar相同的框架。然后我将它的backgroundColor属性设置为[UIColor whiteColor],虽然这是你如何实现更多的色调我猜。 [编辑:如果你想成为一个纯粹主义者(颜色值完全保留来自.psd),你可以使_navigationBarBG成为UIImageView并在那里使用你的自定义背景,并设置你绘制的实际UINavigationBar的背景(或者,如果你想使用典型的'使用互联网上某处的图像配方改变你的导航栏,则拉伸1px透明图像)]
if(self.navigationController)
{
_navigationBarBG = [[UIView alloc] initWithFrame: self.navigationController.navigationBar.frame];
_navigationBarBG.backgroundColor = [UIColor whiteColor];
[self.view addSubview:_navigationBarBG];
}
然后,(这是一个糟糕的部分,但我没有看到任何其他方式),我将此视图添加为子视图。但是,每当你通常打电话给[self.view addSubview:anyView]时,你必须确保你调用[self.view insertSubview:anyView underSubview:_navigationBarBG];
if (_navigationBarBG)
[self.view insertSubview: anyView belowSubview:_navigationBarBG];
else
[self.view addSubview: anyView];
如果您忘记了,这些添加的视图将在您的导航栏背景下滑动并且看起来很奇怪。所以你需要知道这是一个错误来源。
为什么我这样做?您可能会再次询问...我希望能够有一个滚动导航栏,当您向下滚动表格视图时滚动导航栏,从而为用户提供更多的屏幕空间。这是通过使用scrollView委托(scrollViewDidScroll :)和viewWillAppear来完成的:
// FIRST DEAL WITH SCROLLING NAVIGATION BAR
CALayer *layer = self.navigationController.navigationBar.layer;
CGFloat contentOffsetY = scrollView.contentOffset.y;
CGPoint newPosition;
if (contentOffsetY > _scrollViewContentOffsetYThreshold && self.scrollingNavigationBarEnabled) {
newPosition = CGPointMake(layer.position.x,
22 - MIN((contentOffsetY - _scrollViewContentOffsetYThreshold), 48.0)); // my nav bar BG image is 48.0 tall
layer.position = newPosition;
[_navigationBarBG setCenter: newPosition]; // if it's nil, nothing happens
}
else
{
newPosition = kNavBarDefaultPosition; // i.e. CGPointMake(160, 22) -- portrait only
layer.position = newPosition;
[_navigationBarBG setCenter: newPosition]; // if it's nil, nothing happens
}
答案 3 :(得分:0)
我正在寻找答案,因为我希望我的子视图位于(0,0)而不是(0,44)(参考屏幕边界),但我找不到如何解答的答案在NavigationController中设置它,我认为它是一个包含的属性。
我最终做的非常简单,就是在导航控制器中添加子视图,导航栏的宽度和高度,然后将子视图插入导航栏下方。
现在设置为Translucent = YES,但它仍然显示为实心,子视图的行为与我想要的一样。
编辑:在重新阅读原始帖子之后,我想如果您要打开导航栏,则必须考虑隐藏并显示新的子视图,因为您对导航进行了同样的操作杆