iOS开发——UINavigationBar中踩过的坑

作者: Originalee | 来源:发表于2016-10-08 15:09 被阅读244次

这段时间的一直在忙于编码,加上国庆假期等等时间,又有很长时间没有写过博客了。

自从升级了Xcode8,以及在做iOS10的适配工作中,我发现在NavigationBar这个控件中,有了一个小小的坑。

因为在iOS7之后,NavigationBar之后,默认有一条1px的细线,这条细线怎么去,我在这里就不赘述了,因为谷歌上以及StackOverflow上有太多的方法去除这条细线。但是我这次发现,在我升级到iOS10之后,iOS10的设备中虽然使用了以前的方法,但是还是出现了这个细线,但是iOS10以下的设备这条细线还是不存在的。

于是我自己得出了这么个结论,之前去除NavigationBar的这条细线的方法失效了(这里并不是说所有方法失效,至少我使用的方法是失效的),那么在发现自己有这个问题的时候,不妨可以来换一种方法实现隐藏NavigationBar底下的这条细线。

我把我的新方法,写成了Category,这里直接贴代码出来吧。

头文件中的方法声明


/**
 * NavigationBar底部隐藏1px的线
 */
- (void)lix_hideBottomHairline;

/**
 * NavigationBar底部显示1px的线
 */
- (void)lix_showBottomHairline;

方法的实现

- (void)lix_hideBottomHairline {
    UIImageView *navBarHairlineImageView = [self findHairlineImageViewUnder:self];
    navBarHairlineImageView.hidden = YES;
}

- (void)lix_showBottomHairline {
    // Show 1px hairline of translucent nav bar
    UIImageView *navBarHairlineImageView = [self findHairlineImageViewUnder:self];
    navBarHairlineImageView.hidden = NO;
}

- (UIImageView *)findHairlineImageViewUnder:(UIView *)view {
    if ([view isKindOfClass:UIImageView.class] && view.bounds.size.height <= 1.0) {
        return (UIImageView *)view;
    }
    for (UIView *subview in view.subviews) {
        UIImageView *imageView = [self findHairlineImageViewUnder:subview];
        if (imageView) {
            return imageView;
        }
    }
    return nil;
}

简简单单,就可以随意切换NavigationBar底部线条的隐藏和显示,这样的代码可扩展性更好。

既然讲到这里了,那就干脆把NavigationBar如何变成透明的这点也讲完好了。

有时候,我们希望形成一个透明的NavigationBar,而不是像系统一样存在一个毛玻璃的效果,所以这时候我们应该如下设置NavigationBar


- (void)lix_makeTransparent {
    [self setTranslucent:YES];
    [self setBackgroundImage:[[UIImage alloc] init] forBarMetrics:UIBarMetricsDefault];
    self.backgroundColor = [UIColor clearColor];
    self.shadowImage = [UIImage new];    // Hides the hairline
    [self lix_hideBottomHairline];
}

如果要恢复默认,则如下设置

- (void)lix_makeDefault {
    [self setTranslucent:YES];
    [self setBackgroundImage:nil forBarMetrics:UIBarMetricsDefault];
    self.backgroundColor = nil;
    self.shadowImage = nil;    // Hides the hairline
    [self lix_showBottomHairline];
}

这里就组成了整个NavigationBar的category,希望大家能在自己的项目中灵活运用。

相关文章

  • iOS开发——UINavigationBar中踩过的坑

    这段时间的一直在忙于编码,加上国庆假期等等时间,又有很长时间没有写过博客了。 自从升级了Xcode8,以及在做iO...

  • iOS开发笔记

    原文请见github上iOS开发笔记 iOS开发笔记 记录了在iOS开发中踩过的坑和一些问题解决 微信的openi...

  • iOS开发中踩过的坑

    1.证书失效 http://blog.csdn.net/chocolateloveme/article/detai...

  • iOS多线程使用踩过的坑

    iOS多线程使用踩过的坑 iOS 开发过程中,我们经常使用系统提供的方法使用多线程(全局并发)包括: 使用起来很方...

  • iOS 开发踩过的坑

    1、navigationBar的透明问题 如果仅仅把navigationBar的alpha设为0的话,那就相当于把...

  • 移动web网页开发细节

    最近在做android和ios的webview开发,踩过不少坑,略有所获,记录一下 移动web中的兼容性问题,有时...

  • iOS开发中遇到的坑

    从事iOS开发已有数年,一路走来踩过无数的坑,然而都踩过哪些坑,如今想来脑子里竟是一片空白,为什么呢?仔细想了想,...

  • iOS开发仔在 Flutter 中踩过的坑,持续踩坑中...

    本文用以记录我在用flutter中遇到的一些小bug及解决办法 功能型 设计三宝: 圆角,阴影加渐变 实际代码根据...

  • iOS开发中遇到过的坑

    iOS开发中遇到过的坑 iOS开发中遇到过的坑

  • iOS蓝牙开发,踩过的坑

    近五年做的项目都是和蓝牙有关,网上关于蓝牙开发的文章也比比皆是。此文只是记录我司在实际工作中遇到的一些特定的应用场...

网友评论

    本文标题:iOS开发——UINavigationBar中踩过的坑

    本文链接:https://www.haomeiwen.com/subject/ovvuyttx.html