使用 UIView 动画时处理、删除和添加 UILabel

Posted

技术标签:

【中文标题】使用 UIView 动画时处理、删除和添加 UILabel【英文标题】:Handling, removing and adding UILabels while using UIView Animation 【发布时间】:2013-03-08 15:13:35 【问题描述】:

我的时间轴应用程序控件出现了另一个问题。

我的 TimelineView 上有一定数量的 UILabel 继承自 UIView。

我实现了一个滚动功能,它工作得很好。当一个元素到达底部时,它会被删除,并在第一个元素上方添加另一个 UILabel,反之亦然。Classes 委托中有一个标签数组,其中存储和删除所有 UIlabels(TimeLabels)。(对于以后的实现很重要小时/天等 - 动态加载,因此内存使用率会很低)

现在我想在释放触摸手势(通过 touchesEnded)后以一定的速度做一个缓出动画,这是正确计算的。它与 UIView 动画配合得很好:

speed/=3;
for(TimeLabel *movingLabel in self.delegate.labels)
    NSLog(@"%i",movingLabel.time);
    [UIView beginAnimations:@"" context:NULL];
    [UIView setAnimationDuration:2.0];
    [UIView setAnimationCurve:UIViewAnimationCurveEaseOut];


    CGRect movingFrame = [[movingLabel.layer presentationLayer] frame];
    NSLog(@"%f",movingFrame.origin.y);

    movingLabel.frame = CGRectMake(7, movingLabel.frame.origin.y+speed, 200, 25);

    [UIView commitAnimations];


所有标签的动画都正确完成。

但是当我想扩展我的方法(上面未显示)时,当标签的位置低于应用程序的框架高度时,它不会被丢弃(即使使用presentationLayer,根据其他people, 是在动画时获取当前位置的可能性。但它只在记录时显示每个标签的结束位置......)。

所以我的问题是:甚至可以通过在制作动画时检查它的位置来删除 UILabel 吗?和这个问题一样重要:是否可以插入一个新的 UILabel 和例如添加已移除的标签层,以便开始的动画可以使用新的动画恢复?

如果这些事情是不可能的:是否有另一种方法可以在不实现全新动画的情况下实现这样的缓动动画?

很难解释它到底应该是什么样子,但我希望我能正确描述我的问题,并且有人能够帮助我。

您好,

阿斯加罗斯

【问题讨论】:

您应该尝试将 begin 和 commit 与 UIView 动画属性一起移到 for 循环之外。 没有改变它。无论如何感谢您的提示 嗯,无论哪种方式都值得一试,尽管将开始和提交放在 for 循环之外更有效:) 【参考方案1】:

听起来您只是希望动画在某些情况下在不同的 y 位置完成。做到这一点的简单方法(如果我正确理解了这个问题)是计算要删除标签的 y 位置,动画到那里,然后添加......

[UIView setAnimationDidStopSelector:@selector(removeFromSuperview)];

您说“低于框架高度”。那是标签超级视图的框架高度吗?如果是,将label.frame.origin.y的结束位置设置为label.superview.bounds.size.height

【讨论】:

试过似乎是当时对我来说最好的解决方案。非常感谢!

以上是关于使用 UIView 动画时处理、删除和添加 UILabel的主要内容,如果未能解决你的问题,请参考以下文章

UIView 动画只工作一次

以编程方式添加 UIView 后,使用约束对其进行动画处理

使用自动布局动画 UIView 动画 UITableView 复选标记

动画 UIView 时的奇怪效果

为啥UIView动画会改变View frame?

+[UIView transitionFromView:toView:...] 有多个视图