From edb0201fa258d6a2c05899c185a4e5cba0dc26a3 Mon Sep 17 00:00:00 2001 From: Chris Bracken Date: Fri, 8 Dec 2017 19:36:53 -0800 Subject: [PATCH] Support iOS scroll-to-top tap on iPhone X (#4436) This adds support for scrolling the primary scroll view to the top on status bar touches, on the iPhone X. Notes: 1. The iPhone X status bar doesn't change height when in in-call/etc. mode, and unlike other iPhones, does scroll to top when in in-call mode. 2. No matter which model of iOS device, the top safe area inset doesn't change when in in-call mode. In in-call mode, the OS reduces the app view height by 20px off the top, and the double-height 'in-call' status bar covers this new inset (outside the view) and there continues to be a 20px safe area in the app. On iOS 11, rather than comparing status bar height to a hardcoded 20px 'standard height' we now compare to the top safe area inset (which is always the standard status bar height, regardless of device). On iOS versions prior to iOS 11, we use the previous logic. Fixes flutter/flutter#13439 --- .../ios/framework/Source/FlutterViewController.mm | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/shell/platform/darwin/ios/framework/Source/FlutterViewController.mm b/shell/platform/darwin/ios/framework/Source/FlutterViewController.mm index 531e83471..18d189396 100644 --- a/shell/platform/darwin/ios/framework/Source/FlutterViewController.mm +++ b/shell/platform/darwin/ios/framework/Source/FlutterViewController.mm @@ -803,10 +803,18 @@ static inline blink::PointerData::DeviceKind DeviceKindFromTouchType(UITouch* to constexpr CGFloat kStandardStatusBarHeight = 20.0; - (void)handleStatusBarTouches:(UIEvent*)event { + CGFloat standardStatusBarHeight = kStandardStatusBarHeight; + if (_platformSupportsSafeAreaInsets) { +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wunguarded-availability-new" + standardStatusBarHeight = self.view.safeAreaInsets.top; +#pragma clang diagnostic pop + } + // If the status bar is double-height, don't handle status bar taps. iOS // should open the app associated with the status bar. CGRect statusBarFrame = [UIApplication sharedApplication].statusBarFrame; - if (statusBarFrame.size.height != kStandardStatusBarHeight) { + if (statusBarFrame.size.height != standardStatusBarHeight) { return; } -- GitLab