在设置半透明属性时,如何获得UinavigationController,以不更改其视图大小



我有一个应用程序,到现在为止,我一直在使用带有其属性半透明= yes的uinavigationbar的uinavigation controller。这意味着uinavigationController的内容视图(即,从您推出的视图控制器中的视图)为全屏(减去状态栏)。

但是,如果您设置了navigationbar.translucent = no,则此容器视图变短了44pt,因为我想Apple认为您在不透明的NavigationBar下不需要任何内容。

...除非您正在做我们正在做的事情,并且正在使用滚动滚动的导航栏(请参阅有关如何执行此操作的帖子),以便我想知道是否可以。

我想拥有半透明=否,但是一切都表现得好像仍然设置为"是"。我喜欢半透明的功能=是的,但是我实际上不希望uikit制作半透明。

对我有用的是添加 extendedLayoutIncludesOpaqueBars = trueviewDidLoad

类似这样的东西

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

希望它也适用于您

这不一定是一个好答案

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

您可以将其放在查看迪德载荷或ViewWillAppear中,如果您有一堆视图控制器,则可以将它们全部分类并放入子类中。

我找到了一个有效的解决方案,尽管它确实有点黑客。

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

在我的应用程序的基本视图控制器类(即myViewController:uiviewController)中,在ViewDidload方法中,我实例化了一个新的Ivar Uiview *_navigationBarbg,并给出与Self.navigationController.navigation.navigation.navigationbar。然后,我将其背景色属性设置为[Uicolor WhiteColor],尽管我想这是您实现更多色调的方式。[编辑:如果您想成为一个纯粹主义者(颜色值完全保留为来自.psd的颜色值),则可以使_navigationbarbg成为uiimageView并在那里使用自定义背景,以及您设置的实际uinavigationbar的背景(或拉伸1PX透明图像,如果您想使用典型的"使用Internet上某个地方的图像"食谱"更改导航栏")

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];

如果您忘记了这一点,这些添加的视图将在您的Navbar背景下滑动,看起来很奇怪。因此,您需要知道这是错误的来源。

我为什么要这样做?您可能会再次问...我希望能够有一个滚动导航栏,当您向下滚动表视图时,滚动滚动,从而为用户提供更多的屏幕空间。这是通过使用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
}

我正在寻找一个答案,因为我希望我的子视图在(0,0)而不是(0,44)(参考屏幕范围),但是我找不到有关如何在NavigationController中设置此的答案,我认为这将是一个属性。

我最终做的非常简单的事情是在导航栏的宽度和高度上添加一个子视图,但随后插入了导航栏下方的子视图。

现在设置是半透明=是,但是它仍然显得固体,子视图的行为是我想要的。

编辑:重新阅读了原始帖子后,我想如果您要滚动导航栏,则必须考虑到隐藏并显示新的子视图,就像您使用NAV一样bar

相关内容

最新更新