有一个页面要实现透明NavigationBar,实现了以后发现一个奇怪的问题:第一次进入此页面显示透明NavigationBar正常,返回上一级页面再从新进入,NavigationBar的底部出现了一条大约1px的横线,怎么都消除不了。ios
用Reveal查了一下这个横线,是一个UIImageView,0.5px高度,第一次正常显示的时候center y坐标为63.75,因此显示正常;返回上一级页面时再从新进入,center y坐标为64.25,正好出如今NavigationBar的下面而没有被它覆盖。git
猜想是由于要实现透明NavigationBar在其中加了一个64px高度的OverLay View影响了这条横线的位置。最后在这篇文章中找到了解决方法:github
First – declare instance variable:app
@implementation MyViewController { UIImageView *navBarHairlineImageView;}
Then, in viewDidLoad
do:ide
navBarHairlineImageView = [self findHairlineImageViewUnder:navigationBar];
Method which finds the image view we need:ui
- (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;}
And this will do the rest of magic:this
- (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; navBarHairlineImageView.hidden = YES;}- (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; navBarHairlineImageView.hidden = NO;}
Same method should also work for UISearchBar
hairline..net
另外一种隐藏横线的方法:rest
[[UINavigationBar appearance] setBackgroundImage:[[UIImage alloc] init] forBarPosition:UIBarPositionAny barMetrics:UIBarMetricsDefault]; [[UINavigationBar appearance] setShadowImage:[[UIImage alloc] init]];
参考:code
http://stackoverflow.com/questions/19226965/how-to-hide-ios7-uinavigationbar-1px-bottom-line/19227158#19227158
https://github.com/samwize/UINavigationBar-Addition/blob/master/Library/UINavigationBar%2BAddition.m
http://jslim.net/blog/2014/02/28/remove-the-1px-shadow-from-uinavigationbar/