前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >iOS开发——UINavigationBar中踩过的坑

iOS开发——UINavigationBar中踩过的坑

作者头像
Originalee
发布2018-08-30 10:43:15
8680
发布2018-08-30 10:43:15
举报
文章被收录于专栏:编程之旅编程之旅

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

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

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

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

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

头文件中的方法声明

代码语言:javascript
复制
/**
 * NavigationBar底部隐藏1px的线
 */
- (void)lix_hideBottomHairline;

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

方法的实现

代码语言:javascript
复制
- (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

代码语言:javascript
复制
- (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];
}

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

代码语言:javascript
复制
- (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,希望大家能在自己的项目中灵活运用。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016.10.08 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档