我找不到这个答案。
我想知道如何让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),但是我在位图中变形...
请,任何想法都非常受欢迎,并提前感谢,
路易斯
答案 0 :(得分:2)
这可能是一个愚蠢的问题,但为什么你使用CALayers
而不是UIViews
? UIImageView
具有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
属性,创建自己的属性来跟踪要绘制的图像。