21

我有一个 CALayer,我想向它添加一个可拉伸的图像。如果我这样做:

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

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

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

欢迎任何想法!

霍拉蒂乌

4

1 回答 1

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;
}

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

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

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

于 2012-08-13T04:23:44.043 回答