2014-03-31 159 views
30

我使用此代码将自定义图像用作整个应用程序中的后退按钮。如何在iOS7中正确定位后退按钮

[[UINavigationBar appearance] setBackIndicatorImage:[UIImage imageNamed:@"back"]]; 
[[UINavigationBar appearance] setBackIndicatorTransitionMaskImage:[UIImage imageNamed:@"back"]]; 

所述的图像尺寸为30×30

的代码添加图像作为后退按钮但位置不正确的,因为可以在以下图像中看到:

back button not correct positioned

关于如何正确定位图像而不修改其尺寸(至少是图像的视觉部分(圆形+箭头))的任何想法?

编辑:

我不想使用自定义的返回按钮,因为这迫使我禁用iOS7

+0

你应该考虑 “的UIImage *后退按钮= [[UIImage的imageNamed:@” blueButton“] resizableImageWithCapInsets:UIEdgeInsetsMake(12,12,12, 12)];”然后将此图像设置为后退按钮。 – Pawan

+2

如果我这样做,“ios7-back-gesture”不起作用 – Bernat

+0

你在这里提供了什么插图“UIEdgeInsetsMake(12,12,12,12)”。您需要根据您的要求进行更改。请按照此[参考链接](http://iosdevelopertips.com/user-interface/ios-5-customize-uinavigationbar-and-uibarbuttonitem-with-appearance-api.html) – Pawan

回答

6

轻扫/后退手势请看下面的编辑!

我不久前在iOS7中创建了一个自定义后退按钮。我的箭头和单词背靠它。我认为帕万的建议是一个好的开始。要创建自定义映像后退按钮就可以使用,

UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:@"Back" style:UIBarButtonItemStylePlain target:self action:@selector(backButtonClicked)]; 
[backButton setBackgroundImage:finalImage forState:UIControlStateNormal barMetrics:UIBarMetricsDefault]; 
[backButton setTitlePositionAdjustment:UIOffsetMake(-20, 0) forBarMetrics:UIBarMetricsDefault]; 

self.navigationItem.leftBarButtonItem = backButton; 

我的形象finalImage是两个不同图像的合成,但是你可以用你的“回”的形象。但我认为这是问题所在。我的图像是一个复合图像,您可能也想制作复合图像,但在背部图标上方放置一个清晰的空间。我在我的图标右侧放置了一个清晰的空间来调整它的间距。下面是代码,

UIImage *arrow = [UIImage imageNamed:@"back.png"]; 
UIImage *wordSpace = [UIImage imageNamed:@"whiteSpace.png"]; 
CGSize size = CGSizeMake(arrow.size.width + wordSpace.size.width, arrow.size.height); 
UIGraphicsBeginImageContext(size); 
[arrow drawInRect:CGRectMake(0, 0, arrow.size.width, size.height)]; 
[wordSpace drawInRect:CGRectMake(arrow.size.width, 0, wordSpace.size.width, wordSpace.size.height)]; 
UIImage *finalImage = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

的图像wordSpace是一个明确的PNG,我在Photoshop做,所以我的新的后退按钮图像不拉伸。您可能想要在顶部放置一个清晰的png,将图标向下推一点。使用photoshop中的大小,高度为你认为的调整应该是什么。你可能需要付出一点努力。并确保更改CGSize,使其适合您的图标和清晰的空间。

我的背单词是有点过了,所以我看着

[backButton setTitlePositionAdjustment:UIOffsetMake(-20, 0) forBarMetrics:UIBarMetricsDefault]; 

我不得不玩的是线位,使它看起来尽可能好,但它终于给了我什么,我想与-20。我甚至调整了我的第二个变量0,这实际上移动了图标。 -5将图标向下放到远处,但是它从清晰的PNG中选择另一个选项。

现在要处理的事实,你希望它是一个实际的后退按钮。看看我发布的第一行代码。按钮上的动作是@selector(backButtonClicked)。所以你所要做的就是制定这个方法,你应该很好去!

- (void)backButtonClicked 
{ 
    NSLog(@"going back"); 
    [self.navigationController popViewControllerAnimated:YES]; 
} 

希望这会有所帮助。

enter image description here

编辑*****

我玩弄我的代码一点点,找到了一个更好的办法来移动回图标。我只是用了一个轮子,因为我没有和你一样的轮子,但它的工作原理是一样的。

既然你真的不希望你可以用这个代码创建按钮标题,

UIImage *image = [UIImage imageNamed:@"781-ships-wheel.png"]; 

UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithImage:image style:UIBarButtonItemStylePlain target:self action:@selector(backButtonClicked)]; 

只要改变781东西你图标的名称。然后你可以用下面的方式移动它,

[backButton setImageInsets:UIEdgeInsetsMake(20, 0, -20, 0)]; 

看看这张图片。

pic one

这显示图标下来很大,但是我想告诉你的想法。边缘插图的编号是“顶”,“左”,“底”和“右”。如果您不需要这样移动它,请勿触摸左侧和右侧,更改顶部和底部。不过要注意的是,如果你需要像我一样将它向下移动20点,(太多),你需要抵消底部的负值,否则图标会被压缩。这就是所有零的情况。

pic with zeros

所以你几乎可以将它无论你想去的地方,但你仍然要建立@selector(backButtonClicked),使它象真正的后退按钮的工作。

+0

嗨@Douglas,如果我愿意禁用iOS7中的背部手势(我不是),那么您的答案将起作用。那就是问题所在! – Bernat

+0

我不明白,这仍然允许背部手势。你只是用自己的图标替换通用的后退箭头和单词。但是这样做可以将新图标的动作转到后面的手势。 – Douglas

+0

手势!=动作// http://youtu.be/H8w1NCkBhV4?t=25s – Bernat

2

你可以试试这个

self.navigationItem.leftBarButtonItem.imageInsets = UIEdgeInsetsMake(0, 0, 10, 0); 
+3

这留下了箭头(图片)在同一个地方,不为我工作 – Bernat

20

编辑
我想我可能已经找到了窍门(iOS中7的设计资源 - UIKit的用户界面目录)
栏按钮项目

请注意,条形图按钮图像将自动呈现为导航栏中的模板图像,unl您可以明确地将其渲染模式设置为UIImageRenderingModeAlwaysOriginal。有关更多信息,请参阅模板图像。

模板图像他们有一些代码来指定UIImageRenderingMode。

UIImage *myImage = [UIImage imageNamed:@"back"]; 
UIImage *backButtonImage = [myImage imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]; 
// now use the new backButtomImage 
[[UINavigationBar appearance] setBackIndicatorImage:backButtonImage]; 
[[UINavigationBar appearance] setBackIndicatorTransitionMaskImage:backButtonImage]; 

尝试建立与排列插图的UIImage的,然后设置回指示符图像。

UIEdgeInsets insets = UIEdgeInsetsMake(10, 0, 0, 0); // or (0, 0, -10.0, 0) 
UIImage *alignedImage = [[UIImage imageNamed:@"back"] imageWithAlignmentRectInsets:insets]; 
[[UINavigationBar appearance] setBackIndicatorImage:alignedImage]; 
[[UINavigationBar appearance] setBackIndicatorTransitionMaskImage:alignedImage]; 

您也可以尝试调整UINavigationBar的标题文字

[[UINavigationBar appearance] setTitleVerticalPositionAdjustment:(CGFloat)adjustment forBarMetrics:(UIBarMetrics)barMetrics]; 

+0

这留下了箭头(图片)在同一个地方,不为我工作 – Bernat

+0

请参阅我的编辑 - 从苹果的UIKit接口目录。 “如果在图像上设置了UIImageRenderingModeAutomatic,则会根据其上下文将其视为模板或原始模板。”这是任何UIIImage的默认设置。您的自定义后退按钮可能被当作模板或模板图像(并且希望按照原始格式将其正确地显示在UINavigationBar中。) –

+0

我刚刚尝试过,但结果相同:/ – Bernat

8

也只是遵循的建议,以修复布局,失去了iOS 7一个“回退姿势的位置“,然后用UIScreenEdgePanGestureRecognizer修复它!

UIScreenEdgePanGestureRecognizer寻找在屏幕边缘附近开始的平移(拖动)手势。系统在某些情况下使用屏幕边缘手势来启动视图控制器转换。您可以使用此类为您自己的操作复制相同的手势行为。

3

问题是您的图片太高。为了证明这一点,首先尝试下面的代码:

UIGraphicsBeginImageContextWithOptions(CGSizeMake(10,20), NO, 0); 
CGContextFillRect(UIGraphicsGetCurrentContext(), CGRectMake(6,0,4,20)); 
UIImage* im = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 
self.navbar.backIndicatorImage = im; 
UIGraphicsBeginImageContextWithOptions(CGSizeMake(10,20), NO, 0); 
UIImage* im2 = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 
self.navbar.backIndicatorTransitionMaskImage = im2; 

看起来不错。现在改变2030两个CGSizeMake电话:

UIGraphicsBeginImageContextWithOptions(CGSizeMake(10,30), NO, 0); 
CGContextFillRect(UIGraphicsGetCurrentContext(), CGRectMake(6,0,4,20)); 
UIImage* im = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 
self.navbar.backIndicatorImage = im; 
UIGraphicsBeginImageContextWithOptions(CGSizeMake(10,30), NO, 0); 
UIImage* im2 = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 
self.navbar.backIndicatorTransitionMaskImage = im2; 

图标现在是太高。

所以,只要让你的图像高20像素,一切都会好起来的。

1
UIEdgeInsets insets = UIEdgeInsetsMake(0, 0, -2, 0); // or (2,0,0,0) 
UIImage *backArrowImage = [[UIImage imageNamed:@"back"] imageWithAlignmentRectInsets:insets]; 

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

这是斯威夫特2版本。 最简单的方法就是这样。把这段代码放在AppDelegate。'

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { 
     let navigationBarAppearace = UINavigationBar.appearance() 
     let image = UIImage(named: "back-btn") 
     navigationBarAppearace.backIndicatorImage = image 
     navigationBarAppearace.backIndicatorTransitionMaskImage = image 

     return true 
    } 

如果你的背部按钮有背景颜色,它可能将无法正常工作。

添加您的图标asset folder每个分辨率是这样的: enter image description here