9

我有一个应用程序,到目前为止,我一直在使用 UINavigationController 和 UINavigationBar,它的属性为 translucent = YES。这意味着 UINavigationController 的内容视图(即来自您推送的视图控制器的视图)是全屏的(减去状态栏)。

然而,如果你设置 navigationBar.translucent = NO,这个容器视图会变短 44pt,因为我想 Apple 已经假设你在不透明的 navigationBar 下不需要任何内容​​。

...除非您正在做我们正在做的事情并且正在使用滚动的导航栏(请参阅这篇文章了解如何做到这一点)所以我想知道这是否可能。

我想要半透明 = NO,但让一切都表现得好像它仍然设置为 YES。我喜欢 translucent = YES 的功能,但我实际上并不希望 UIKit 将栏变成半透明。

4

4 回答 4

19

对我有用的是 extendedLayoutIncludesOpaqueBars = true 添加 viewDidLoad

像这样的东西

override func viewDidLoad() {
   super.viewDidLoad()
   extendedLayoutIncludesOpaqueBars = true
}

希望它也对你有用

于 2015-05-11T11:29:06.140 回答
1

It's not necessarily a good answer but you could just offset your view that high if you're not translucent.

//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);
}

You could put that in your viewDidLoad or viewWillAppear and if you have a bunch of view controllers you can just subclass them all and put your logic in the subclass.

于 2012-11-05T19:58:57.337 回答
0

我找到了一个可行的解决方案,尽管它确实有点像 hack。

这个想法是给半透明的导航栏一个不透明的支持。不幸的是,我对解决方案不满意,因为它很脏,没有封装并引入了一些潜在的问题,但我很高兴,因为它完成了工作。

在我的应用程序的基本视图控制器类(即 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 belowSubview: _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
}
于 2012-11-07T15:36:27.407 回答
0

我正在寻找这个问题的答案,因为我希望我的子视图位于 (0,0) 而不是 (0,44)(参考屏幕边界),但我找不到关于如何设置它的答案NavigationController,我认为这将是一个包含的属性。

我最终做的事情非常简单,就是在导航控制器中添加一个子视图,即导航栏的宽度和高度,然后在导航栏下方插入子视图。

现在设置为 Translucent = YES,但它仍然显示为实心,并且子视图的行为符合我的要求。

编辑:重新阅读您的原始帖子后,我想如果您要滚动导航栏,您必须考虑隐藏和显示新的子视图,因为您对导航栏执行相同操作

于 2013-01-21T16:15:05.430 回答