我想不出一种快速、简洁的方式来解释我想要完成的事情(这使得在谷歌上很难找到答案),所以我将在这里尝试详细说明。我想要完成的是将 a 移动UIImageView
到 iPhone 屏幕的顶部边缘,然后继续向上移动,但是一旦图像通过顶部边缘,它就会出现在屏幕底部,因为它会继续移动。
我一直在使用基本[UIView commitAnimations]
命令在我的应用程序中进行对象的基本移动,所以如果可以使用它来完成,那就太好了(尽管它不是必须的)。
我想不出一种快速、简洁的方式来解释我想要完成的事情(这使得在谷歌上很难找到答案),所以我将在这里尝试详细说明。我想要完成的是将 a 移动UIImageView
到 iPhone 屏幕的顶部边缘,然后继续向上移动,但是一旦图像通过顶部边缘,它就会出现在屏幕底部,因为它会继续移动。
我一直在使用基本[UIView commitAnimations]
命令在我的应用程序中进行对象的基本移动,所以如果可以使用它来完成,那就太好了(尽管它不是必须的)。
你不需要弄乱滚动视图或切换到 cocos2d 来实现简单的动画。您需要做的就是创建 2 个 CALayer 对象,然后将 layer.contents 分配给同一个图像。
CALayer *layer1 = [CALayer layer]
CALayer *layer2 = [CALayer layer]
UIImage *image = [UIImage imageNamed:@"whatever.png"];
layer1.contents = (id) image.CGImage;
layer2.contents = (id) image.CGImage;
然后使用正常动画来更新两帧的位置,如Apple QA 文档所述。您只需要确定窗口的高度,然后确保 2 个 CALayer 的起点和终点 Y 点始终为 1 个高度差。因此,当 layer1 动画到 Y = -1 时,这意味着 layer2 将在 Height-1。只有当两层都部分暴露时,你才能看到两者,这就是你如何让这种效果起作用并且似乎只有一层。
实现这一点的最佳方法是创建一个 CCNode 子类,该子类将包含第一个和第二个精灵,并在需要时交换它们。这样,您的所有逻辑都将非常简单。您将只使用一个 CCNode(子类)并且不会考虑交换精灵 - 这将由您的班级自动完成
@interface MyNode : CCNode
{
CCSprite *sprite1;
CCSprite *sprite2;
CCSprite *currentSprite;
bool isChanging; //indicates that now two sprites are visible
}
@end
我想你可以用 UIScrollView 来做到这一点......这是我不久前在循环滚动视图上写的东西。
我首先将内容大小设置为窗口的高度,图像视图位于一侧。当图像从可见区域滚出时,下一页将进入另一个图像,看起来相同但实际上不同。我认为这可以为您节省大量帧计算、嵌套动画块和其他混乱。您当然可以使用离散视图来做到这一点,但我认为这可能是在重新发明轮子。