From 923e46acf2e37b0671844c3abad163ab1cbc32b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hans=20Kn=C3=B6chel?= Date: Tue, 3 Feb 2026 09:33:13 +0100 Subject: [PATCH 1/2] feat: add web view API to hide input accessory views --- apidoc/Titanium/UI/WebView.yml | 14 +++++++++++++ iphone/Classes/TiUIWebView.m | 11 +++++++++- iphone/Classes/TiWebView.h | 18 +++++++++++++++++ iphone/Classes/TiWebView.m | 20 +++++++++++++++++++ .../iphone/Titanium.xcodeproj/project.pbxproj | 6 ++++++ 5 files changed, 68 insertions(+), 1 deletion(-) create mode 100644 iphone/Classes/TiWebView.h create mode 100644 iphone/Classes/TiWebView.m diff --git a/apidoc/Titanium/UI/WebView.yml b/apidoc/Titanium/UI/WebView.yml index a5261088778..6406c0f229c 100644 --- a/apidoc/Titanium/UI/WebView.yml +++ b/apidoc/Titanium/UI/WebView.yml @@ -907,6 +907,20 @@ properties: platforms: [iphone, ipad, macos] since: {iphone: "6.1.0", ipad: "6.1.0", macos: "9.2.0"} + - name: hideKeyboardAccessoryView + summary: A Boolean value indicating whether to hide the keyboard accessory bar. + description: | + When this property is set to `true`, the keyboard accessory bar (the bar with "Previous", + "Next" and "Done" buttons that appears above the keyboard when focusing input fields in + web content) is hidden. This can be useful when you want to provide your own custom + input accessory or simply want a cleaner keyboard appearance. + + Set to `false` (the default) to show the standard keyboard accessory bar. + type: Boolean + default: false + platforms: [iphone, ipad, macos] + since: {iphone: "13.2.0", ipad: "13.2.0", macos: "13.2.0"} + - name: ignoreSslError summary: Controls whether to ignore invalid SSL certificates or not. description: | diff --git a/iphone/Classes/TiUIWebView.m b/iphone/Classes/TiUIWebView.m index ff36617098b..adbd96db713 100644 --- a/iphone/Classes/TiUIWebView.m +++ b/iphone/Classes/TiUIWebView.m @@ -10,6 +10,7 @@ #import "TiUIWebViewProxy.h" #import "TiUIiOSWebViewConfigurationProxy.h" #import "TiUIiOSWebViewDecisionHandlerProxy.h" +#import "TiWebView.h" #import #import @@ -82,7 +83,7 @@ - (WKWebView *)webView _willHandleTouches = [TiUtils boolValue:[[self proxy] valueForKey:@"willHandleTouches"] def:YES]; - _webView = [[WKWebView alloc] initWithFrame:[self bounds] configuration:config]; + _webView = [[TiWebView alloc] initWithFrame:[self bounds] configuration:config]; #if TARGET_OS_SIMULATOR && __IPHONE_OS_VERSION_MAX_ALLOWED >= 160400 if (@available(iOS 16.4, *)) { _webView.inspectable = YES; @@ -389,6 +390,14 @@ - (void)setKeyboardDisplayRequiresUserAction_:(id)value [[self proxy] replaceValue:value forKey:@"keyboardDisplayRequiresUserAction" notification:NO]; } +- (void)setHideKeyboardAccessoryView_:(id)value +{ + ENSURE_TYPE(value, NSNumber); + + [[self proxy] replaceValue:value forKey:@"hideKeyboardAccessoryView" notification:NO]; + [[self webView] setHideInputAccessoryView:[TiUtils boolValue:value def:NO]]; +} + - (void)reload { if (_webView == nil) { diff --git a/iphone/Classes/TiWebView.h b/iphone/Classes/TiWebView.h new file mode 100644 index 00000000000..69b24bc75f9 --- /dev/null +++ b/iphone/Classes/TiWebView.h @@ -0,0 +1,18 @@ +// +// TiWebView.h +// Titanium +// +// Created by Hans Knöchel on 02.02.26. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface TiWebView : WKWebView + +@property (nonatomic, assign) BOOL hideInputAccessoryView; + +@end + +NS_ASSUME_NONNULL_END diff --git a/iphone/Classes/TiWebView.m b/iphone/Classes/TiWebView.m new file mode 100644 index 00000000000..2ea8b6cc456 --- /dev/null +++ b/iphone/Classes/TiWebView.m @@ -0,0 +1,20 @@ +// +// TiWebView.m +// Titanium +// +// Created by Hans Knöchel on 02.02.26. +// + +#import "TiWebView.h" + +@implementation TiWebView + +- (__kindof UIView *)inputAccessoryView +{ + if (self.hideInputAccessoryView) { + return nil; + } + return [super inputAccessoryView]; +} + +@end diff --git a/iphone/iphone/Titanium.xcodeproj/project.pbxproj b/iphone/iphone/Titanium.xcodeproj/project.pbxproj index 80b8b7a2dd5..8eab965f438 100644 --- a/iphone/iphone/Titanium.xcodeproj/project.pbxproj +++ b/iphone/iphone/Titanium.xcodeproj/project.pbxproj @@ -159,6 +159,7 @@ 3A0E54371BE811CD003EE654 /* TiUIiOSMenuPopupProxy.m in Sources */ = {isa = PBXBuildFile; fileRef = 3A0E54361BE811CD003EE654 /* TiUIiOSMenuPopupProxy.m */; }; 3A1E40511BEAC73D00943233 /* TiUIiOSMenuPopup.m in Sources */ = {isa = PBXBuildFile; fileRef = 3A1E40501BEAC73D00943233 /* TiUIiOSMenuPopup.m */; }; 3A275F3E1BA881B300EC4912 /* TiUIActivityIndicatorStyleProxy.m in Sources */ = {isa = PBXBuildFile; fileRef = 3A275F3D1BA881B300EC4912 /* TiUIActivityIndicatorStyleProxy.m */; }; + 3A2BC6332F30D81400D4CBD4 /* TiWebView.m in Sources */ = {isa = PBXBuildFile; fileRef = 3A2BC6322F30D81400D4CBD4 /* TiWebView.m */; }; 3A320F992B6EDC7600009E90 /* TiSymbolEffectManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 3A320F982B6EDC7600009E90 /* TiSymbolEffectManager.m */; }; 3A38F30424D6EBBD00CC6EFB /* TiUtils+Addons.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3A38F30324D6EBBD00CC6EFB /* TiUtils+Addons.swift */; }; 3A3BBAF51D3E2F0F008450DF /* TiAppiOSUserNotificationCenterProxy.m in Sources */ = {isa = PBXBuildFile; fileRef = 3A3BBAF41D3E2F0F008450DF /* TiAppiOSUserNotificationCenterProxy.m */; }; @@ -606,6 +607,8 @@ 3A1E40501BEAC73D00943233 /* TiUIiOSMenuPopup.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TiUIiOSMenuPopup.m; sourceTree = ""; }; 3A275F3C1BA881B300EC4912 /* TiUIActivityIndicatorStyleProxy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TiUIActivityIndicatorStyleProxy.h; sourceTree = ""; }; 3A275F3D1BA881B300EC4912 /* TiUIActivityIndicatorStyleProxy.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TiUIActivityIndicatorStyleProxy.m; sourceTree = ""; }; + 3A2BC6312F30D81400D4CBD4 /* TiWebView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = TiWebView.h; sourceTree = ""; }; + 3A2BC6322F30D81400D4CBD4 /* TiWebView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = TiWebView.m; sourceTree = ""; }; 3A320F972B6EDC7600009E90 /* TiSymbolEffectManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = TiSymbolEffectManager.h; sourceTree = ""; }; 3A320F982B6EDC7600009E90 /* TiSymbolEffectManager.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = TiSymbolEffectManager.m; sourceTree = ""; }; 3A38F30324D6EBBD00CC6EFB /* TiUtils+Addons.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "TiUtils+Addons.swift"; sourceTree = ""; }; @@ -1321,6 +1324,8 @@ 24EB02BF111BF827001DC2D1 /* TiUIWebView.h */, 24EB02C0111BF827001DC2D1 /* TiUIWebView.m */, 24EB06EC111D03F9001DC2D1 /* bridge.txt */, + 3A2BC6312F30D81400D4CBD4 /* TiWebView.h */, + 3A2BC6322F30D81400D4CBD4 /* TiWebView.m */, ); name = Webview; sourceTree = ""; @@ -2163,6 +2168,7 @@ 1923696620E48D4300567508 /* TiUIiOSWebViewProcessPoolProxy.m in Sources */, DBF4B13B200FD93400777136 /* TiUIApplicationShortcutsProxy.m in Sources */, 24CA8B85111161FE0084E2DE /* TiUITabGroupProxy.m in Sources */, + 3A2BC6332F30D81400D4CBD4 /* TiWebView.m in Sources */, 24CA8B8C111161FE0084E2DE /* TiUISwitchProxy.m in Sources */, 24CA8B8D111161FE0084E2DE /* TiUISwitch.m in Sources */, 24CA8B8F111161FE0084E2DE /* TiUISliderProxy.m in Sources */, From fee18e13a80b0ff6cc8c9809706f7ae1bea84e67 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hans=20Kn=C3=B6chel?= Date: Tue, 3 Feb 2026 09:55:12 +0100 Subject: [PATCH 2/2] feat(ios): add autoAdjustScrollViewInsets API --- apidoc/Titanium/UI/WebView.yml | 16 ++++++++++++++++ iphone/Classes/TiUIWebView.m | 13 +++++++++++++ 2 files changed, 29 insertions(+) diff --git a/apidoc/Titanium/UI/WebView.yml b/apidoc/Titanium/UI/WebView.yml index 6406c0f229c..44749ea00e1 100644 --- a/apidoc/Titanium/UI/WebView.yml +++ b/apidoc/Titanium/UI/WebView.yml @@ -921,6 +921,22 @@ properties: platforms: [iphone, ipad, macos] since: {iphone: "13.2.0", ipad: "13.2.0", macos: "13.2.0"} + - name: autoAdjustScrollViewInsets + summary: | + Specifies whether or not the web view should automatically adjust its scroll view insets. + description: | + When the value is `true`, it allows the web view to adjust its scroll view insets in response + to the screen areas consumed by the status bar, navigation bar, toolbar and tab bar (safe areas). + + This is useful when displaying a web view that extends under navigation bars or into + safe area regions, ensuring content is not obscured. + + The default behavior assumes that this is `false`. + type: Boolean + default: false + platforms: [iphone, ipad, macos] + since: {iphone: "13.2.0", ipad: "13.2.0", macos: "13.2.0"} + - name: ignoreSslError summary: Controls whether to ignore invalid SSL certificates or not. description: | diff --git a/iphone/Classes/TiUIWebView.m b/iphone/Classes/TiUIWebView.m index adbd96db713..8ec52111d48 100644 --- a/iphone/Classes/TiUIWebView.m +++ b/iphone/Classes/TiUIWebView.m @@ -398,6 +398,19 @@ - (void)setHideKeyboardAccessoryView_:(id)value [[self webView] setHideInputAccessoryView:[TiUtils boolValue:value def:NO]]; } +- (void)setAutoAdjustScrollViewInsets_:(id)value +{ + ENSURE_TYPE(value, NSNumber); + + [[self proxy] replaceValue:value forKey:@"autoAdjustScrollViewInsets" notification:NO]; + + if ([TiUtils boolValue:value def:NO]) { + [[[self webView] scrollView] setContentInsetAdjustmentBehavior:UIScrollViewContentInsetAdjustmentAlways]; + } else { + [[[self webView] scrollView] setContentInsetAdjustmentBehavior:UIScrollViewContentInsetAdjustmentNever]; + } +} + - (void)reload { if (_webView == nil) {