执行子视图子类的动画

Posted

技术标签:

【中文标题】执行子视图子类的动画【英文标题】:Execute animation of subview subclass 【发布时间】:2014-10-17 09:33:42 【问题描述】:

我有一个名为 ParentViewController 的 UIViewController。 我有一个名为 CustomView 的 UIView 自定义类。它包括一些ImageView和执行动画的功能。

CustomView.h

@interface CustomView : UIView
@property (weak, nonatomic) IBOutlet UIImageView *human;
@property (weak, nonatomic) IBOutlet UIImageView *shadow;
+ (id)CustomView;
- (void)executeAnimation;
@end

在 CustomView.m 中,我执行如下动画:

-(void)executeAnimation
    self.animation1InProgress = YES;
    [UIView animateKeyframesWithDuration:3.0 delay:0.0 options:UIViewAnimationCurveLinear animations:^
        self.human.frame = CGRectMake(self.human.frame.origin.x, self.human.frame.origin.y + 300, self.human.frame.size.width, self.human.frame.size.height);
     completion:^(BOOL finished)
        self.animation1InProgress = NO;
    ];

现在在 ParentViewController.m 中,我添加了没有任何动画的 CustomView

//init custom
customView = [CustomView initCustomView];
[self.view addSubview:centerLocationView];

这段代码没问题。我可以初始化并将Subview 添加到ParentViewController。 但是每当我想执行有关 CustomView 的动画时。我在 ParentViewController.m 中调用以下编码:

[customView executeAnimation];

父视图没有任何变化。 有人知道在 ParentViewController 上执行这个动画的方法吗?

提前致谢。

【问题讨论】:

【参考方案1】:

如果你真的想使用+[UIView animateKeyframesWithDuration:delay:options:animations:completion:],你应该在你的animations块中添加关键帧:

-(void)executeAnimation
    self.animation1InProgress = YES;
    [UIView animateKeyframesWithDuration:3.0 delay:0.0 options:UIViewAnimationCurveLinear animations:^
        [UIView addKeyframeWithRelativeStartTime:0.0 relativeDuration:1.0 animations:^
            self.human.frame = CGRectMake(self.human.frame.origin.x, self.human.frame.origin.y + 300, self.human.frame.size.width, self.human.frame.size.height);
        ];
     completion:^(BOOL finished)
        self.animation1InProgress = NO;
    ];

否则,请使用[UIView animateWithDuration:animations:completion:]

-(void)executeAnimation
    self.animation1InProgress = YES;
    [UIView animateWithDuration:3.0 delay:0.0 options:UIViewAnimationCurveLinear animations:^
        self.human.frame = CGRectMake(self.human.frame.origin.x, self.human.frame.origin.y + 300, self.human.frame.size.width, self.human.frame.size.height);
     completion:^(BOOL finished)
        self.animation1InProgress = NO;
    ];

【讨论】:

感谢您的快速回复。我试过了,ParentView 可以看到执行的动画。非常感谢你。但是,您能帮我解释一下 addKeyframeWithRelativeStartTime 和 relativeDuration 吗? 另外,在这种情况下,执行动画完成后。 human.frame 重置为原始位置。它应该是 self.human.frame.origin.y + 300。但现在不是 当您更新animations 块内的动画属性时,您实际上更新了动画层,而不是表示层。您需要再次将self.human.frame 设置为正确的值,但不在animations 块内。详情查看这篇文章:Animations Explained

以上是关于执行子视图子类的动画的主要内容,如果未能解决你的问题,请参考以下文章

iPhone UIView 动画禁用 UIButton 子视图

用动画调整 UIView 的大小,子视图不会动画

我继承了 UIView。它的一些子视图是动画的。重新启动这些的正确方法是啥?

如何为输入附件视图的高度设置动画?

如果父视图正在动画,则 IOS7 子视图会被动画

更改 UICollectionViewCell 子视图框架