【问题标题】:Transition Navigation Bar Title过渡导航栏标题
【发布时间】:2014-04-08 15:05:19
【问题描述】:

在名为“Luvocracy”的应用中,当用户在屏幕上向上滑动时,导航栏的标题会发生变化。旧标题被推上去,而新标题被过渡进来。我现在没有它的视频,但这里有一些屏幕截图:

https://www.dropbox.com/s/sns0bsxkdv7pw3l/Photo%20Apr%2008%2C%2011%2001%2005%20AM.png

https://www.dropbox.com/s/ys9a49u3dyxrlcm/Photo%20Apr%2008%2C%2011%2001%2009%20AM.png

https://www.dropbox.com/s/dlcfvfvqqov3ag7/Photo%20Apr%2008%2C%2011%2001%2013%20AM.png

如何在如图所示的新导航栏标题中设置动画或过渡?

编辑:应用商店不再提供该应用,因此我无法上传此操作的视频。

【问题讨论】:

  • 我的猜测是他们在导航栏中有一个自定义视图,他们在其中执行动画。
  • 我该怎么做?
  • 你试过什么?听上去好像是要代码,请自己解决问题
  • 对不起,我还没有真正尝试过任何东西。我了解如何向导航栏添加自定义视图,但是当我滚动到视图顶部时,如何“推”新标题?

标签: ios objective-c animation uinavigationbar transition


【解决方案1】:

您可以使用 CATransition 为标题更改设置动画...但是,由于标题本身是导航栏上的私有属性,因此您需要首先创建一个自定义标签并将其附加到导航项。

设置标题标签(这将覆盖默认导航栏的标题):

UILabel *titleLabelView = [[UILabel alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 100.0f, 44.0f) /* auto-sized anyway */];
titleLabelView.backgroundColor = [UIColor clearColor];
titleLabelView.textAlignment = NSTextAlignmentCenter;
titleLabelView.textColor = [UIColor blackColor];
titleLabelView.font = [UIFont systemFontOfSize:16.0f];
titleLabelView.adjustsFontSizeToFitWidth = YES;
titleLabelView.text = @"@cracy123";
self.navigationItem.titleView = titleLabelView;

然后,当您想要为标题更改设置动画时(假设在滚动视图委托操作上),添加一个 CAAnimation 层和 presto:

CATransition *animation = [CATransition animation];
animation.duration = 1.0;
animation.type = kCATransitionPush;
animation.subtype = kCATransitionFromTop;
animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
[self.navigationItem.titleView.layer addAnimation:animation forKey:@"changeTitle"];

((UILabel*)self.navigationItem.titleView).text = @"JACOB K";

您显然可以更改 CATransition 动画属性来获得您想要的效果,但这些会给您“俯卧撑”效果。

【讨论】:

  • 感谢您的快速回答!所以我希望应用它的方式是我有一个表格视图,上面有一个“标题”,这是我的游戏徽标。当我向上滚动我的表格视图时,我希望这个图像向上移动并变小,并最终移动到导航栏的标题视图中。这可能吗?
  • 理论上你可以这样做,但会非常繁琐地为视图设置动画以使它们进入位置(并非不可能,但即使你收到,你也必须为每个滚动移动框架 1px,如果这是有道理的)。您最好在 UITableView 标头中复制 UINavigationBar 样式(即不是实际的导航栏),然后您就可以更轻松地控制 tableview 标头高度/标签
  • 我可以让图像成为表格标题,当图像在导航栏下滚动时,它会像上面显示的动画一样向上滑动到标题视图中?
  • 这可能行得通——在野外有一个类似的 tableview 子类可以做人们所说的视差(即使它在技术上不是“视差”;))——这会让你获得 50%那里的路 - github.com/pyro2927/ParallaxBlur
  • 非常有趣...感谢这些链接...如果我可以稍微调整一下,我认为第二个可能是我正在寻找的...
【解决方案2】:

仅仅因为缺少 Swift 答案,这里是 Gavin 答案的 Swift 实现:

设置自定义标题标签:

let titleLabelView = UILabel.init(frame: CGRect(x: 0, y: 0, width: 0, height: 44))
titleLabelView.backgroundColor = UIColor.clearColor()
titleLabelView.textAlignment = .Center
// this next line picks up the UINavBar tint color instead of fixing it to a particular one as in Gavin's solution
titleLabelView.textColor = UINavigationBar.appearance().tintColor
titleLabelView.font = UIFont.boldSystemFontOfSize(16.0)
titleLabelView.text = "Old Title"
self.navigationItem.titleView = titleLabelView

这是标题动画代码:

let titleAnimation = CATransition()
titleAnimation.duration = 0.5
titleAnimation.type = kCATransitionPush
titleAnimation.subtype = kCATransitionFromTop
titleAnimation.timingFunction = CAMediaTimingFunction.init(name: kCAMediaTimingFunctionEaseInEaseOut)

navigationItem.titleView!.layer.addAnimation(titleAnimation, forKey: "changeTitle")
(navigationItem.titleView as! UILabel).text = "New Title"

// I added this to autosize the title after setting new text
(navigationItem.titleView as! UILabel).sizeToFit()

【讨论】:

    【解决方案3】:

    这是一个很好的答案,但我需要进行一些调整才能让它正确。

    所以一般的想法是,您的 scrollView 中间有一个文本,当用户向上滚动该文本时,您希望它成为新标题。此外,当您向下滚动时,您希望它改回默认标题。

    所以,使用 Gix 发布的代码,现在已转换为 Swift 3,这就是你完成它的方法。

    将这些变量添加到 viewController 的顶部

    var didChangeTitle = false
    let defaultTitle = "Default Title"
    let animateUp: CATransition = {
        let animation = CATransition()
        animation.duration = 0.5
        animation.type = kCATransitionPush
        animation.subtype = kCATransitionFromTop
        animation.timingFunction = CAMediaTimingFunction.init(name: kCAMediaTimingFunctionEaseInEaseOut)
        return animation
    }()
    let animateDown: CATransition = {
        let animation = CATransition()
        animation.duration = 0.5
        animation.type = kCATransitionPush
        animation.subtype = kCATransitionFromBottom
        animation.timingFunction = CAMediaTimingFunction.init(name: kCAMediaTimingFunctionEaseInEaseOut)
        return animation
    }()
    

    在您的 viewDidLoad 中,添加此代码以设置默认标题。

    let titleLabelView = UILabel.init(frame: CGRect(x: 0, y: 0, width: 200, height: 44))
    titleLabelView.backgroundColor = .clear
    titleLabelView.textAlignment = .center
    titleLabelView.textColor = UINavigationBar.appearance().tintColor
    titleLabelView.font = UIFont.boldSystemFont(ofSize: 16)
    titleLabelView.text = defaultTitle
    self.navigationItem.titleView = titleLabelView
    

    现在您将一些代码添加到您的 scrollView 委托函数中:

    extension MyViewController: UIScrollViewDelegate {
        func scrollViewDidScroll(_ scrollView: UIScrollView) {
            if scrollView.contentOffset.y >= (labelName.frame.origin.y + labelName.frame.height) && !didChangeTitle {
                if let label = navigationItem.titleView as? UILabel {
                    label.layer.add(animateUp, forKey: "changeTitle")
                    label.text = labelName.text
                }
                didChangeTitle = true
            } else if scrollView.contentOffset.y < labelName.frame.origin.y && didChangeTitle {
                if let label = navigationItem.titleView as? UILabel {
                    label.layer.add(animateDown, forKey: "changeTitle")
                    label.text = defaultTitle
                }
                didChangeTitle = false
            }
        }
    }
    

    “labelName”变量是滚动视图中包含未来标题的标签。

    【讨论】:

      【解决方案4】:

      这是一个例子:

      UILabel *titleLabelView = [[UILabel alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 100.0f, 100.0f) /* auto-sized anyway */];
      titleLabelView.backgroundColor = [UIColor clearColor];
      titleLabelView.textAlignment = NSTextAlignmentCenter;
      

      (和其他应用程序)

      self.navigationItem.titleView = LabelView;
      

      我不太明白你的问题!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-10-29
        • 2012-03-01
        • 1970-01-01
        • 2017-12-07
        • 1970-01-01
        • 1970-01-01
        • 2017-01-13
        • 1970-01-01
        相关资源
        最近更新 更多