【问题标题】:UINavigationController - how to change animation for single UIViewControllerUINavigationController - 如何更改单个 UIViewController 的动画
【发布时间】:2018-12-21 12:36:21
【问题描述】:

我如何才能为单个 UIViewController 推送/弹出自定义动画,并为同一 UINavigationController 中的其他 UIViewControllers 设置默认动画?

我使用UINavigationController 和push/pop 在不同的UIViewController 之间导航。我创建了自定义动画并将自定义UINavigationControllerDelegate 设置为UINavigationController.delegate。它的动画效果很好,但它改变了 UINavigationController 中所有未来推送/弹出的动画样式。

我知道我可以使用它的 transitioningDelegate 更改单个 UIViewController 的动画,但它只有在由 present() 显示而不是推送时才有效。 是否可以仅更改 UINavigationController 中单个 UIViewController 的动画?

【问题讨论】:

    标签: ios swift3 uiviewcontroller uinavigationcontroller uiviewanimationtransition


    【解决方案1】:

    您可以从导航控制器检查特定的视图控制器,例如:

    UINavigationcontroller.ViewControllers[那个视图控制器的编号]

    并在其上应用该动画。

    【讨论】:

    • 对不起,我不明白你的意思。我设置委托,然后像这样推送以应用动画 navigationController.delegate = customOpenDetailAnimationDelegate navigationController.pushViewController(detailViewController, animated: true) 它会更改 detailViewController 的动画,但如果我接下来调用,即 navigationController.pushViewController(anotherViewController, animated: true) 它包含相同的动画,但我想要默认的
    • 我所说的很简单可能对您有帮助,只需在使用不同的动画进行推送时检查视图控制器是否是您想要的,如果不是,则不要在推送时应用。如果我明白了对..
    【解决方案2】:

    子类 UINavigationController 并使用 CoreAnimation's 过渡来更改这样的推送/弹出动画。

    enum TransitionType {
        case fade
        case movein
        case push
        case reveal
    }
    enum TransitionSubtype {
        case right
        case left
        case top
        case bottom
    }
    
    class MyNavigationController: UINavigationController {
    
        fileprivate func getTransition(by type: TransitionType) -> String? {
            var transition: String?
            switch type {
            case .fade:
                transition = kCATransitionFade
                break
            case .push:
                transition = kCATransitionPush
                break
            case .movein:
                transition = kCATransitionMoveIn
                break
            case .reveal:
                transition = kCATransitionReveal
                break
            default:
                transition = nil
                break
            }
            return transition
        }
        fileprivate func getSubTransition(by type: TransitionSubtype) -> String? {
            var transition: String?
            switch type {
            case .right:
                transition = kCATransitionFromRight
                break
            case .left:
                transition = kCATransitionFromLeft
                break
            case .top:
                transition = kCATransitionFromTop
                break
            case .bottom:
                transition = kCATransitionFromBottom
                break
            default:
                transition = nil
                break
            }
            return transition
        }
    
        func display(viewController: UIViewController, animated: Bool, animationType: TransitionType = .push, animationSubtype: TransitionSubtype = .left) -> Bool {
            guard  let type = getTransition(by: animationType) else {return false}
            guard  let subtype = getSubTransition(by: animationSubtype) else {return false}
            if animated {
                let transition = CATransition()
                transition.duration = 0.35
                transition.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut)
                transition.type = type
                transition.subtype = subtype
                self.view.layer.add(transition, forKey: nil)
            }
            _ = self.pushViewController(viewController, animated: false)
            return true
        }
        func hide(animated: Bool, animationType: TransitionType = .push, animationSubtype: TransitionSubtype = .left) -> Bool {
            guard  let type = getTransition(by: animationType) else {return false}
            guard  let subtype = getSubTransition(by: animationSubtype) else {return false}
            if animated {
                let transition = CATransition()
                transition.duration = 0.35
                transition.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut)
                transition.type = type
                transition.subtype = subtype
                self.view.layer.add(transition, forKey: nil)
            }
            _ = self.popViewController(animated: false)
            return true
        }
    
    }
    

    【讨论】:

    • 感谢您的回答。问题在于 CATransition。它动画但问题是 CATransition 具有无法禁用的不需要的淡入淡出效果。因此,我不使用 CATransition。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-28
    相关资源
    最近更新 更多