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

Ber*_*nat 32 objective-c uinavigationbar uinavigationitem ios7

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

[[UINavigationBar appearance] setBackIndicatorImage:[UIImage imageNamed:@"back"]];
[[UINavigationBar appearance] setBackIndicatorTransitionMaskImage:[UIImage imageNamed:@"back"]];
Run Code Online (Sandbox Code Playgroud)

图像尺寸为30 x 30.

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

后退按钮位置不正确

关于如何在不修改尺寸的情况下正确定位图像的任何想法(至少是图像的可视部分(圆圈+箭头))?

编辑:

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

rac*_*arr 21

编辑
我想我可能已经找到了技巧(在iOS 7设计资源 - UIKit用户界面目录中.)
Bar Button Items下

请注意,除非您将其渲染模式明确设置为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];
Run Code Online (Sandbox Code Playgroud)

尝试使用对齐插图创建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];
Run Code Online (Sandbox Code Playgroud)

您也可以尝试调整UINavigationBar标题文本的位置

[[UINavigationBar appearance] setTitleVerticalPositionAdjustment:(CGFloat)adjustment forBarMetrics:(UIBarMetrics)barMetrics];
Run Code Online (Sandbox Code Playgroud)

  • 第二个选项适合我(带插图的图像).我不得不使用-10底部的插图.谢谢! (4认同)
  • 我得到了它的工作,与前两个代码FYI的mashup (2认同)

Riv*_*era 8

那么只需按照其中一个建议来修复布局并丢失iOS 7"后退手势",然后用一个修复它UIScreenEdgePanGestureRecognizer!

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


Dou*_*las 6

请看下面的编辑!

不久前我在iOS7中创建了一个自定义后退按钮.我的箭头上有一个箭头.我认为pawan的建议是一个好的开始.要使用您可以使用的自定义图像创建后退按钮,

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;
Run Code Online (Sandbox Code Playgroud)

我的图像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(); 
Run Code Online (Sandbox Code Playgroud)

图像wordSpace是我在photoshop中制作的一个清晰的png,所以我的新后退按钮图像没有被拉伸.您可能希望在顶部放置一个清晰的png,将图标向下推一点.在photoshop中制作它的大小.你认为调整应该是什么.您可能需要对此进行一些改进.并确保更改CGSize,使其适合您的图标和空白区域.

我的话回来了,所以我看了看

[backButton setTitlePositionAdjustment:UIOffsetMake(-20, 0) forBarMetrics:UIBarMetricsDefault];
Run Code Online (Sandbox Code Playgroud)

我不得不玩那条线以使它看起来尽可能好但它最终给了我想要的-20.我甚至调整了我的第二个变量0,这移动了实际的图标.-5把图标放到远处,但它的另一个选项是清晰的png.

现在来处理你希望它成为一个真正的后退按钮的事实.看看我发布的第一行代码.按钮上的操作是@selector(backButtonClicked).所以你需要做的就是制作这种方法,你应该好好去!

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

希望这个对你有帮助.

在此输入图像描述

编辑*****

我正在玩我的代码一点点,并找到了一个更好的方法来移动后面的图标.我只是使用了一个轮子,因为我没有你做的那个,但是它的工作方式是一样的.

既然您不想要标题,可以使用此代码创建按钮,

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

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

只需用你的图标名称更改781内容即可.然后你可以用以下方法移动它,

[backButton setImageInsets:UIEdgeInsetsMake(20, 0, -20, 0)];
Run Code Online (Sandbox Code Playgroud)

看看这张照片.

pic one

这显示了相当大的图标,但我想向您展示这个想法.Edge插入的数字是Top,Left,Bottom和Right.如果您不需要以这种方式移动,请不要左右触摸,更改顶部和底部.但请注意,如果你需要像我一样将它向下移动20点,(太多了)你需要在底部偏移负面,否则图标将被压缩.这是所有零的看起来.

用零的照片

所以你可以随心所欲地移动它,但你仍然需要设置@selector(backButtonClicked)使它像真正的后退按钮一样工作.


fat*_*han 5

这是Swift 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
    }
Run Code Online (Sandbox Code Playgroud)

如果你的后退按钮有背景颜色,它可能无法正常工作.

asset folder为每个分辨率添加您的图标,如下所示: 在此输入图像描述