iOS 7:自定义后退指示图像位置
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS 7:自定义后退指示图像位置相关的知识,希望对你有一定的参考价值。
我无法正确设置自定义后退指示图像。指标不居中!
这是一张照片:
我正在用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,但实际上它对我不起作用。
这是因为您只是在UINavigationView中更改后退指示器的图像源,而不是帧。请参阅创建UINavigationView时,后退指示器的框架设置为保持默认ios 7后退按钮图像的大小。默认的后退按钮图像比您的大,这就是它看起来不对齐的原因。
要解决此问题,您必须重置后退指示器的框架以保持图像的大小。另一种选择是创建具有正确帧大小和图像的UIButton并分配给UIBarButtonItem。然后,您可以使用您创建的新UIBarButtonItem替换UINavigationItem中的backBarButtonItem。
UIEdgeInsets insets = UIEdgeInsetsMake(0, 0, 2, 0);
UIImage *backArrowImage = [[UIImage imageNamed:@"Back"] imageWithAlignmentRectInsets:insets];
[[UINavigationBar appearance] setBackIndicatorImage:backArrowImage];
[[UINavigationBar appearance] setBackIndicatorTransitionMaskImage:backArrowImage];
这个解决方案适用于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
}
}
}
这就是我使用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];
我找到了我见过的最简单的解决方案。只有三件事。
- 覆盖
UINavigationBar
并在你的UINavigationController
中使用它let navigationController = UINavigationController(navigationBarClass: NavigationBar.self, toolbarClass: nil) navigationController.viewControllers = [viewController]
- 设置指标图像:
backIndicatorImage = #imageLiteral(resourceName: "back") backIndicatorTransitionMaskImage = #imageLiteral(resourceName: "back")
- 在自定义
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) } } } }
就这些。 :)
我的目标是定位后退按钮图像而不干涉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))
以上是关于iOS 7:自定义后退指示图像位置的主要内容,如果未能解决你的问题,请参考以下文章
iOS 7 NavigationBar 后退按钮自定义图像没有标签