如何CALayer的图像比例独立于CALayer的界限

时间:2012-02-11 22:18:34

标签: objective-c ios cocoa-touch cocoa touch

我找不到这个答案。

我想知道如何让calayer中的图像尺寸低于calayer的边界尺寸。

我在iPad游戏中有几个棋子,每个都是CALayer,我只需要使用contentsGravity = kCAGravityResizeAspect调整大小。图像在30x30的CALayer内部是128x128,因此图像会自动调整为30x30并且因为两者都是一个盒子,所以宽高比保持并且有效。

这里我设置CALayer的边界与superview的大小成比例,因此Pawns总是呈现与视图相同的相对大小。这个是在calayer的sprite类子类中:

-(void) setSpriteScaleToDice {
    CGFloat newSize = [self superlayer].bounds.size.width * 0.066666667f; 
    self.bounds=CGRectMake(0.0f, 0.0f, newSize, newSize);
    self.contentsGravity = kCAGravityResizeAspect; 
}

请注意,在我的情况下,CALayer界限最大为30x30,触摸时较小。这就是我面临的问题,由于这个小尺寸很难“触摸”它们,有时触摸失败......

我正在考虑的一个想法是增加calayer的“界限”,同时保持图像的原始大小。问题是我经常搜索并尝试使用contentsGravity,contentsCenter,contentsScale等几个选项......但没有成功。

特别是,根据apple docs看起来的方式是使用contentsCenter(而不是使用contentsGravity),但是我在位图中变形...

请,任何想法都非常受欢迎,并提前感谢,

路易斯

3 个答案:

答案 0 :(得分:2)

这可能是一个愚蠢的问题,但为什么你使用CALayers而不是UIViewsUIImageView具有contentMode属性,可让您轻松完成此操作(更不用说更容易用于触摸事件处理)。

也就是说,CALayer有一个contentsRect属性,可以让你为要在其中绘制的内容定义一个子矩形,这样可以让你做你想做的事。

另一种选择是将图像层放在较大的图层中,并将其用于命中测试。

答案 1 :(得分:2)

CAlayer CGFloat contentsScale

/* Defines the scale factor applied to the contents of the layer. If
 * the physical size of the contents is '(w, h)' then the logical size
 * (i.e. for contentsGravity calculations) is defined as '(w /
 * contentsScale, h / contentsScale)'. Applies to both images provided
 * explicitly and content provided via -drawInContext: (i.e. if
 * contentsScale is two -drawInContext: will draw into a buffer twice
 * as large as the layer bounds). Defaults to one. Animatable. */

答案 2 :(得分:1)

如果您希望在CALayer中绘制的图像大小不是CALayer,则需要创建自己的drawInContext:方法并绘制图像而不是设置CALayer的contents属性。不要设置contents属性,创建自己的属性来跟踪要绘制的图像。