Objective c 如何在iOS7中正确定位后退按钮

Objective c 如何在iOS7中正确定位后退按钮,objective-c,ios7,uinavigationbar,uinavigationitem,Objective C,Ios7,Uinavigationbar,Uinavigationitem,我使用此代码在整个应用程序中使用自定义图像作为后退按钮 [[UINavigationBar appearance] setBackIndicatorImage:[UIImage imageNamed:@"back"]]; [[UINavigationBar appearance] setBackIndicatorTransitionMaskImage:[UIImage imageNamed:@"back"]]; 图像尺寸为30 x 30 代码将图像添加为后退按钮,但位置不正确,如下图所示:

我使用此代码在整个应用程序中使用自定义图像作为后退按钮

[[UINavigationBar appearance] setBackIndicatorImage:[UIImage imageNamed:@"back"]];
[[UINavigationBar appearance] setBackIndicatorTransitionMaskImage:[UIImage imageNamed:@"back"]];
图像尺寸为30 x 30

代码将图像添加为后退按钮,但位置不正确,如下图所示:

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

编辑:


我不想使用自定义的后退按钮,因为这会迫使我禁用iOS7中的滑动/后退手势

请参见下面的编辑

不久前,我在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;
“我的图像最终版”是两个不同图像的合成,但您可以只使用“背面”图像。但我认为这就是问题所在。我的图像是一个合成图,你可能也想制作一个合成图,但在你的背部图标上方留出一个空白。我在图标右侧放置了一个空白,以调整其间距。这是密码

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(); 
图像文字空间是我在photoshop中制作的清晰png,因此我的新后退按钮图像没有拉伸。您可能希望在顶部放置一个清晰的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];
}
希望这有点帮助

编辑*****

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

由于您并不真正想要标题,因此可以使用以下代码创建按钮

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)];
看看这张照片

这显示图标大幅下降,但我想向您展示这个想法。边插入的编号为顶部、左侧、底部和右侧。不要触摸左右,如果不需要这样移动,请更改顶部和底部。但是请注意,如果您需要像我一样向下移动20点,(太多了),您需要在底部的负片中进行偏移,否则图标将被压缩。这就是所有零的情况

因此,您几乎可以随时将其移动到任何需要的位置,但仍然需要设置@selector(backButtonClicked)使其像真正的后退按钮一样工作。

您可以尝试此方法

self.navigationItem.leftBarButtonItem.imageInsets = UIEdgeInsetsMake(0, 0, 10, 0);
编辑
我想我可能已经找到了窍门(在iOS 7设计资源——UIKit用户界面目录中)。
栏按钮项下

请注意,除非您将工具栏按钮图像的渲染模式显式设置为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];

我们只需按照其中一条建议来修复布局,并丢失iOS 7的“后退手势”,然后用一个

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


问题是你的形象太高了。要证明这一点,请首先尝试以下代码:

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;
看起来不错。现在在两个
CGSizeMake
调用中将
20
更改为
30

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像素高,一切都会好起来。

这是Swift 2版本。
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];
最简单的方法就是这样。将此代码放入
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
    }
如果后退按钮有背景色,则可能无法正常工作

为每个分辨率将图标添加到
资产文件夹
,如下所示:

你应该考虑“uIime*ButButtudio= [[uIIMAIGIMANMEDMA:@ BLASBUTBY ] ] ResiZabeIMAGIVEN CAPENSET:UIEdgeInsetsMake(12, 12, 12,12)],然后将此图像设置为Butter按钮。如果我这样做,“IOS7后向手势”不起作用,你将在这里提供“UIEdgeInsetsMake(12, 12, 12,12)”。您需要根据您的要求进行更改。按照这个我不知道如何解决这个问题,因为后退按钮不是UINavigationBar的背景,我不需要以任何方式/模式重复它,因为我不想从头开始一个项目。但是,我也不需要帮助。这使得箭头(图像)在同一个位置,不适用于meSee我的编辑——来自苹果的UIKit接口目录。“如果在图像上设置了UIImageRenderingModeAutomatic,它将根据其上下文被视为模板或原始。”这是任何UIIImage的默认设置。你的