Objective c xcode和sprite工作表,当一张工作表中存在多个图像时如何裁剪图像

Objective c xcode和sprite工作表,当一张工作表中存在多个图像时如何裁剪图像,objective-c,cocoa,sprite,Objective C,Cocoa,Sprite,我知道这是通过web编程实现的,是否也可以通过xcode和obj-c实现?我有一个带有两个按钮实例(正常和单击)的精灵表。我知道我可以在obj-c中使用单击功能,但是我可以导入一个精灵表并裁剪精灵表的一部分(与网站一样)以裁剪一个精灵表中所需的图像部分吗?如果需要,需要哪些功能?您有什么可以给我指的例子吗?您可以使用CALayer实现这一点:它比UIImageView更轻,而且使用非常简单。这个想法是基于一个正在工作的项目的例子 // "sprites.png" is a 192x128

我知道这是通过web编程实现的,是否也可以通过xcode和obj-c实现?我有一个带有两个按钮实例(正常和单击)的精灵表。我知道我可以在obj-c中使用单击功能,但是我可以导入一个精灵表并裁剪精灵表的一部分(与网站一样)以裁剪一个精灵表中所需的图像部分吗?如果需要,需要哪些功能?您有什么可以给我指的例子吗?

您可以使用
CALayer
实现这一点:它比
UIImageView
更轻,而且使用非常简单。这个想法是基于一个正在工作的项目的例子

    // "sprites.png" is a 192x128 picture containing two rows of three 64x64 sprites each
    NSString *path = [[NSBundle mainBundle] pathForResource:@"sprites.png" ofType:nil];
    CGImageRef img = [UIImage imageWithContentsOfFile:path].CGImage;
    imgLayer = [CALayer layer];
    imgLayer.contents = (__bridge id)img;
    // Frame defines the position of your sprite inside your view
    imgLayer.frame = CGRectMake(horOffset, verOffset, 64, 64);
    imgLayer.bounds = CGRectMake(0, 0, 64, 64); // The size of an individual sprite
    // Pick the sprite from the top row, left column
    imgLayer.contentsRect = CGRectMake(0, 0, 1.0/3.0, 1.0/2.0);
    // Top row, middle column
    // imgLayer.contentsRect = CGRectMake(1.0/3, 0, 1.0/3.0, 1.0/2.0);
    // Top row, right column
    // imgLayer.contentsRect = CGRectMake(2.0/3, 0, 1.0/3.0, 1.0/2.0);
    // Bottom row, left column
    // imgLayer.contentsRect = CGRectMake(0, 1.0/2, 1.0/3.0, 1.0/2.0);
    // Bottom row, middle column
    // imgLayer.contentsRect = CGRectMake(1.0/3, 1.0/2, 1.0/3.0, 1.0/2.0);
    // Bottom row, right column
    // imgLayer.contentsRect = CGRectMake(2.0/3, 1.0/2, 1.0/3.0, 1.0/2.0);
    [self.layer addSublayer:imgLayer];

您打算如何显示您的精灵?您是否将它们放在
UIImageView
CALayer
,或其他什么地方?UIImageView,但如果可能有更好的解决方案,您可以接受其他想法。先生,您使用此代码给我带来了很多痛苦
imgLayer.contentsRect
不应该是
64,64
它应该是
1,1
。。您的示例链接中的代码在仔细检查后仍然有效。@Lémuffinnm非常感谢您的宝贵意见!仔细检查后,我发现我复制/粘贴了两次
内容rect
——一次在
边界的位置,一次在它的正确位置。这个问题现在已经解决了。谢谢谢谢,我让它工作了,但我必须说,哇!这确实很难让我理解。在我看来,在
边界中指定精灵大小会更自然,就像我们现在这样,让
内容反射
采取
CGSize
,这将是x,y位置。当前的工作方式是在宽度和高度属性中输入一个值,该值与点或像素的比例为0-1。这有助于解释为什么
contentsRect
的范围为0-1。