mirror of
https://github.com/toeverything/AFFiNE.git
synced 2026-09-13 04:42:56 +08:00
fix(editor): edgeless can't slider with finger (#15091)
fix bug edgeless can't slider with finger <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **New Features** * Added mobile immersive edgeless mode with dynamic chrome auto-hide and tap-gesture controls. * Added a mobile zoom ruler UI for edgeless. * **Bug Fixes** * Improved iOS rendering/zoom by applying low-zoom survival behavior, gesture-aware refresh deferral, and effective-DPR canvas scaling. * Fixed iOS webview zoom/bounce and process-termination reload behavior. * Improved placeholder styling with theme-aware colors. * **Chores** * Updated local ignore rules and iOS app build/version configuration. <!-- end of auto-generated comment: release notes by coderabbit.ai --> --------- Co-authored-by: DarkSky <darksky2048@gmail.com>
This commit is contained in:
@@ -1,31 +1,55 @@
|
||||
import Capacitor
|
||||
import Intelligents
|
||||
import UIKit
|
||||
import WebKit
|
||||
|
||||
class AFFiNEViewController: CAPBridgeViewController {
|
||||
class AFFiNEViewController: CAPBridgeViewController, UIScrollViewDelegate {
|
||||
var intelligentsButton: IntelligentsButton?
|
||||
|
||||
override func viewDidLoad() {
|
||||
super.viewDidLoad()
|
||||
webView?.allowsBackForwardNavigationGestures = true
|
||||
webView?.allowsBackForwardNavigationGestures = false
|
||||
navigationController?.navigationBar.isHidden = true
|
||||
extendedLayoutIncludesOpaqueBars = false
|
||||
edgesForExtendedLayout = []
|
||||
|
||||
// Disable WKWebView scrollView zoom/bounce to prevent conflict with edgeless canvas gestures
|
||||
webView?.scrollView.minimumZoomScale = 1.0
|
||||
webView?.scrollView.maximumZoomScale = 1.0
|
||||
webView?.scrollView.bouncesZoom = false
|
||||
webView?.scrollView.bounces = false
|
||||
webView?.scrollView.pinchGestureRecognizer?.isEnabled = false
|
||||
webView?.scrollView.delegate = self
|
||||
|
||||
// Inject viewport meta to prevent WKWebView smart zoom
|
||||
let viewportScript = """
|
||||
(function() {
|
||||
function setViewport() {
|
||||
var meta = document.querySelector('meta[name="viewport"]');
|
||||
if (!meta) {
|
||||
meta = document.createElement('meta');
|
||||
meta.name = 'viewport';
|
||||
(document.head || document.documentElement).appendChild(meta);
|
||||
}
|
||||
meta.content = 'width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no, viewport-fit=cover';
|
||||
}
|
||||
if (document.head) {
|
||||
setViewport();
|
||||
} else {
|
||||
document.addEventListener('DOMContentLoaded', setViewport);
|
||||
}
|
||||
})();
|
||||
"""
|
||||
webView?.configuration.userContentController.addUserScript(
|
||||
WKUserScript(source: viewportScript, injectionTime: .atDocumentStart, forMainFrameOnly: true)
|
||||
)
|
||||
|
||||
let intelligentsButton = installIntelligentsButton()
|
||||
intelligentsButton.delegate = self
|
||||
self.intelligentsButton = intelligentsButton
|
||||
dismissIntelligentsButton()
|
||||
}
|
||||
|
||||
override func webViewConfiguration(for instanceConfiguration: InstanceConfiguration) -> WKWebViewConfiguration {
|
||||
let configuration = super.webViewConfiguration(for: instanceConfiguration)
|
||||
return configuration
|
||||
}
|
||||
|
||||
override func webView(with frame: CGRect, configuration: WKWebViewConfiguration) -> WKWebView {
|
||||
super.webView(with: frame, configuration: configuration)
|
||||
}
|
||||
|
||||
override func capacitorDidLoad() {
|
||||
let plugins: [CAPPlugin] = [
|
||||
AuthPlugin(),
|
||||
@@ -56,7 +80,7 @@ class AFFiNEViewController: CAPBridgeViewController {
|
||||
private func checkEligibilityOfIntelligent() {
|
||||
guard !isCheckingIntelligentEligibility else { return }
|
||||
assert(intelligentsButton != nil)
|
||||
guard intelligentsButton?.isHidden ?? false else { return } // already eligible
|
||||
guard intelligentsButton?.isHidden ?? false else { return }
|
||||
isCheckingIntelligentEligibility = true
|
||||
IntelligentContext.shared.webView = webView
|
||||
IntelligentContext.shared.preparePresent { [self] result in
|
||||
@@ -75,4 +99,31 @@ class AFFiNEViewController: CAPBridgeViewController {
|
||||
super.viewDidDisappear(animated)
|
||||
intelligentsButtonTimer?.invalidate()
|
||||
}
|
||||
|
||||
// MARK: - UIScrollViewDelegate
|
||||
|
||||
func viewForZooming(in scrollView: UIScrollView) -> UIView? {
|
||||
return nil
|
||||
}
|
||||
|
||||
func scrollViewDidZoom(_ scrollView: UIScrollView) {
|
||||
scrollView.zoomScale = 1.0
|
||||
}
|
||||
|
||||
func scrollViewDidScroll(_ scrollView: UIScrollView) {
|
||||
if scrollView.contentOffset != .zero {
|
||||
scrollView.contentOffset = .zero
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: - Web Content Process Crash Recovery
|
||||
|
||||
// NOTE: Capacitor's CAPBridgeViewController owns the WKWebView
|
||||
// navigationDelegate (it assigns its own WebViewDelegationHandler), so this
|
||||
// override is NOT called in practice — Capacitor's handler logs
|
||||
// "⚡️ WebView process terminated" and reloads instead. Kept as defensive
|
||||
// fallback, matching the prior baseline behavior.
|
||||
func webViewWebContentProcessDidTerminate(_ webView: WKWebView) {
|
||||
webView.reload()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
</dict>
|
||||
</array>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>10</string>
|
||||
<string>17</string>
|
||||
<key>ITSAppUsesNonExemptEncryption</key>
|
||||
<false/>
|
||||
<key>LSRequiresIPhoneOS</key>
|
||||
@@ -42,7 +42,7 @@
|
||||
<key>NSPhotoLibraryUsageDescription</key>
|
||||
<string>AFFiNE requires access to select photos from your photo library and insert them into your documents</string>
|
||||
<key>NSUserTrackingUsageDescription</key>
|
||||
<string>Rest assured, enabling this permission won't access your private info on other sites. It's only used to identify your device and improve security and product experience.</string>
|
||||
<string>Rest assured, enabling this permission won't access your private info on other sites. It's only used to identify your device and improve security and product experience.</string>
|
||||
<key>UILaunchScreen</key>
|
||||
<dict>
|
||||
<key>UIImageName</key>
|
||||
@@ -69,10 +69,10 @@
|
||||
</array>
|
||||
<key>UIViewControllerBasedStatusBarAppearance</key>
|
||||
<true/>
|
||||
<key>NSAppTransportSecurity</key>
|
||||
<dict>
|
||||
<key>NSAllowsArbitraryLoads</key>
|
||||
<true/>
|
||||
</dict>
|
||||
<key>NSAppTransportSecurity</key>
|
||||
<dict>
|
||||
<key>NSAllowsLocalNetworking</key>
|
||||
<true/>
|
||||
</dict>
|
||||
</dict>
|
||||
</plist>
|
||||
|
||||
Reference in New Issue
Block a user