UIEdgeInsetsMake如何运作?

pme*_*ino 59 cocoa-touch uiimage ios ios5 uiedgeinsets

我在做一个应用程序,我用UIEdgeInsetsMakeresizableImageWithCapInsets,但我不明白是怎么做的工作原理完全,UIEdgeInsetsMake有4个参数:

  • 最佳
  • 剩下
  • 底部

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

Ali*_*are 70

根据文件:

您可以使用此方法为图像添加上限,或更改图像的现有上限.在这两种情况下,您都会返回一个新图像,原始图像保持不变.

在缩放或调整图像大小期间,由盖子覆盖的区域不会缩放或调整大小.相反,在每个方向上没有被盖子覆盖的像素区域是平铺的,从左到右和从上到下,以调整图像的大小.此技术通常用于创建可变宽度按钮,这些按钮保留相同的圆角但其中心区域根据需要增大或缩小.为获得最佳性能,请使用大小为1x1像素区域的平铺区域.

因此,您只需要使用您想要在UIEdgeInsetsMake函数值中不可伸展的像素数量.

假设您有一个21x50点的图像(标准清晰度为21x50像素,Retina为42x100像素,"@ 2x"定义)并希望此图像可水平拉伸,在拉伸图像时保持左侧和右侧的10个点不受影响,但只能在中间伸展1点宽的乐队.然后你会用UIEdgeInsetsMake(0,10,0,10).

不要打扰它们是浮点数(例如,这对于子缩位大小调整很有用,但实际上你可能只使用整数(或没有小数部分的浮点数)

请注意,这是iOS5 +唯一的方法,在iOS5之前不可用.如果您使用iOS5之前的SDK,请stretchableImageWithLeftCapWidth:topCapHeight:改用.


[编辑]我从一段时间以来使用的一些提示,因为我永远不会记住UIEdgeInsets结构的字段是以哪种顺序- 以及我们应该将参数传递给UIEdgeInsetsMake函数的顺序- 我更喜欢使用像这样的"指定inits"语法:

UIEdgeInsets insets = { .left = 50, .right = 50, .top = 10, .bottom = 10 };
Run Code Online (Sandbox Code Playgroud)

或者当需要显式演员时:

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

我发现它更具可读性,特别是为了确保我们不混合不同的边框/方向!

  • 测量总是使用点,而不是像素(非视网膜屏幕上1pt = 1px,视网膜屏幕上1pt = 2px).所以你的图像总是21x50**点**视网膜(42x100px)和非视网膜(21x50px).您应该始终在代码中的任何位置使用**点**(而不是像素).这就是我在答案中已经解释过的.`UIEdgeInsetsMake`也使用点,而不是像素.不推荐使用的`stretchableImageWithLeftCapWidth:topCapHeight:`也确实使用了点.因此,可伸缩位的宽度为1**点**,与@ 2x`图像匹配**2像素**(1pt = 2px) (5认同)
  • @Tyson我按照文档所说的 - 如果可伸展区域是单一颜色,我会制作一个1x1*像素*可伸缩区域以获得最佳性能. (2认同)

mat*_*att 10

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

这是一个UIImage实例方法.因此,您resizableImageWithCapInsets在图像中创建的方式是首先将该消息发送图像(UIImage).

很酷的新功能:请注意,如果边缘插入全部为零,则图像将平铺.这适用于任何接受背景图像的背景.它甚至可以在UIImageView中运行.