【问题标题】:problem with uiimageView animationuiimageView动画的问题
【发布时间】:2011-07-22 18:38:59
【问题描述】:

这是我的代码:

-(void) createNewImage {
UIImage * image = [UIImage imageNamed:@"boutonplay_03.png"];
imageView = [[UIImageView alloc] initWithImage:image];

[imageView setCenter:[self randomPointSquare]];
[[self view] addSubview:imageView];
ix=imageView.center.x;
iy=imageView.center.y;

X=(240-ix)/230;
Y=(160-iy)/230;

}

-(void)Animation{

imageView.center = CGPointMake(imageView.center.x + X, imageView.center.y + Y);

}

“CreateNewImage”每2秒调用一次,“Animation”上有一个CADisplayLink。

我的问题是“imageView”的动画每 2 秒停止一次,因为创建了一个新的“imageView”并且最后一个开始移动,并且在 2 秒后再次停止,一次又一次地停止......我会就像是让“imageView”继续他的动画,尽管创建了新的“imageView”。请问我该怎么做?对不起我的英语我是法国人:/

【问题讨论】:

    标签: iphone xcode animation uiimageview allocation


    【解决方案1】:

    检查 imageView 是否 == nil。

    if (imageView == nil) {
     imageView = [[UIImageView alloc] initWithImage:image];
    }
    //rest of code
    

    【讨论】:

    • 你的代码有一个问题:imageView 是动画的,但几秒钟后它消失了,另一个图像 imageView 被创建并且它是动画的等等......
    • 我实现了,有问题,我的评论是问题
    • 您的评论没有意义。您已经用一句话总结了您的问题,实际上并没有概述您似乎收到的任何其他问题。
    • 是的,但我不知道你为什么写" if (imageView == nil)" 我真的不明白
    • 因为您不需要重新实例化非 nil 变量。这就是导致整个问题的原因。如果不一次又一次地声明imageView,就不会报错。
    【解决方案2】:

    每次调用 CreateNewImage 时都会创建一个新的 UIImageView

    相反,检查它是否已经创建。

    -(void) createNewImage {
    if(imageView == nil) {
         UIImage * image = [UIImage imageNamed:@"boutonplay_03.png"];
         imageView = [[UIImageView alloc] initWithImage:image];
    }
    
    [imageView setCenter:[self randomPointSquare]];
    [[self view] addSubview:imageView];
    ix=imageView.center.x;
    iy=imageView.center.y;
    
    X=(240-ix)/230;
    Y=(160-iy)/230;
    
    }
    

    【讨论】:

    • 你的代码有一个问题:imageView 是动画的,但几秒钟后它消失了,另一个图像 imageView 被创建并且它是动画的等等
    【解决方案3】:

    如果我正确理解你的情况,会发生什么:

    1. 你在createNewImage中创建一个新图像;

    2. 这个图片是通过方法动画的:

      -(void)Animation{
         imageView.center = CGPointMake(imageView.center.x + X, imageView.center.y + Y);
      }
      

      它使您的imageView ivar 动画化;

    3. 创建新图像时,2秒后,将其重新分配给imageView ivar,以便Animation方法在调用时对其进行动画处理;

    4. 同时,您丢失了对之前制作动画的先前图像的引用,因此 Animation 将不再对其进行动画处理。

    现在我建议尝试以这种方式更改Animation:

        -(void)Animation{
           for (UIView* imgView in self.view.subviews) {
                imgView.center = CGPointMake(imgView.center.x + X, imgView.center.y + Y);
           }
        }
    

    因此,这将简单地为您的主视图的 any 子视图设置动画。如果您唯一的子视图是您想要动画的图像,那应该没问题。

    编辑:

    根据您在 cmets 中的描述,在我看来,addSubview 的作用是立即停止所有动画。我不知道这是否与从磁盘加载图像有关,但我记得我前段时间也遇到过类似的问题。我看到的唯一方法是预先创建和预先添加您需要的所有 UIImageViews(或允许的最大数量的图像),将它们全部隐藏,然后让它们一个一个地再次可见。这会使您的程序的逻辑更加复杂,但它会起作用。

    另一种方法是使用CALayers 代替UIVIews。最好的办法是使用 CABasicAnimation 为您的图像设置动画。

    如果你想使用 UIImageView,你可以得到[imageView layer] 并添加这个而不是视图,像这样:

    [[self.view layer] addSublayer:[imageView layer]];
    

    但我不确定这种方法是否可行。

    希望他的帮助。

    【讨论】:

    • 你的代码还有另一个问题 imageView 是动画的,但总是卡在新 imageView 的新位置
    • 我试了一下,问题是我之前的评论
    • 奇怪,因为我们现在正在移动imgView.center,它应该与您创建的最后一个imageView 的新位置无关......
    • 发生的事情是非常奇怪的 imageView 被创建并且它移动然后它停止并且另一个 imageView 被创建并移动并且两个图像移动到相同的方向等等......
    • 我看到了:由于内存,您的第一个建议是不可能的,第二个我不太明白,因为我从不使用图层,然后 CABasicAnimation 是不可能的,因为我使用 CGRectIntersect 和CABasicAnimation 是不可能的所以我不知道该怎么办
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-23
    • 2018-06-16
    • 1970-01-01
    相关资源
    最近更新 更多