UIEdgeInsetsMake如何工作?

60

我正在制作一个应用程序,在其中使用UIEdgeInsetsMakeresizableImageWithCapInsets创建可调整大小的图像,但我不确定它如何确切地工作,UIEdgeInsetsMake有四个参数:

  • 上方
  • 左侧
  • 下方
  • 右侧

但它们是浮点数,所以我不知道如何将其设置为图像,谢谢!:D


就像AliSoftware所说的那样,您正在询问一种尚未公开的方法,不应该在像这样的公共网站上讨论。有关预发布软件的答案,最好访问官方的苹果开发论坛。 - Tom Irving
22
正确的顺序是:UIEdgeInsetsMake(上边距,左边距,下边距,右边距)。 - Kyle C
在2014年,这些东西对我来说仍然是个谜。我只知道如何居中文本:(0, -width, 0, -width)。 - sudo
3
@TomIrving,不知何故这个问题现在非常相关。我想你当时有限的权力不能对你在2011年的评论采取行动是好事。;) - Abandoned Cart
3个回答

70
根据文档:
您可以使用此方法向图像添加cap插图或更改现有图像的cap插图。在这两种情况下,您将获得一个新图像,原始图像保持不变。
在缩放或调整图像时,被cap覆盖的区域不会被缩放或调整大小。而是在每个方向上未被cap覆盖的像素区域被平铺,从左到右,从上到下,以调整图像的大小。这种技术通常用于创建可变宽度的按钮,这些按钮保留相同的圆角,但其中心区域根据需要增长或缩小。为了获得最佳性能,请使用大小为1x1像素的平铺区域。
因此,您只需要在 UIEdgeInsetsMake 函数的值中使用您想要使其不可拉伸的像素数量即可。
假设您有一个21x50点(标准定义下的21x50像素,在Retina“@2x”定义下的42x100像素)的图像,并且希望此图像在水平方向上可拉伸,保持左侧和右侧的10个点在拉伸图像时不变,但仅拉伸中间的1点宽带。那么您将使用 UIEdgeInsetsMake(0,10,0,10)
不要担心它们是浮点数(例如,对于子像素调整大小很有用,但实际上您可能仅使用整数(或没有小数部分的浮点数))
请注意,这是仅适用于iOS5+的方法,不适用于iOS5之前。如果您使用的是pre-iOS5 SDK,请改用 stretchableImageWithLeftCapWidth:topCapHeight:

[编辑] 一些提示 我已经使用了一段时间,因为我从来不记得UIEdgeInsets结构的字段顺序,以及我们应该按照什么顺序传递参数给UIEdgeInsetsMake函数,我更喜欢使用指定初始化语法,像这样:

UIEdgeInsets insets = { .left = 50, .right = 50, .top = 10, .bottom = 10 };

或者当需要显式转换时:

UIImage* rzImg = [image resizableImageWithCapInsets:(UIEdgeInsets){
   .left = 50, .right = 50,
   .top = 10, .bottom = 10
}];

我认为这样更易读,特别是为了确保我们不混淆不同的边框/方向!


1
是的,这也是我在回答中解释的 ;) - AliSoftware
5
无论是在非视网膜屏幕上还是视网膜屏幕上,测量总是使用点而不是像素(1pt = 1px,在非视网膜屏幕上;1pt = 2px,在视网膜屏幕上)。因此,您的图像在视网膜屏幕(42x100px)和非视网膜屏幕(21x50px)上始终都是21x50点。您应该在代码中的所有地方都使用点(而不是像素)。这正如我在答案中解释的那样。UIEdgeInsetsMake也使用点而不是像素。而且已经过时的stretchableImageWithLeftCapWidth:topCapHeight:也使用点。因此,可拉伸部分的宽度为1个点,这与@2x图像的2个像素匹配(其中1pt = 2px)。 - AliSoftware
1
根据文档:“为了获得最佳性能,请使用一个1x1像素大小的平铺区域。”正如@jhabbott所问,如果考虑性能并且只想支持视网膜设备,选择1像素而不是1点是否可行? - Klaas
1
我怀疑这不是打字错误。性能的提升可能是因为对于1x1像素区域,您可以采样颜色并以该颜色填充整个区域。如果区域是2x2,则需要根据 UIImageResizingMode 来拉伸或平铺子图像。我建议为了获得最佳性能,在视网膜和非视网膜显示屏上将可伸缩区域设为1x1像素(而不是点)。因此,例如对于 UIEdgeInsetsMake(10,10,10,10),请使用21x21 @1x和41x41 @2x。 - jhabbott
2
@Tyson 我按照文档所说的去做 - 在可拉伸区域为单一颜色的情况下,我会创建一个1x1像素的可拉伸区域以获得最佳性能。 - jhabbott
显示剩余7条评论

10

但它们是浮点数,所以我不知道如何将其设置为图像

这是一个UIImage实例方法。因此,使用resizableImageWithCapInsets创建一张图片的方式是首先向一个图片(UIImage)发送该消息。

酷炫的新功能:请注意,如果边缘插图都是零,则图片将被平铺。这可以作为任何接受背景图片的东西的背景。它甚至在UIImageView中也可以使用。


1
对于平铺,您也可以使用view.backgroundColor = [UIColor colorWithPatternImage:image],这是相当容易理解的。否则,如果您使用了平铺技巧,我建议添加注释,例如// tiles image - ma11hew28

3

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