我正在编写面向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背景图片
这是结果(在模拟器中)
答案 0 :(得分:19)
left
和right
之间以及top
和bottom
之间的图片部分已平铺,以填充图片所需的空间。试试UIEdgeInsetsMake(15, 6, 15, 6)
。
概括地说,如果您的图像具有连续渐变,则重复的部分应该只有1像素高。由于您的按钮图像高31像素,因此top
和bottom
(UIEdgeInsetsMake
的第一个和第三个参数)应该添加到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];
}
}