objective-c - 如何独立于 CALayer 的边界缩放 CALayer 的图像

标签 objective-c ios cocoa-touch cocoa touch

我找不到这个问题的答案。

我想知道如何使 calayer 中的图像大小小于 calayer 的边界大小。

我在 iPad 游戏中有几个 pawn,每个都是一个 CALayer,我让它们通过 contentsGravity=kCAGravityResizeAspect 调整大小。图像在 30x30 的 CALayer 中为 128x128,因此图像会自动调整大小为 30x30,并且由于两者都是一个盒子,纵横比保持不变并起作用。

在这里,我将 CALayer 的边界设置为与父 View 的大小成比例,因此 Pawns 始终呈现与 View 相同的相对大小。这个在我的 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),但是我在位图中得到变形...

拜托,任何想法都非常受欢迎,在此先感谢

路易斯

最佳答案

这可能是个愚蠢的问题,但为什么要为此使用 CALayers 而不是 UIViewsUIImageView 有一个 contentMode 属性,可以让您轻松地做到这一点(更不用说更容易用于触摸事件处理)。

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

另一种选择是将您的图像层放在一个更大的层中,并将其用于 HitTest 。

关于objective-c - 如何独立于 CALayer 的边界缩放 CALayer 的图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9244514/

相关文章:

ios - 我怎么知道正则表达式的哪一部分与 Objective-c 匹配

objective-c - 从 NSTokenField 获取 token

ios - 在 iOS 中获取设备位置(仅限国家/地区)

iphone - 如何为使用 CGBitmapContextCreate() 创建的绘图 Canvas 设置背景颜色?

objective-c - 使用 ARC 声明委托(delegate)属性的推荐方法

iphone - 在 UINavigationController 层次结构的中间添加 Flip View 类型 Controller

objective-c - NSTextField - 可选择和 mouseup 事件

ios - UIButton 旋转后失去目标

ios - Swift - 两个具有相同公共(public)结构的框架

android - iOS 中类似 Android 的水平线性进度条