iPhone中的stretchableImageWithLeftCapWidth只能制作“D”形图案

9
UIImage *aImage = [[UIImage imageNamed:@"Gray_Button.png"] stretchableImageWithLeftCapWidth:25 topCapHeight:0];

尝试制作“玻璃药丸按钮”。
如果图像比我要使用它的按钮小,那么“stretch”会发生什么?
图像会“拉伸”和“收缩”吗?
我问这个问题的原因是因为我的所有图像最终都看起来像一个“D”形。
左侧是方形的,右侧是圆形的。
一个“D”形状会告诉你我做错了什么? 左侧设置太多或太少? 图像太大?
2个回答

54

如果leftCapWidthtopCapHeight都不为零,则可以将可拉伸的图像分为9个部分。

     leftCapWidth
      <----->
      +--------------+ ^
      |     | |      | |
      |  A  | |  B   | | topCapHeight
      |-----+·+------| v
      |-----+·+------|
      |  C  | |  D   |
      |     | |      |
      +--------------+

中心部分始终为 1 像素大小,并且这是被拉伸的部分,例如:

     leftCapWidth (constant!)
      <----->
      +------------------+ ^
      |     |     |      | |
      |  A  |     |  B   | | topCapHeight (constant!)
    v |-----+ - - +------| v
    | |     .     .      |
    | |     .     .      |
    ^ |-----+ - - +------|
      |  C  |     |  D   |
      |     |     |      |
      +------------------+
            >-----<
        stretched region
创建一个"玻璃丸子按钮",您应该将圆角边框填充到上面的A、B、C和D区域,并将该丸子的半径提供给leftCapWidthtopCapHeight
另外,可拉伸的图像不能缩小。如果您尝试使用比要应用它的按钮(或其他任何东西)更大的可拉伸图像,则可能会呈现错误(特别是在旧版iOS上)。

所以值为0意味着“不要拉伸任何东西”或“均匀地拉伸整个图像”?我看不出任何可能导致“D形问题”的原因。我猜我应该首先确保每个图像都比每个按钮小。(如果不是...那么会发生什么?图像只是按原样使用大小吗?那些不会发生的cap-value拉伸会怎样?) - Susanna
@Roberta:0 的意思是“均匀拉伸到整个图像上”。如果图像小于这些角落,则会相互重叠。 - kennytm
1
这个图示非常有帮助。 - nonamelive
1
此外,可拉伸的图像不可收缩 - 这就是我的问题 - 我有两个很大的PNG背景,并尝试将它们应用于较小框架的按钮。谢谢,+1! - manicaesar
resizableImageWithCapInsets在缩小时效果良好,但仅适用于iOS 5.0及以上版本。 - Pavel Alexeev

3
stretchableImageWithLeftCapWidth并不像你期望的那样工作。建议使用UIView的contentStretch属性来避免一些烦恼。另外,stretchableImage的工作方式如下:如果你缩小图像,它只会剪切图像的顶部和左侧部分而不是拉伸任何内容;如果你扩展图像,它只会扩展顶部帽子下方的像素列和左侧帽子右侧的像素行。这适用于非常简单的图形,但对于具有阴影或光泽等效果的任何图形都会显得很奇怪。另一方面,contentStretch的工作方式就像你期望的那样。该图形基本上被分成9个部分,可以像Kenny解释的那样展开和收缩。此外,请不要忘记,每当你拉伸一个视图时,它的contentMode应该设置为UIViewContentModeScaleToFill。

这并不是真的。正如@KennyTM所解释的那样,他们不会这样缩放:如果图像需要缩小,那么大写字母就不会被保留。 - Dan Rosenstark

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接