使用 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)!
UIViewControllerAnimatedTransitioning
来制定适合自己的过渡动画样式。以下是一个示例:
我认为你需要使用自定义的UIViewControllerAnimatedTransitioning
,就像dasdom所说的那样。你可以创建一个简单的过渡效果,在其中将新的视图控制器移动到旧的视图控制器上方。这样,旧的视图控制器在转换时不会像正常的转换一样改变颜色。添加向左滑动返回的功能应该不会太难,因为在动画方面没有太多的事情要做。
实际上,您可以使用this pod。
只需安装它并使用EZNavigationController而不是UINavigationController,默认情况下行为应该是您想要的。
如果需要稍微更改,您还可以传递自己的动画器而无需覆盖任何类型的滑动手势。
PS:这个pod并不是专门为您的请求而设计的,但幸运的是应该可以满足您的需求。
PpS:这个pod还会在屏幕中间添加一个从左向右滑动的手势(就像Instagram一样)。实际上,这是库的主要目的,所以这可能不是您想要的,但我希望它能帮到您。