如何在CALayer.contents中添加Stretchable UIImage?

Hor*_*hiv 21 calayer uiimage ios ios5 quartz-core

我有一个CALayer,我想添加一个可伸缩的图像.如果我这样做:

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

它不起作用,因为图层的默认contentGravity是kCAGravityResize.

我已经读过这可以使用contentsCenter完成,但我似乎无法弄清楚我将如何使用它来实现我的CALayer中的拉伸图像.

欢迎任何想法!

霍拉丘

Hor*_*hiv 34

对这个问题的回答就是这个问题.假设你有一个可拉伸的图像,它只在宽度上伸展并且高度固定(为简单起见).

图像宽度为31px(固定尺寸为15px - 不拉伸,1px将拉伸)

假设您的图层是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;
}
Run Code Online (Sandbox Code Playgroud)

根据文档,contentsCenter矩形的值必须介于0-1之间.

默认为单位矩形(0.0,0.0)(1.0,1.0),导致整个图像缩放.如果矩形延伸到单位矩形之外,则结果未定义.

就是这个.希望其他人会发现这很有用,这将节省一些开发时间.

  • 如果没有图像的@ 3x变体,建议的解决方案将在iPhone 6 plus上失败.最好使用图像的scale属性.`self.contentScale = strechableImage.scale`然后,即使并非所有图像变体(@ 2x @ 3x)都存在,它也能工作. (6认同)