iPhone stretchchableImageWithLeftCapWidth只生成“D”

时间:2010-05-27 19:53:06

标签: iphone sdk uiimage uibutton stretch

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

尝试制作“玻璃药丸按钮”。

如果图像更大,“拉伸”会做什么......而我试图在...上使用的按钮更小?

图像“拉伸”和“缩小”吗?

我问的原因是因为我的所有图像看起来都像“D”形。

左侧是方形的......右侧是圆形的。

D形告诉你我做错了什么? 太多......或太少......“leftCap设置”? 图像太大了?

2 个答案:

答案 0 :(得分: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中,并将该药丸的半径提供到leftCapWidth和{{1} }。


此外,可拉伸图像不可收缩。如果您尝试使用比要应用它的按钮(或其他任何东西)更大的可伸缩图像,它们可能会被错误地渲染(特别是在较旧的iOS上)。

答案 1 :(得分:3)

stretchableImageWithLeftCapWidth的行为与您的预期不符。我建议使用UIView的contentStretch属性来节省一些挫折感。

仅供参考,stretchchableImage的行为方式是:

  • 如果缩小图像,它只会剪切图像的顶部和左侧部分,而不是拉伸任何内容。
  • 如果展开图片,它将仅展开顶部封面下方的像素列和左侧封面右侧的像素行。这适用于非常简单的图形,但对于任何具有阴影或光泽效果的图形看起来都很尴尬。
另一方面,

contentStretch的行为与您期望的一样。该图形基本上分为9个部分,以Kenny解释的方式展开和收缩。

另外,不要忘记,无论何时拉伸视图,其contentMode都应设置为UIViewContentModeScaleToFill。