【问题标题】:Push animation without shadows and blackouts没有阴影和停电的推送动画
【发布时间】:2014-04-30 19:45:50
【问题描述】:

我有一个简单的基于 iOS NavigationController 的应用程序。两个UICollectionViews,一个接一个。如果点击了“第一个集合”上的元素,则将打开“第二个集合”。 很简单。

重要提示:

UICollectionViews 都具有透明背景。使用navigationController 的通用背景颜色。(从UINavigationController 继承的类)

问题: 如果理解正确,NavigationController 的 push 方法是按照算法工作的:

  1. 推送视图已创建。
  2. 透明的灰色叠加层推送视图上创建。
  3. NavigationController 使用标准动画推送视图。 (灰色覆盖层仍然存在)
  4. 灰色覆盖消失。

(如果推送视图有透明背景,则灰色竖线可见)

Screenshot

下一步: 我试图通过覆盖推送方法来解决这个问题。这是我得到的:

- (void)pushViewController:(UIViewController *)viewController 
                           animated:(BOOL)animated
{
    CATransition *transition = [CATransition animation];
    transition.duration = 0.45;
    transition.timingFunction = [CAMediaTimingFunction 
           functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
    transition.type = kCATransitionPush;
    transition.subtype = kCATransitionFromRight;
    transition.fillMode = kCAFillModeForwards;
    transition.delegate = self;
    [self.view.layer addAnimation:transition forKey:nil];

    [super pushViewController:viewController animated:animated];
}

这种方式创建了自己的推送动画,但使用了另一个标准动画,我无法删除。 (显示和隐藏视图中断)

Screenshots_1_and_2

问题: “如何在没有淡入淡出、黑屏和其他动画滤镜的情况下推送 ViewController?”

带有主题名称的解决方案(在 stackoverflow.com 上)

  • iOS 7 UINavigationController推送动画阴影
  • iOS 7 在导航的自定义动画中显示黑色背景

不工作。

【问题讨论】:

    标签: ios objective-c ios7


    【解决方案1】:

    不要覆盖 push 方法。 iOS7 允许您为自定义过渡提供动画控制器。有关详细信息,请参阅here

    【讨论】:

    • 这很好,但为什么不将“动画”设置为“否”?
    • 我从问题中了解到 OP 想要动画而不是阴影。阅读问题。
    • 问题是,我需要标准的推送动画,但没有这种阴影等
    • @OrenciucEvghenii 如果你真的想深挖,不介意弄脏你的手,你仍然可以使用导航控制器作为动画控制器,这样你就可以得到相同的动画,然后修改它的内部查看层次结构。当一个视图要转出时,它会被移动到一个转场视图,这就是所有你不想要的东西所在的地方。隐藏它们,你会得到你想要的肮脏方式。
    • 哦..没听懂。好的
    【解决方案2】:

    模糊透明视图控制器也有同样的问题。在过渡期间,一个暗淡的视图被置于后面。

    我不得不承认我真的很喜欢 iOS 原生转换(尤其是大标题),而且我想以相同的质量水平重现它们是相当耗时的。我遇到了许多解释如何创建自定义转换的教程,但结果看起来很奇怪(Snapchat 有自己的 UIScrollView 从页面到页面的交互式转换,我个人觉得用户体验很奇怪,因为我的其他应用程序中 90% 都有原生 Apple 转换)

    无论如何,如果有人在推送半透明视图控制器时遇到同样的问题,这是我对pushViewController 的实现。

    请注意,这仍然很愚蠢,可能不适用于未来的 iOS 版本。如果我错过了“覆盖”原生 iOS VC 转换的更好方法,请纠正我。

    override func pushViewController(_ viewController: UIViewController, animated: Bool)
    {
        let visibleVc = self.visibleViewController
        
        super.pushViewController(viewController, animated: animated)
        if(animated)
        {
            UIView.animate(withDuration:transitionCoordinator?.transitionDuration ?? 0.2, animations: {
                visibleVc?.view.alpha = 0
            })
        }
        
        // at least in iOS 13, pushing a viewController creates, the time of the transition,
        // a dimming view that disappear only after the old view controller is removed.
        // this causes the blur to jump a tiny bit in brightness at the end of the push animation
        // to remove that "jump", we find the dimming view after a while (it's not present at the beginning), and animate it to alpha 0, from half animation time
        // FIXME: this is only a silly trick : it would be appropriate to create our own VC transition later 
        // Works at least with iOS 13, to be tested with iOS < 13 and iOS 14
    
        let halfDuration = (transitionCoordinator?.transitionDuration ?? 0.2) / 2
        DispatchQueue.main.asyncAfter(deadline:.now() + halfDuration ) {
            if let uiNavigationTransitionView = self.view.subviews.first(where: {
                String(describing: type(of: $0)) == "UINavigationTransitionView"
            }),
            let wrapperView = uiNavigationTransitionView.subviews.first(where: {
                String(describing: type(of: $0)) == "UIViewControllerWrapperView"
            }),
            let grayOverlay = wrapperView.subviews.first(where: {
                String(describing: type(of: $0)) == "_UIParallaxDimmingView"
            })
            {
                UIView.animate(withDuration:halfDuration, animations: {
                    grayOverlay.alpha = 0
                })
            }
        }
        
    
    }
    

    【讨论】:

      猜你喜欢
      • 2023-03-14
      • 1970-01-01
      • 2012-11-03
      • 1970-01-01
      • 2012-11-25
      • 1970-01-01
      • 1970-01-01
      • 2017-08-03
      • 2012-01-30
      相关资源
      最近更新 更多