如何在CALayer.contents中添加可拉伸的UIImage?

21

我有一个CALayer,我想在它上面添加一张可拉伸的图片。如果我只是这样做:

        _layer.contents = (id)[[UIImage imageNamed:@"grayTrim.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(0.0, 15.0, 0.0, 15.0)].CGImage;

由于图层的默认contentGravity是kCAGravityResize,所以它不起作用。

我已经了解到可以使用contentsCenter来实现这个目标,但我似乎无法弄清楚如何在我的CALayer中使用它来拉伸图片。

欢迎任何想法!

Horatiu

1个回答

34
这个问题的答案是这个。假设你有一张可伸缩图片,它只在宽度上伸展,高度固定(为了简单起见)。
该图像的宽度为31像素(15像素的固定大小-不会伸展-,1像素将被拉伸)。
如果您的图层是CALayer子类,则其init方法应如下所示:
    - (id)init
{
    self = [super init];
    if (self) {
        UIImage *stretchableImage = (id)[UIImage imageNamed:@"stretchableImage.png"];
        self.contents = (id)stretchableImage.CGImage;

        self.contentsScale = [UIScreen mainScreen].scale; //<-needed for the retina display, otherwise our image will not be scaled properly

        self.contentsCenter = CGRectMake(15.0/stretchableImage.size.width,0.0/stretchableImage.size.height,1.0/stretchableImage.size.width,0.0/stretchableImage.size.height);
    }
    return self;
}

根据文档,contentsCenter矩形的值必须在0-1之间。

默认为单位矩形(0.0,0.0)(1.0,1.0),导致整个图像被缩放。如果矩形超出单位矩形,则结果未定义。

就是这样。希望其他人会发现这个有用,并节省一些开发时间。


我觉得这很有帮助。谢谢! - duci9y
1
最好使用图像的比例。 - Olle Raab
6
如果没有@3x版本的图像,建议的解决方案将在iPhone 6 Plus上失败。更好的方法是使用图像的比例属性。self.contentScale = strechableImage.scale这样即使图像的所有变体(@2x @3x)都不存在也能正常工作。 - Olle Raab

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