执行子视图子类的动画
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 子视图