使用resizableImageWithCapInsets:button的图像仅适用于状态设置,其他状态显示“空白”

当使用resizableImageWithCapInsets:为UIButton创build一个图像只有正常状态(使用setBackgroundImage:forState :)设置图像的状态工作。 所有其他国家都显示了一个差距,而不是绘制的图像。 UIButton说,如果没有图像设置为特定的状态,正常状态图像将被用于禁用和select状态的覆盖。

这是正常的状态:

在这里输入图像说明

这里是选中的状态:

在这里输入图像说明

这里是源图片:

在这里输入图像说明

这显然是使用我提供的可resize的图像,但图像不绘制resize的区域。 (你可以看到左边和右边,但是被拉伸的中间区域没有被绘制)。

有趣的是,stretchableImageWithLeftCapWidth:topCapHeight:确实有效。 现在这是iOS 5中的一个不推荐的方法,但是在新的API中显示出了差距,我可能会被卡住。

我意识到我可以为每个状态提供更多的图像,但是这样做的目的是为了减less内存占用,另外还增加了对我想要避免的graphicsdevise器的依赖。

// This is the gist of the code being used UIImage* image = [UIImage imageNamed:@"button.png"]; UIEdgeInsets insets = UIEdgeInsetsMake(image.size.height/2, image.size.width/2, image.size.height/2, image.size.width/2); image = [image resizableImageWithCapInsets:insets]; [self.button setBackgroundImage:image forState:UIControlStateNormal]; // Even doing the following results in the same behaviour [self.button setBackgroundImage:image forState:UIControlStateSelected]; 

您没有正确创build您的图片封面的插图。 我已经复制了你的问题,并通过使用正确的插页纠正它。

使用当前的代码,您可以创build图像高度和宽度的一半大小的顶点 – 这会为您留出一个0x0像素的“可拉伸”区域 – 所以在中间不会有任何东西。

为什么这不是在button的正常状态显示为错误,我不确定 – 也许有一些优化内置到UIButton修复的事情或自动strectch,如果你不提供一个可拉伸的图像,这不适用于其他国家。

大写字母应该定义图像的不能被拉伸的区域。 在button.png图片的情况下,左右两侧是6像素,顶部和底部是16像素。 这是不是很标准,你应该告诉你的graphicsdevise师(至less左右哪个是最常见的拉伸),你应该只有一个1px的区域在中心,但是这并不影响结果。 如果你有一个1px的可拉伸区域,那么你可以通过从图像尺寸中获得大小的标准化,就像你试图在你的问题中做的那样(每个上限是(image.size.height - 1) / 2 for top /底部,相同但宽度左/右)。

要在button上获取正确的图像,请使用以下代码创build可伸缩图像:

 UIEdgeInsets insets = UIEdgeInsetsMake(16, 6, 16, 6); image = [image resizableImageWithCapInsets:insets]; 

我在iOS5上使用可resize的图像时也遇到了问题。 事实certificate,如果您的buttontypes为“RountedRect”,并且您操作背景图像,则可resize的图像将不会按预期方式运行。 (iOS6处理这个好,大概假设你的新的buttontypes,并根据需要进行调整。)