iOS 动画 - 像 Siri 一样向上滚动文字

Posted

技术标签:

【中文标题】iOS 动画 - 像 Siri 一样向上滚动文字【英文标题】:iOS animation - upward scroll of text like Siri 【发布时间】:2014-07-30 21:16:18 【问题描述】:

我希望在我的 ios 应用程序中添加一个动画,该动画几乎与您在使用 Siri 时看到的动画相同,它会显示您可以提出的可能问题。

效果是向上滚动的文本被多于来自下方的内容所取代,但效果是一种方式,并非所有问题都一起移动,它们似乎是独立的并且相互跟随。

我喜欢这个动画并想在我的应用程序中模拟它 - 但我不知道如何解决这个问题。到目前为止,我在应用程序中唯一参与的动画是 CrossDissolve、FlipFromLeft 等。

有没有人知道一个教程可以教授这样的效果,或者可以为我指出正确的开始方向?

在此先感谢大家。

【问题讨论】:

我刚刚看了一个关于动画的 WWDC 视频。他们表示,对于他们使用的特定 siri 动画:[UIView animateWithDuration:delay:usingSpringWithDamping:initialSpringVelocity:options:animations:completion:]。他们如何使用它是另一回事。 @WilliamGeorge 嗯...我不认为他正在谈论的动画使用这种方法。它更有可能使用关键帧动画,因为动画具有三个独立的部分。是哪个 WWDC 会议? @Fogmeister asciiwwdc.com/2014/sessions/221 - 搜索We use a single Spring Animation to pull the text onscreen @WilliamGeorge 好吧。其实有道理。需要比我的答案更多的代码,但我的答案会做同样的事情:) 只是略有不同。 @WilliamGeorge 更新了我的答案。但是如果这台笔记本电脑上没有 Xcode,我不会尝试对其进行编码,哈哈。 【参考方案1】:

快速浏览一下,它看起来相当简单。

动画可以分为几个阶段。

首先,有 5 个 UILabels 分别动画。每个标签在前一个标签上都有很短的延迟。

每个标签都像这样动画......

    将标签的边框设置在屏幕下方,并将 alpha 设置为 0.0。 在大约 0.2 秒的持续时间内,将标签的框架设置为在屏幕上高出大约 300 点和 1.0 的 alpha。 在大约 2 或 3 秒内将标签的框架设置为在屏幕上高出大约 30 个点。 在屏幕上将标签的帧动画再高出 300 点,并在大约 0.2 秒内再次将 alpha 恢复为 0.0。 更改标签上的文字并重复。

我认为最简单的方法是使用方法...

+ (void)animateKeyframesWithDuration:(NSTimeInterval)duration
                               delay:(NSTimeInterval)delay
                             options:(UIViewKeyframeAnimationOptions)options
                          animations:(void (^)(void))animations
                          completion:(void (^)(BOOL finished))completion

让我在实际代码中尝试一下,然后回复您。代码完成有很大帮助。

好的,这就去

该死,我刚刚安装了 Yosemite,没有 Xcode。好的,我这就去试试……

- (void)animateLabels:(NSArray *)labels

    CGFloat firstLabelStartTop = 600;

    [labels enumerateObjectsUsingBlock:^(UILabel *label, NSUInteger idx, BOOL *stop) 
        CGFloat delay = 0.1 * idx;

        label.frame = CGRectMake(0, firstLabelStartTop + 30 * idx, 320, 21);
        label.alpha = 0.0;

        [UIView animateKeyFramesWithDuration:2.4
                                       delay:delay
                                     options:0
                                  animations:^
                                      [UIView addKeyframeWithRelativeStartTime:0.0
                                                              relativeDuration:0.1
                                                                    animations:^
                                                                        label.alpha = 1.0;
                                                                        label.frame = CGRectOffset(label.frame, 0, -200);
                                                                    ];
                                      [UIView addKeyframeWithRelativeStartTime:0.1
                                                              relativeDuration:0.9
                                                                    animations:^
                                                                        label.frame = CGRectOffset(label.frame, 0, -30);
                                                                    ];
                                      [UIView addKeyframeWithRelativeStartTime:0.9
                                                              relativeDuration:0.1
                                                                    animations:^
                                                                        label.alpha = 0.0;
                                                                        label.frame = CGRectOffset(label.frame, 0, -200);
                                                                    ];
                                  
                                  completion:nil];
    ];

这是第一次在没有 Xcode 的情况下检查我的代码并且根本无法运行它,所以它可能并不完美,但它应该让您知道从这里开始的地方。

编辑

从@WilliamGeorges 的评论看来,他们使用了我在my blog 中详述的方法,使用了完全独立的动画组合。

您必须在每个标签上制作 3 个单独的动画,但它仍然与我在此答案中提出的想法相似。

【讨论】:

嗨 Fogmeister,我尝试了你的代码,但我收到了这样的错误 -[__NSCFConstantString setFrame:]: unrecognized selector sent to instance 0xa22f8 你能纠正这个错误吗?在这一行它显示错误标签.frame = CGRectMake(0, firstLabelStartTop + 30 * idx, 320, 21); @MANCHIKANTIKRISHNAKISHORE 这是因为您正在尝试设置NSString 的框架。 NSString 没有 frame。您需要设置 UILabelUITextField 的框架或用于显示字符串的任何内容。 感谢您的回复 Fogmeister ...错误已解决...非常感谢您在代码中更改的几行代码... kishoremk.blogspot.in/2015/01/siri-lables-animation-in-ios.html参考这个链接

以上是关于iOS 动画 - 像 Siri 一样向上滚动文字的主要内容,如果未能解决你的问题,请参考以下文章

文字向上向左滚动

如何在 iOS 音乐 App 中向上滚动时实现 UINavigationBar 动画?

滚动时为值设置动画

像 Chrome ios 一样复制持久/快速滚动

UIScrollView 像 pageControl 一样向上滚动显示

iOS11 中奇怪的 uitableview 行为。单元格通过导航推送动画向上滚动