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

时间:2014-08-11 18:53:48

标签: ios ios7 uinavigationbar

我无法正确设置自定义后退指示图像。指标不居中!

这是一张照片:

Screenshot showing non-centered custom back indicator image

我在didFinishLaunchingWithOptions:方法设置指标图片...

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

   UIImage *image = [UIImage imageNamed:@"Back"];
   [UINavigationBar appearance].backIndicatorImage = image;
   [UINavigationBar appearance].backIndicatorTransitionMaskImage = image;

   return YES;
}

我该如何居中?

p.s我已经读过这个Custom back indicator image in iOS 7 not vertically centered,但实际上它并没有为我工作。

6 个答案:

答案 0 :(得分:12)

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

 [[UINavigationBar appearance] setBackIndicatorImage:backArrowImage];
 [[UINavigationBar appearance] setBackIndicatorTransitionMaskImage:backArrowImage];

答案 1 :(得分:9)

之所以发生这种情况,是因为您只是在UINavigationView中更改后退指示器的图像源,而不是框架。 请参阅创建UINavigationView时,后退指示器的框架设置为保持默认iOS 7后退按钮图像的大小。默认的后退按钮图像比你的大,这就是它看起来没有对齐的原因。

要解决此问题,您必须重置后退指示器的框架以保持图像的大小。另一种选择是创建具有正确帧大小和图像的UIButton并分配给UIBarButtonItem。然后,您可以使用您创建的新UIBarButtonItem替换UINavigationItem中的backBarButtonItem。

答案 2 :(得分:1)

此解决方案适用于Swift 2.1。 iOS 9.2.1。 (XCode 7.2)在iPhone上以纵向模式显示。我已经在iPhone 5和6+模拟器上进行了测试,它也有效。

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
    }
}
}

答案 3 :(得分:1)

这就是我使用Appearance API处理问题的方法,并且效果很好。 当更改backButtonBackgroundImage图像时,会自动在barButtonItem上拉伸图像,因此我们必须使用 resizableImageWithCapInsets:将其重新调整为原始图像。 要将它放在barButtonItem中,我们然后使用 imageWithAlignmentRectInsets 在它周围添加大写字母。然后使用 setBackButtonBackgroundImage:forState:barMetrics 分配它。

只需使用数字,您就会找到合适的位置。

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];

答案 4 :(得分:0)

我找到了我见过的最简单的解决方案。只有三件事。

  1. 覆盖UINavigationBar并在UINavigationController

    中使用它
    let navigationController = UINavigationController(navigationBarClass: NavigationBar.self, toolbarClass: nil)
    navigationController.viewControllers = [viewController]
    
  2. 设置指标图片:

    backIndicatorImage = #imageLiteral(resourceName: "back")
    backIndicatorTransitionMaskImage = #imageLiteral(resourceName: "back")
    
  3. 在自定义layoutSubviews课程中实施UINavigationBar

    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)
                }
            }
        }
    }
    
  4. 就是这样。 :)

答案 5 :(得分:0)

我的目标是放置后退按钮图像而不干扰UINavigationItem的子视图。因此,我要做的是为UIImage创建扩展名,以在图像周围添加填充。

extension UIImage {
    public func imageWith(padding: UIEdgeInsets) -> UIImage {
        let origin = CGPoint(x: padding.left, y: padding.top)
        let sizeWithPadding = CGSize(width: padding.left + size.width + padding.right, height: padding.top + size.height + padding.bottom)

        UIGraphicsBeginImageContextWithOptions(sizeWithPadding, false, 0.0)
        draw(in: CGRect(origin: origin, size: size))

        let imageWithPadding = UIGraphicsGetImageFromCurrentImageContext() ?? self
        UIGraphicsEndImageContext()

        return imageWithPadding
    }
}

例如:如果要将图像移到顶部,则在底部添加相应的填充。 .imageWith(padding: UIEdgeInsets(top: 0, left: 0, bottom: 2, right: 0))