使用resizableImageWithCapInsets:image for button仅适用于状态集,其他状态显示“gap”

时间:2011-12-29 17:47:15

标签: objective-c ios uibutton uiimage

当使用resizableImageWithCapInsets:为UIButton创建图像时,只有正常状态(使用setBackgroundImage:forState :)设置图像的状态才有效。所有其他状态显示间隙而不是绘制的图像。 UIButton表示,如果没有为特定状态设置图像,则正常状态图像将与覆盖一起用于禁用和选择状态。

这是正常状态:

enter image description here

以下是选定的州:

enter image description here

这是源图像:

enter image description here

显然正在使用我提供的可调整大小的图像,但图像没有绘制调整大小的区域。 (您可以看到左右边缘,但是不会绘制刚刚拉伸的中间区域。)

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

我确实认识到我可以为每个州提供更多图像,但是这会破坏我正在努力减少内存占用的目的,并且增加了对我想要避免的图形设计器的依赖。

// 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];

2 个答案:

答案 0 :(得分:34)

您没有为图像上限正确创建插图。我已经复制了你的问题,并使用正确的插图进行了纠正。

使用当前代码,您将创建一半图像高度和宽度的大写字母 - 这将为您留下一个0x0像素的“可伸缩”区域 - 因此您不会在中间获得任何内容。

为什么在按钮的正常状态下没有出现错误我不确定 - 如果你不提供可伸缩的图像,也许UIButton内置一些优化来修复内容或自动拉伸,这不适用于其他州。

帽子应该定义不得拉伸的图像区域。对于button.png图像,左侧和右侧为6像素,顶部和底部为16像素。这不是很标准,你应该告诉你的图形设计师(至少左右这是最常见的拉伸)你应该只在中心有1px区域,但这不会影响结果。如果你有一个1px的可伸缩区域,那么你可以通过从你的问题中尝试的图像大小中获取大写来标准化你的代码(每个上限为(image.size.height - 1) / 2为顶部/底部,相同但有宽度左/右)。

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

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

答案 1 :(得分:0)

我在iOS5上使用可调整大小的图像时遇到了问题。事实证明,如果您的按钮是“RountedRect”类型并且您操纵背景图像,则可调整大小的图像将不会按预期运行。 (iOS6可以处理这个问题,可能是假设您的新按钮类型并根据需要进行调整。)