如何在 UINavigationItem titleView 中创建淡入淡出 in/out 动画?

How to create fade in/out animations in UINavigationItem titleView?

我想创建像 iOS 音乐应用这样的 titleView 动画!在 iOS 音乐应用中,您可以看到很酷的动画。当您从“我的音乐”(例如)中 select 艺术家或专辑然后将它们向上滚动时,您可以看到淡入动画出现在 UINavigationBar 上,并且当您回到原始位置时也会消失!

你可以用UIView.transitionWithView做一个动画。在这种情况下,将单词 ipsum 淡化为绿色:

let rangeOfText = (textViewForPlayer.text as NSString).rangeOfString("ipsum", options: nil)
let stringForPlayer = textViewForPlayer.attributedText.mutableCopy() as NSMutableAttributedString

UIView.transitionWithView(self.textViewForPlayer, duration: 1.0, options: .TransitionCrossDissolve, animations: { () -> Void in
    stringForPlayer.addAttribute(
        NSForegroundColorAttributeName,
        value: UIColor.greenColor(),
        range: rangeOfText)
    self.textViewForPlayer.attributedText = stringForPlayer
    }, completion: nil)

你可以用UIView.transitionWithView做一个动画。在这种情况下,将单词 ipsum 淡化为绿色:

let rangeOfText = (textViewForPlayer.text as NSString).rangeOfString("ipsum", options: nil)
let stringForPlayer = textViewForPlayer.attributedText.mutableCopy() as NSMutableAttributedString

UIView.transitionWithView(self.textViewForPlayer, duration: 1.0, options: .TransitionCrossDissolve, animations: { () -> Void in
    stringForPlayer.addAttribute(
        NSForegroundColorAttributeName,
        value: UIColor.greenColor(),
        range: rangeOfText)
    self.textViewForPlayer.attributedText = stringForPlayer
    }, completion: nil)

如您所见,这非常简单。

在此动画期间让文本收缩和增长是一个完全不同的蜡球,因为简单地尝试更改文本的大小将导致文本视图的其余部分重新布局,我敢肯定这不是你的本意。

在那种情况下,我可能会为文本视图的那部分拍摄快照,将快照放在文本视图上,为调整大小和转换设置动画。所有这些都假设您在动画结束时将其转换为与之前完全相同的大小(否则您会遇到一个复杂的问题,即在动画期间如何处理其余文本)。

实现特定动画需要大量工作。我会问你是否可以通过其他方式更简单地实现所需的效果(例如嵌套动画,将文本颜色淡化为清除,然后将其淡化为新颜色,使其达到一点 "disappear and reappear" 的感觉) .这使得转换更加显着,同时不会迷失在一堆动画代码中。

你可以用UIView.transitionWithView做一个动画。在这种情况下,将单词 ipsum 淡化为绿色:

let rangeOfText = (textViewForPlayer.text as NSString).rangeOfString("ipsum", options: nil)

let stringForPlayer = textViewForPlayer.attributedText.mutableCopy() as NSMutableAttributedString


UIView.transitionWithView(self.textViewForPlayer, duration: 1.0, options: .TransitionCrossDissolve, animations: 
{ () -> Void in
    stringForPlayer.addAttribute(
        NSForegroundColorAttributeName,

        value: UIColor.greenColor(),

        range: rangeOfText)
    self.textViewForPlayer.attributedText = stringForPlayer
    }, completion: nil)

如您所见,这非常简单。

在此动画期间让文本收缩和增长是一个完全不同的蜡球,因为简单地尝试更改文本的大小将导致文本视图的其余部分重新布局,我敢肯定这不是你的本意。

在那种情况下,我可能会为文本视图的那部分拍摄快照,将快照放在文本视图上,为调整大小和转换设置动画。所有这些都假设您在动画结束时将其转换为与之前完全相同的大小(否则您会遇到一个复杂的问题,即在动画期间如何处理其余文本)。

实现特定动画需要大量工作。我会问你是否可以通过其他方式更简单地实现所需的效果(例如嵌套动画,将文本颜色淡化为清除,然后将其淡化为新颜色,使其达到一点 "disappear and reappear" 的感觉) .这使得转换更加显着,同时不会迷失在一堆动画代码中。

如果您想在将其淡化为所需颜色之前将其淡化为 clearColor(使其 "pop" 多一点),您可以使用完成块:

UIView.transitionWithView(self.textViewForPlayer, duration: 0.25, options: 
.TransitionCrossDissolve, animations: { () -> Void in

    stringForPlayer.addAttribute(

        NSForegroundColorAttributeName,

        value: UIColor.clearColor(),

        range: rangeOfText)

    self.textViewForPlayer.attributedText = stringForPlayer

    }, completion: { (finished) -> Void in

        UIView.transitionWithView(self.textViewForPlayer, duration: 0.25,
 options: .TransitionCrossDissolve, animations: { () -> Void in

            stringForPlayer.addAttribute(

                NSForegroundColorAttributeName,

                value: UIColor.greenColor(),

                range: rangeOfText)

            self.textViewForPlayer.attributedText = stringForPlayer

            }, completion: nil)
})