推入视图控制器时的Swift背景颜色

3

我有两个白色的视图控制器。当我尝试推入第二个视图控制器时,我注意到了一个灰色的背景(基本上它在转换期间改变了alpha值)。有没有什么方法可以禁用这种渐变效果?我只想要我的背景是白色。enter image description here


你检查过窗口的背景颜色了吗? - dasdom
两个视图控制器都是白色的。window.backgroundColor默认为nil,我尝试过更改它,但没有起作用。 - Bobby Redjeans
你可以将另一个视图控制器设置为您喜欢的颜色,但当它开始过渡时,请将该视图设置为白色。 - Evan
你试过我的解决方案吗?我非常有信心它能够实现。 - dasdom
4个回答

6

使用 UIViewControllerAnimatedTransitioning 绝对是“正确”的方式,但看起来你确实不想使用它。

如果你想要“hack”它,那么交换方法(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的审查,您很可能会因为字符串"_UIParallaxDimmingView"而被标记。我建议您改为从字节数组初始化它:

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)!

gif


太好了!谢谢,已点赞。你知道有哪些使用自定义过渡效果的示例吗? - Kyle Browning

3

似乎这个东西破坏了向左滑动手势。基本上,我对标准过渡效果很满意,我只想将背景颜色设置为白色。 - Bobby Redjeans
你可以使用这个来实现向左滑动手势。这只是一个想法,因为目前我没有其他的解决方案。 - dasdom

0

我认为你需要使用自定义的UIViewControllerAnimatedTransitioning,就像dasdom所说的那样。你可以创建一个简单的过渡效果,在其中将新的视图控制器移动到旧的视图控制器上方。这样,旧的视图控制器在转换时不会像正常的转换一样改变颜色。添加向左滑动返回的功能应该不会太难,因为在动画方面没有太多的事情要做。


在我看来,重新实现向后滑动手势并不是一个可接受的答案。 - Kyle Browning
我认为真的没有其他方法。这只是默认的转换动画。不认为有改变它的方法。 - Thijs van der Heijden
如在stackoverflow上所解释的那样:https://dev59.com/oXE95IYBdhLWcg3wp_qn - Thijs van der Heijden
好的,这个赏金是为了看看是否有其他方法,而不是所有那些工作。 - Kyle Browning

0

实际上,您可以使用this pod

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

如果需要稍微更改,您还可以传递自己的动画器而无需覆盖任何类型的滑动手势。

PS:这个pod并不是专门为您的请求而设计的,但幸运的是应该可以满足您的需求。

PpS:这个pod还会在屏幕中间添加一个从左向右滑动的手势(就像Instagram一样)。实际上,这是库的主要目的,所以这可能不是您想要的,但我希望它能帮到您。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接