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

时间:2012-09-14 13:09:54

标签: ios ios5 ios6 uikit

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

background image

这是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];

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

back button

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

感谢。

2 个答案:

答案 0 :(得分:11)

您的代码出了什么问题?

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

什么是边缘插入?

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

enter image description here

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

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

UIEdgeInsets定义如下(see documentation):

typedef struct {
    CGFloat top, left, bottom, right;
} UIEdgeInsets;

解决方案

在你的情况下我下载了你想要使用的按钮,我发现左边的帽子应该从14像素开始。右上角应为18像素(距右边缘5个像素)。

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

UIEdgeInsets correctInsets = UIEdgeInsetsMake(0.0, 14.0, 0.0, 5.0);

兼容性(iOS 5& 6)

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

-resizableImageWithCapInsets:resizingMode:

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

-resizableImageWithCapInsets:

请参阅UIImage documentation

答案 1 :(得分:1)

试试这段代码

 NSString *ver = [[UIDevice currentDevice] systemVersion];
    IosVersion = [ver floatValue];

    UIButton * backButton ;
    backButton = [[UIButton alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 23, 19)];
    if(IosVersion >= 5.0)

        [backButton setBackgroundImage:[[UIImage imageNamed:@"navbar-backbutton"] resizableImageWithCapInsets:UIEdgeInsetsMake(0.0f, 15.0f, 0.0f, 15.0f)]forState:UIControlStateNormal];

    else

        [backButton setBackgroundImage:[[UIImage imageNamed:@"navbar-backbutton"]stretchableImageWithLeftCapWidth:15 topCapHeight:15]forState:UIControlStateNormal];


    [backButton.titleLabel setText:@"Geri"];
    [backButton setFrame: CGRectMake(0, 0, 23, 19)];

    [backButton addTarget:self action:@selector(goToHome) forControlEvents:UIControlEventTouchUpInside];
    UIBarButtonItem *HomeButton = [[UIBarButtonItem alloc] initWithCustomView: backButton];
    [self.navigationItem setLeftBarButtonItem:HomeButton];