UIBarButtonItem自定义背景图像的奇怪问题

emr*_*kyv 2 uikit ios ios5 ios6

我正在尝试自定义iOS 5中的后退按钮.这是我想要使用的背景图像:

背景图片

这是23 x 30点.

我的自定义代码是:

UIImage *buttonBackground = [[UIImage imageNamed:@"navbar-backbutton.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 11, 0, 11) resizingMode:UIImageResizingModeStretch]; 
UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:@"Geri" style:UIBarButtonItemStylePlain target:nil action:nil];
[backButton setBackButtonBackgroundImage:buttonBackground forState:UIControlStateNormal barMetrics:UIBarMetricsDefault]; 
[self.navigationItem setBackBarButtonItem:backButton];
Run Code Online (Sandbox Code Playgroud)

这应该是技巧,图像的宽度是23点,我设置左右偏移11点.但这是结果("Geri"在土耳其语中意为"后退"):

返回键

我不明白的是最后的尺寸差异.我不确定我做错了什么.关于这个的任何想法?

谢谢.

Dan*_*iel 11

您的代码有什么问题?

UIEdgeInsets对正在使用的图像不正确,您告诉用户界面过早开始拉伸图像.您应该更改您的左侧值UIEdgeInsets以开始向右伸展几个点.

什么是边缘插入?

我注意到你评论了另一个答案,你不明白边缘插入是如何工作的.所以我为你画了这个.

在此输入图像描述

黑色线条代表图像的边框.橙色线代表您希望图像可伸展的区域.请注意,当按钮的圆角部分结束时,左帽会出现.右边的帽子出现在右边缘的圆角之前.

您可以使用,将此表示给UIKit UIEdgeInsets.

UIEdgeInsets定义如下(见文档):

typedef struct {
    CGFloat top, left, bottom, right;
} UIEdgeInsets;
Run Code Online (Sandbox Code Playgroud)

在您的情况下,我下载了您尝试使用的按钮,我发现左上角应该从14像素开始.右上角应为18像素(距右边缘5个像素).

因此,您应该使用以下边缘插图来正确调整图像大小:

UIEdgeInsets correctInsets = UIEdgeInsetsMake(0.0, 14.0, 0.0, 5.0);
Run Code Online (Sandbox Code Playgroud)

兼容性(iOS 5和6)

另请注意,UIImage您使用的调整大小方法仅适用于iOS 6:

-resizableImageWithCapInsets:resizingMode:
Run Code Online (Sandbox Code Playgroud)

您应该使用此方法来使这在iOS 5中正常工作:

-resizableImageWithCapInsets:
Run Code Online (Sandbox Code Playgroud)

请参阅UIImage文档