【问题标题】:Translucent UINavigationBar cannot extend to top of screen半透明 UINavigationBar 无法扩展到屏幕顶部
【发布时间】:2016-08-17 14:25:34
【问题描述】:

我想做一个微红半透明的UINavigationBar(iOS9用),发现下面的代码是必不可少的:

    navController.navigationBar.setBackgroundImage(UIImage(), forBarMetrics: .Default)
    navController.navigationBar.shadowImage = UIImage()
    navController.navigationBar.backgroundColor = UIColor(red: 1.0,green: 0.3,blue: 0.3,alpha: 0.9)
    navController.navigationBar.translucent = true

如果我只是创建了一个 UINavigationBar(而不是创建一个 UINavigationController),它可以正常工作,但是当我创建一个 UINavigationController 时它看起来像这样。

enter image description here 我发现罪魁祸首是 navController.navigationBar.setBackgroundImage(UIImage(), forBarMetrics: .Default) 行,但如果我删除它,栏看起来像这样:

enter image description here 那么我该如何解决这个问题呢? (我正在以编程方式创建 UINavigationController,对于无法嵌入图像给您带来的不便,我深表歉意)

【问题讨论】:

    标签: ios uinavigationcontroller uinavigationbar


    【解决方案1】:

    编辑:

    您需要子类化 UINavigationBar 以获得所需颜色的半透明背景。看看这个答案:

    https://stackoverflow.com/a/19043174/2082569

    在这里也添加必要的代码以供参考:

    @interface UnderlayNavigationBar : UINavigationBar
    
    @end
    
    @interface UnderlayNavigationBar ()
    {
        UIView* _underlayView;
    }
    
    - (UIView*) underlayView;
    
    @end
    

    .

    @implementation UnderlayNavigationBar
    
    - (void) didAddSubview:(UIView *)subview
    {
        [super didAddSubview:subview];
    
        if(subview != _underlayView)
        {
            UIView* underlayView = self.underlayView;
            [underlayView removeFromSuperview];
            [self insertSubview:underlayView atIndex:1];
        }
    }
    
    - (UIView*) underlayView
    {
        if(_underlayView == nil)
        {
            const CGFloat statusBarHeight = 20;    //  Make this dynamic in your own code...
            const CGSize selfSize = self.frame.size;
    
            _underlayView = [[UIView alloc] initWithFrame:CGRectMake(0, -statusBarHeight, selfSize.width, selfSize.height + statusBarHeight)];
            [_underlayView setAutoresizingMask:(UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight)];
            [_underlayView setBackgroundColor:[UIColor colorWithRed:1.0f green:0.3f blue:0.3f alpha:1.0f]];
            [_underlayView setAlpha:0.7f];
            [_underlayView setUserInteractionEnabled:NO];
        }
    
        return _underlayView;
    }
    
    @end
    

    .

    UIViewController* rootViewController = ...;
    UINavigationController* navigationController = [[UINavigationController alloc] initWithNavigationBarClass:[UnderlayNavigationBar class] toolbarClass:nil];
    [navigationController setViewControllers:@[rootViewController]];
    

    【讨论】:

    • 它仍然不适合我。它在你的设备上正常工作吗?
    • 抱歉,我在项目中使用了自定义导航栏。从关于 SO 的现有答案中获取相关部分。编辑了答案;请看一下,让我知道它是否有效。当然答案在 Objective-C 中,所以您可能需要将其转换为 swift。 :)
    猜你喜欢
    • 1970-01-01
    • 2014-11-05
    • 1970-01-01
    • 1970-01-01
    • 2011-07-29
    • 2011-10-30
    • 2018-06-18
    • 2013-11-28
    • 1970-01-01
    相关资源
    最近更新 更多