13

我正在编写针对 iOS 5.0+ 平台的第一个 iOS 应用程序。我正在使用该UIAppearance协议来自定义应用程序 UI。

我正在尝试更改UIBarButtonItem整个应用程序的背景。由于我UIBarButtonItem的 's 可能会根据所使用的文本或图标而改变大小,因此我正在尝试UIImage resizableImageWithCapInsets:与我的背景 png 一起使用。

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

这是我正在使用的代码。

DreamsAppDelegate.m - 自定义外观:

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

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

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

png背景

这是结果(在模拟器中)

尝试使用 resizableImageWithCapInsets 的结果:

4

2 回答 2

19

left和 之间以及和right之间的图像部分平铺以填充图像所需的空间。试试。topbottomUIEdgeInsetsMake(15, 6, 15, 6)

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

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

于 2012-04-25T03:58:50.267 回答
17

我有完全一样的问题。

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

但是,它在 IOS5 中不可用。所以我的解决方案是像其他人所说的那样做。意识到可平铺的一面应该只有一个像素。无论如何,大多数按钮在中间并没有太大变化。

所以,使用这个代码:

-(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];
        }
    }
于 2012-10-17T14:14:25.077 回答