在iOS上扩展图像重复水平线和重复垂直线

时间:2013-10-08 14:42:00

标签: ios uiimage stretch

我有图像,在那个图像中我想重复水平和垂直线,所以我扩展了我的图像。

例如我有图像50X50,我希望它是50x70,重复x = 15行。这在iOS上是否可行?

编辑:

好的,我会尝试更清楚。我有图像60x60,基本上是矩形,宽度为60,高度为60.现在我想通过重复x = 40的像素来将图像拉伸到80x60。或者简单地绘制它,我有:

  123456
1 XXXAXX
2 XXXAXX
3 XXXAXX
4 XXXAXX
5 XXXAXX
6 XXXAXX

我希望它是:

  12345678
1 XXXAAAXX
2 XXXAAAXX
3 XXXAAAXX
4 XXXAAAXX
5 XXXAAAXX
6 XXXAAAXX

我重复了40号线上图像上的所有像素。我想在任意数量的图像上进行。

3 个答案:

答案 0 :(得分:8)

实现所需结果的关键是resizableImageWithCapInsets: UIImage。例如,采用以下50px x 50px图像(注意:这是@ 2x版本):

Retina-scale 50x50 image with a single pixel vertical red line offset by 15px in the x-axis

如果要将红线水平拉伸,首先要定义一个描述红线位置的UIEdgeInset

UIEdgeInsets redLine = UIEdgeInsetsMake(0, 15, 0, 34);

这定义了从左侧偏移15px的图像的一个像素宽的切片。 right偏移量为34,因为可伸展切片的右边缘为16px,而50(图像宽度)减去16为34。

现在我们有UIEdgeInset,我们可以加载图片并创建它的可伸缩版本:

UIImage *stretchableImage = [[UIImage imageNamed:@"my_image"] resizableImageWithCapInsets:redLine];

我们可以使用我们需要的框架将此stretchableImage分配给UIImageView

UIImageView *stretchedImageView = [[UIImageView alloc] initWithImage:stretchableImage];
stretchedImageView.frame = CGRectMake(100,100,70,50); // The image view is 70px wide

在应用中,stretchedImageView将如下所示:

enter image description here

还有一种名为resizableImageWithCapInsets:resizingMode:的方法可以让你平铺图像切片而不是拉伸它,所以你可以做一些疯狂的事情,比如拍下这张图片:

enter image description here

并像这样平铺它:

enter image description here

答案 1 :(得分:1)

如果我正确理解了这个问题,你应该使用:

(UIImage *)resizableImageWithCapInsets:(UIEdgeInsets)capInsets

  

UIEdgeInsets是指定每个上限的浮点值的结构   插图:图像的顶部,左侧,底部和右侧区域。将此应用于   按钮的图像,这是我们需要做的全部:

UIImage *buttonImage = [[UIImage imageNamed:@"blueButton"]  
   resizableImageWithCapInsets:UIEdgeInsetsMake(0, 16, 0, 16)];
  

这要求原始图像的左右16个像素   拉伸图像以适应时不缩放或调整大小   上面定义的按钮大小框架。结束

OBS:这仅适用于普通图像,例如带有渐变的图像效果不佳。

查看here了解更多详情。

答案 2 :(得分:0)

只需在UIImageView中重复一个图像:

var dottedLineView : UIImageView = {
    let view = UIImageView()
    view.contentMode = .scaleAspectFill
    view.clipsToBounds = true
    view.backgroundColor = UIColor(patternImage: #imageLiteral(resourceName: "dashedLine"))

    return view
}()