在设置半透明属性时,如何让UINavigationController不更改其视图大小?

时间:2012-11-05 15:43:54

标签: ios uinavigationcontroller uinavigationbar

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

但是,如果你设置navigationBar.translucent = NO,这个容器视图会缩短44pt,因为我认为Apple认为你不需要在不透明的navigationBar下的任何内容。

...除非你正在做我们正在做的事情并使用一个滚动的导航栏(见This Post on how to do that)所以我想知道这是否可行。

我希望半透明= NO,但是一切都表现得好像仍然设置为YES。我喜欢半透明= YES的功能,但我实际上并不希望UIKit将条形图变成半透明。

4 个答案:

答案 0 :(得分:15)

对我有用的是添加 extendedLayoutIncludesOpaqueBars = trueviewDidLoad

类似这样的事情

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,但它仍然显示为实心,子视图的行为与我想要的一样。

编辑:在重新阅读原始帖子之后,我想如果您要打开导航栏,则必须考虑隐藏并显示新的子视图,因为您对导航进行了同样的操作杆