iOS 7:自定义后退指示图像位置

我无法正确设置自定义背光指示图片。 指标不居中!

这是一张照片:

屏幕截图显示非居中自定义返回指示器图像

我在didFinishLaunchingWithOptions:设置指标图像didFinishLaunchingWithOptions:方法…

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { UIImage *image = [UIImage imageNamed:@"Back"]; [UINavigationBar appearance].backIndicatorImage = image; [UINavigationBar appearance].backIndicatorTransitionMaskImage = image; return YES; } 

我怎么能中心呢?

PS我已经阅读这个自定义的背景指标图像在iOS 7中不垂直居中 ,但实际上它不适合我。

发生这种情况是因为您只是在UINavigationView中更改后端指示器的图像源,而不是帧。 请参阅创buildUINavigationView时,后方指示器的框架设置为保留默认iOS 7后退button图像的大小。 默认的后退button图像比你的大,这就是为什么看起来不alignment。

要解决这个问题,你必须重置后方指示器的框架来保存图像的大小。 另一个select是创build一个具有正确的框架大小和图像的UIButton,并分配给一个UIBarButtonItem。 然后,您可以用您创build的新UIBarButtonItemreplace您的UINavigationItem中的backBarButtonItem。

  UIEdgeInsets insets = UIEdgeInsetsMake(0, 0, 2, 0); UIImage *backArrowImage = [[UIImage imageNamed:@"Back"] imageWithAlignmentRectInsets:insets]; [[UINavigationBar appearance] setBackIndicatorImage:backArrowImage]; [[UINavigationBar appearance] setBackIndicatorTransitionMaskImage:backArrowImage]; 

这是我如何处理使用外观API的问题,并且工作得很好。 当改变backButtonBackgroundImage图像自动延伸barButtonItem,所以我们必须调整它resizeImageWithCapInsets回到原来的 。 为了将其放置在barButtonItem中,我们使用imageWithAlignmentRectInsets在它周围添加大写字母。 然后使用setBackButtonBackgroundImage:forState:barMetrics来分配它。

只要玩数字,你会find正确的位置。

 int imageSize = 24; UIImage *barBackBtnImg = [[[UIImage imageNamed:@"backButton"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, imageSize, 0, 0)] imageWithAlignmentRectInsets:UIEdgeInsetsMake(0, -10, 0, -10)]; [[UIBarButtonItem appearance] setBackButtonBackgroundImage:barBackBtnImg forState:UIControlStateNormal barMetrics:UIBarMetricsDefault]; 

我find了我见过的最简单的解决scheme。 只是三件事。

  1. 重写UINavigationBar并在你的UINavigationController使用它

     let navigationController = UINavigationController(navigationBarClass: NavigationBar.self, toolbarClass: nil) navigationController.viewControllers = [viewController] 
  2. 设置您的指标图像:

     backIndicatorImage = #imageLiteral(resourceName: "back") backIndicatorTransitionMaskImage = #imageLiteral(resourceName: "back") 
  3. 在自定义的UINavigationBar类中实现layoutSubviews

     override func layoutSubviews() { super.layoutSubviews() subviews.forEach { (view) in if let imageView = view as? UIImageView { if imageView.image == backIndicatorImage || imageView.image == backIndicatorTransitionMaskImage { view.frame.origin.y = floor((frame.height - view.frame.height) / 2.0) } } } } 

就这些。 🙂

这个解决scheme在Swift 2.1中为我工作。 iOS 9.2.1。 (XCode 7.2)在肖像模式的iPhone上。 我已经在模拟器iPhone 5和6+上testing了它,并且它也工作。

 import UIKit class EVEMainNaviVC: UINavigationController { override func viewWillAppear(animated: Bool) { super.viewWillAppear(animated) } override func viewDidLoad() { super.viewDidLoad() self.view.backgroundColor = APP_BACKGROUND_COLOR self.setupAppNaviagtionBar() } private func setupAppNaviagtionBar() { dispatch_async(dispatch_get_main_queue()) { () -> Void in self.navigationBar.setHeight(55.0) self.navigationBar.translucent = false self.navigationBar.alpha = 1.0 self.navigationBar.barTintColor = UIColor.whiteColor() let newBackButtonImageInset = UIEdgeInsetsMake(0, 0, -6, 0) let newBackButtonImage = UIImage(named: "back")?.imageWithAlignmentRectInsets(newBackButtonImageInset) self.navigationBar.backIndicatorImage = newBackButtonImage self.navigationBar.backIndicatorTransitionMaskImage = newBackButtonImage self.navigationBar.tintColor = CUSTOM_BUTTON_COLOR } } }