昨天遇到了一个奇葩的问题,在解决后记录一下。以便之后解决同类问题和帮助他人。
在昨天写的小demo中,我声明了一个父类。没有自定义导航栏,只是想把返回按钮图片颜色改变一下。于是使用的是系统的导航栏。
之前的写法 会出问题
//之前的写法
//初始化导航栏
#define NAV_LEFTBUTTON_ICON [UIImage imageNamed:@"nav_left"]
- (void)initNavgationBar { //ios 默认translucent为yes,设置后坐标的零点在(0,0),如果想设置成(0,64)的话,添加下面一行代码 self.edgesForExtendedLayout = UIRectEdgeNone; self.automaticallyAdjustsScrollViewInsets = NO; //导航栏标题颜色和字体大小 [self.navigationController.navigationBar setTitleTextAttributes:[NSDictionary dictionaryWithObjectsAndKeys:NAV_TITLE_COLOR,NSForegroundColorAttributeName,NAV_TITLE_FONT, NSFontAttributeName,nil]]; //导航栏默认返回按钮 UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:self action:@selector(clickButtonNavLeft)]; [backButton setBackButtonBackgroundImage:[NAV_LEFTBUTTON_ICON resizableImageWithCapInsets:UIEdgeInsetsMake(0, NAV_LEFTBUTTON_ICON.size.width, 0, 0)] forState:UIControlStateNormal barMetrics:UIBarMetricsDefault]; self.navigationItem.backBarButtonItem = backButton; }
看红色部分之前是这样写的。网上的方法一般也是这样处理的。但是这样写在iOS11中会出问题。效果如图。
在这里我们会看到系统的返回按钮没有隐藏 只是去掉了文字,而且图片有拉伸。拉伸好解决,只要设置图片origin就行。
[NAV_LEFTBUTTON imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]
但是这样还是有问题就是系统返回箭头不消失。
效果就是上图这样。那么如何解决这个问题?
网上的方法比较low。只是把tintcolor改成了透明 不显示。
我开始试了试 但是在父类Controller中(继承与UIviewController,没有继承导航栏控制器)手动修改tintColor没效果。那么如何解决这个问题呢?
初始化方法一样,下面就有些不一样了。
//导航栏默认返回按钮 UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:self action:@selector(clickButtonNavLeft)]; self.navigationController.navigationBar.backIndicatorImage = [NAV_LEFTBUTTON imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]; self.navigationController.navigationBar.backIndicatorTransitionMaskImage = [NAV_LEFTBUTTON imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]; self.navigationItem.backBarButtonItem = backButton;
这就解决了这个问题。如果还有疑问,请继续联系我。