UIImage resizableImageWithCapInsets:无法按预期工作

时间:2012-04-25 03:42:36

标签: objective-c xcode cocoa-touch ios5 uiappearance

我正在编写面向iOS 5.0+平台的第一款iOS应用。我正在使用UIAppearance协议来自定义应用程序UI。

我正在尝试在整个应用程序中更改UIBarButtonItem的背景。由于我的UIBarButtonItem可能会根据所使用的文字或图标改变尺寸,因此我尝试将UIImage resizableImageWithCapInsets:用于我的背景png。

我最初在Ray Wenderlich找到了我需要的代码。使用完全相同的代码,图像与上述教程中使用的图像非常接近,我得到了奇怪的结果。也许这只是我对Cocoa Touch的经验不足。

这是我正在使用的代码。

DreamsAppDelegate.m - customizeAppearance:

UIImage *btnBg = [[UIImage imageNamed:@"navBarButton-bg"] 
          resizableImageWithCapInsets:UIEdgeInsetsMake(0, 6, 0, 6)];

[[UIBarButtonItem appearance] setBackgroundImage:btnBg 
                                        forState:UIControlStateNormal 
                                      barMetrics:UIBarMetricsDefault];

这是我正在尝试使用的png背景图片

png background

这是结果(在模拟器中)

result of trying to use resizableImageWithCapInsets:

2 个答案:

答案 0 :(得分:19)

leftright之间以及topbottom之间的图片部分已平铺,以填充图片所需的空间。试试UIEdgeInsetsMake(15, 6, 15, 6)

概括地说,如果您的图像具有连续渐变,则重复的部分应该只有1像素高。由于您的按钮图像高31像素,因此topbottomUIEdgeInsetsMake的第一个和第三个参数)应该添加到30个。它们不必相等; UIEdgeInsetsMake(8, 6, 22, 6)会将重复的部分向上移动,从而产生更苍白的背景。

此外,您是否附加了图像的普通或视网膜('@ 2x')版本的文件?插图必须在普通版本的大小范围内。

答案 1 :(得分:17)

我有完全相同的问题。

您可以做的另一件事是设置UIImageResizingModeStretch的resizingMode。它解决了我的问题。

Hopwever,它在IOS5中不可用。所以我的解决方案就是按照其他人的说法去做。意识到tileable侧应该只是一个像素。无论如何,大多数按钮在中间变化不大。

所以,请使用以下代码:

-(UIImage *) resizableImageWithCapInsets2: (UIEdgeInsets) inset
    {
        if ([self respondsToSelector:@selector(resizableImageWithCapInsets:resizingMode:)])
        {
            return [self resizableImageWithCapInsets:inset resizingMode:UIImageResizingModeStretch];
        }
        else
        {
            float left = (self.size.width-2)/2;//The middle points rarely vary anyway
            float top = (self.size.height-2)/2;
            return [self stretchableImageWithLeftCapWidth:left topCapHeight:top];
        }
    }