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。 只是三件事。
-
重写
UINavigationBar
并在你的UINavigationController
使用它let navigationController = UINavigationController(navigationBarClass: NavigationBar.self, toolbarClass: nil) navigationController.viewControllers = [viewController]
-
设置您的指标图像:
backIndicatorImage = #imageLiteral(resourceName: "back") backIndicatorTransitionMaskImage = #imageLiteral(resourceName: "back")
-
在自定义的
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 } } }