代码之家  ›  专栏  ›  技术社区  ›  carlos

动画后,视图位置重置

  •  27
  • carlos  · 技术社区  · 16 年前

    我正试图使视图从上到下滑动。这没什么大不了的,我用过 CABasicAnimation 为此。问题是当我想删除视图时。我用这个动画。

    CABasicAnimation *animation;
    animation = [CABasicAnimation animationWithKeyPath:@"position"];
    [animation setDelegate:self];
    animation.toValue = [NSValue valueWithCGPoint:CGPointMake(self.view.layer.position.x, 0 - self.view.bounds.size.height / 2)];
    animation.fromValue = [NSValue valueWithCGPoint:self.view.layer.position];
    animation.autoreverses = NO;
    animation.repeatCount = 0;
    animation.duration = 0.25;
    animation.timingFunction = [CAMediaTimingFunction functionWithName: kCAMediaTimingFunctionEaseInEaseOut];
    [self.view.layer  addAnimation:animation forKey:@"moveX"];
    

    使视图具有完美的动画效果。但是,动画完成后,我的视图再次出现。所以我加了一行:

    [self.view removeFromSuperview];
    

    它删除了视图,但没有动画。所以我决定将移除代码添加到这个委托中:

    -(void) animationDidStop:(CAAnimation *) animation finished:(bool) flag
    

    所以现在,动画工作了,视图消失了,但有时,我可以看到视图出现和消失得更快,就像动画之后,视图出现了,然后 animationDidStop 委托被调用,视图消失,显然这很糟糕。我做错什么了?

    6 回复  |  直到 16 年前
        1
  •  15
  •   tipycalFlow    13 年前

    根据苹果公司的样品“moveme”,这个( 删除完成 )不过,这似乎不管用。

    因此,在代码后添加这些行:

    [self.view.layer  addAnimation:animation forKey:@"moveX"];
    self.view.layer.position = [animation.toValue CGPointValue];
    

    这样可以确保动画运行后,层的位置正确。

        2
  •  66
  •   FreeAsInBeer Jeff    12 年前

    可能需要设置这些属性。它们会在动画结束时保留演示文稿。

    animation.fillMode = kCAFillModeForwards;
    animation.removedOnCompletion = NO;

    然后可以使用“AnimationDidstop:”方法删除动画结尾处的视图:

    -(void) animationDidStop:(CAAnimation *) animation finished:(bool) flag {
        if (animation == [containerView.layer animationForKey:@"moveX"]) {
            // remove view here, add another view and/or start another transition
        }
    }
    
        3
  •  3
  •   FreeAsInBeer Jeff    12 年前

    我在动画组中执行几个动画时遇到了这个问题。我必须在动画组本身设置一些属性,而不是单独的动画。

    CAAnimationGroup *animGroup = [CAAnimationGroup animation];
    
    // MAKE SURE YOU HAVE THESE TWO LINES.
    animGroup.removedOnCompletion = NO;
    animGroup.fillMode = kCAFillModeForwards;
    
    animGroup.animations = [NSArray arrayWithObjects:moveAnim, scaleAnim, nil];
    animGroup.duration = tAnimationDuration;
    [tImageView.layer addAnimation:animGroup forKey:nil];
    
        4
  •  0
  •   Ben Gottlieb    16 年前

    这个也咬了我。您希望将动画的removedOnCompletion标志设置为否。它默认为是,这意味着动画完成后,它将被删除,视图将恢复到初始状态。

        5
  •  0
  •   DD_ NiravPatel    12 年前

    按照Rob的建议将视图设置为隐藏,应该这样做。

    对于属性的属性,我将使用objc 2.0样式,就像您的代码中已有的样式一样。

    set.view.hidden = YES;
    
        6
  •  -2
  •   DD_ NiravPatel    12 年前

    可以将视图的隐藏属性设置为“是”吗?

    我想应该是:

    self.view.hidden = YES;
    

    但可能是:

    [self.view setHidden:YES];
    

    我发现我很难找到正确的方法来访问财产。