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

NSP*_*mer 25 objective-c uibutton uiimage ios

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

这是正常状态:

在此输入图像描述

这是选定的州:

在此输入图像描述

这是源图像:

在此输入图像描述

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

有趣的是,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];
Run Code Online (Sandbox Code Playgroud)

jrt*_*ton 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];
Run Code Online (Sandbox Code Playgroud)