防止Lockscreen / Notificationcenter在本机中向下滑动

时间:2018-08-20 08:51:25

标签: javascript ios react-native

从iOS 11开始,更改了将自己的手势优先于屏幕边缘的系统手势的行为。

以前,iOS假定如果隐藏状态栏,则希望首先触发屏幕边缘的手势。

现在,您必须重写preferredScreenEdgesDeferringSystemGestures方法才能获得与此处说明的结果相同的结果:https://useyourloaf.com/blog/avoiding-conflicts-with-system-gestures-at-screen-edges/

我们如何才能在本机操作中做到这一点?这已经在最新版本中处理了吗?我在react-native源代码中找不到对该方法的任何引用。

2 个答案:

答案 0 :(得分:0)

这可以通过将正在使用的UIViewController交换为以您喜欢的方式实现preferredScreenEdgesDeferringSystemGestures的那个来实现。

首先创建一个新类,例如MainViewController,返回所需的值:

//
//  MainViewController.h
//

#import <UIKit/UIKit.h>

NS_ASSUME_NONNULL_BEGIN

@interface MainViewController : UIViewController

@end

NS_ASSUME_NONNULL_END

和:

//
//  MainViewController.m
//

#import "MainViewController.h"

@interface MainViewController ()

@end

@implementation MainViewController

- (UIRectEdge)preferredScreenEdgesDeferringSystemGestures
{
  return UIRectEdgeBottom;
}

@end

最后,将通用视图控制器替换为我们刚刚创建的专用视图控制器:

  */

 #import "AppDelegate.h"
+#import "MainViewController.h"

 #import <React/RCTBundleURLProvider.h>
 #import <React/RCTRootView.h>

===== SNIP =====

   rootView.backgroundColor = [[UIColor alloc] initWithRed:1.0 green:1.0 blue:1.0 alpha:1.0];

   self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
-  UIViewController *rootViewController = [UIViewController new];
+  UIViewController *rootViewController = [MainViewController new];
   rootViewController.view = rootView;
   self.window.rootViewController = rootViewController;
   [self.window makeKeyAndVisible];

答案 1 :(得分:0)

我设法通过在UIViewController上使用 Swift 扩展名的方法来解决该问题:

extension UIViewController {
fileprivate static func swizzleReduceSystemGestures() {
      guard let aClass = NSClassFromString("RNNNavigationController") ?? NSClassFromString("RNNStackController"), // aClass?.alloc() as? UINavigationController
      let originalMethod = class_getInstanceMethod(aClass, #selector(getter: UIViewController.preferredScreenEdgesDeferringSystemGestures)),
      let swizzledMethod = class_getInstanceMethod(aClass, #selector(getter: preferredScreenEdgesDeferringSystemGesturesSwizzled)) else { return }
      method_exchangeImplementations(originalMethod, swizzledMethod)
  }

  @objc public var preferredScreenEdgesDeferringSystemGesturesSwizzled: UIRectEdge {
       return .all
  }
}

然后在您的AppDelegate中调用此静态方法:

 UIViewController.swizzleReduceSystemGestures()

类似地,您可以为prefersHomeIndicatorAutoHidden设置毛毛雨,直到它们为我们提供适当的解决方案之前,它就像一种魅力。