从iOS 11开始,更改了将自己的手势优先于屏幕边缘的系统手势的行为。
以前,iOS假定如果隐藏状态栏,则希望首先触发屏幕边缘的手势。
现在,您必须重写preferredScreenEdgesDeferringSystemGestures
方法才能获得与此处说明的结果相同的结果:https://useyourloaf.com/blog/avoiding-conflicts-with-system-gestures-at-screen-edges/。
我们如何才能在本机操作中做到这一点?这已经在最新版本中处理了吗?我在react-native源代码中找不到对该方法的任何引用。
答案 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
设置毛毛雨,直到它们为我们提供适当的解决方案之前,它就像一种魅力。