Swift 按下视图控制器时快速显示背景色

Swift 按下视图控制器时快速显示背景色,swift,uiviewcontroller,transition,Swift,Uiviewcontroller,Transition,我有两个白色的视图控制器。当我尝试按下第二个视图控制器时,我注意到一个灰色背景(基本上它在转换过程中会改变alpha值)。是否有任何黑客可以禁用此淡入淡出功能?我只希望我的背景是白色的如果您实现协议UIViewControllerAnimatedTransitioning,您可以根据需要设置转换样式。下面是这样一个示例: 我认为您需要使用自定义的UIViewControllerAnimatedTransitioning,正如dasdom所说的那样。您只需创建一个简单的转换,将新的视图控制器移动到

我有两个白色的视图控制器。当我尝试按下第二个视图控制器时,我注意到一个灰色背景(基本上它在转换过程中会改变alpha值)。是否有任何黑客可以禁用此淡入淡出功能?我只希望我的背景是白色的

如果您实现协议UIViewControllerAnimatedTransitioning,您可以根据需要设置转换样式。下面是这样一个示例:


我认为您需要使用自定义的
UIViewControllerAnimatedTransitioning
,正如dasdom所说的那样。您只需创建一个简单的转换,将新的视图控制器移动到旧的视图控制器上即可。这样,旧的视图控制器将不会像正常过渡那样更改颜色。添加左击返回应该不会太困难,因为在动画方面没有太多进展。

事实上,您可以使用

只需安装它并使用EZNavigationController而不是UINavigationController,默认情况下,行为应该是您想要的

如果需要稍作更改,也可以传递自己的动画师,而无需覆盖任何类型的滑动手势

附言:这个吊舱不是专门为你的要求设计的,但幸运的是,它只适合你


PpS:这个豆荚还将在屏幕中间添加一个平移到弹出的手势(很像instagram)。实际上,这是该库的主要用途,因此这可能不是您想要的,但我希望它无论如何都能有所帮助。

使用
UIViewControllerAnimatedTransitioning
肯定是“正确”的方法,但您似乎真的不想使用它

如果你想“破解”它,那么swizzling就是一个不错的选择

下面是
UIView
上的一个扩展,它阻止显示底层类
\UIParallaxDimmingView

extension UIView {
    static func preventDimmingView() {
        guard let originalMethod = class_getInstanceMethod(UIView.self, #selector(addSubview(_:))), let swizzledMethod = class_getInstanceMethod(UIView.self, #selector(swizzled_addSubview(_:))) else { return }
        method_exchangeImplementations(originalMethod, swizzledMethod)
    }

    static func allowDimmingView() {
        guard let originalMethod = class_getInstanceMethod(UIView.self, #selector(addSubview(_:))), let swizzledMethod = class_getInstanceMethod(UIView.self, #selector(swizzled_addSubview(_:))) else { return }
        method_exchangeImplementations(swizzledMethod, originalMethod)
    }

    @objc func swizzled_addSubview(_ view: UIView) {
        let className = "_UIParallaxDimmingView"
        guard let offendingClass = NSClassFromString(className) else { return swizzled_addSubview(view) }
        if (view.isMember(of: offendingClass)) {
            return
        }
        swizzled_addSubview(view)
    }
}
我建议按照以下思路使用它:

class SomeViewController: UIViewController {

    func transition(to viewController: UIViewController) {
        navigationController?.delegate = self
        navigationController?.pushViewController(viewController, animated: true)
    }
}


extension SomeViewController: UINavigationControllerDelegate {
    func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) {
        UIView.preventDimmingView()
    }

    func navigationController(_ navigationController: UINavigationController, didShow viewController: UIViewController, animated: Bool) {
        UIView.allowDimmingView()
    }
}
当然,如果您希望通过App Store review完成此操作,您可能会被标记为
“\u parallaxdimmingview”
字符串。我建议改为从字节数组初始化它:

let className = String(bytes: [95, 85, 73, 80, 97, 114, 97, 108, 108, 97, 120, 68, 105, 109, 109, 105, 110, 103, 86, 105, 101, 119], encoding: .utf8)!

这东西好像是打破了向左滑动的姿势。基本上,我对标准转换很满意,我只想将背景色设置为白色,你可以用它来实现向左滑动的手势。这只是一个想法,因为现在我没有其他解决方案。你检查过窗口的背景色吗?两个视图控制器都是白色的。默认情况下window.backgroundColor为零,我已尝试更改它,但无效。您可以将其他视图控制器设置为以您喜欢的颜色开始,但当它开始转换时,将该视图设置为白色。您尝试过我的解决方案吗?我很有信心,这是可行的。是的,在我看来,这不是一个可以接受的答案,以重新实施回刷手势。我不认为真的有任何其他方式。这只是默认的过渡动画。不要认为有什么办法可以改变这一点。就像这里在stackoverflow上解释的那样:好的,这个悬赏是为了看看是否还有其他办法,而不是所有的工作。这太棒了!谢谢你,投了赞成票。你知道定制转换的例子吗?