From a77fb110ad9a60469310ff9b2440c34535cdcc1c Mon Sep 17 00:00:00 2001 From: Krzysztof Ligarski Date: Mon, 27 Oct 2025 13:56:49 +0100 Subject: [PATCH 1/2] enforce rendering modes --- ios/RNSBarButtonItem.mm | 18 ++++++++++++++++-- .../helpers/prepareHeaderBarButtonItems.ts | 5 +++-- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/ios/RNSBarButtonItem.mm b/ios/RNSBarButtonItem.mm index 199ffdea3b..a35d72871f 100644 --- a/ios/RNSBarButtonItem.mm +++ b/ios/RNSBarButtonItem.mm @@ -23,8 +23,16 @@ - (instancetype)initWithConfig:(NSDictionary *)dict self.title = dict[@"title"]; NSDictionary *imageSourceObj = dict[@"imageSource"]; + NSDictionary *templateSourceObj = dict[@"templateSource"]; + + RCTImageSource *imageSource = nil; if (imageSourceObj) { - RCTImageSource *imageSource = [RCTConvert RCTImageSource:imageSourceObj]; + imageSource = [RCTConvert RCTImageSource:imageSourceObj]; + } else if (templateSourceObj) { + imageSource = [RCTConvert RCTImageSource:templateSourceObj]; + } + + if (imageSource) { [imageLoader loadImageWithURLRequest:imageSource.request size:imageSource.size scale:imageSource.scale @@ -36,7 +44,13 @@ - (instancetype)initWithConfig:(NSDictionary *)dict } completionBlock:^(NSError *_Nullable error, UIImage *_Nullable image) { dispatch_async(dispatch_get_main_queue(), ^{ - self.image = image; + UIImage *imageWithRenderingMode = nil; + if (imageSourceObj) { + imageWithRenderingMode = [image imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]; + } else if (templateSourceObj) { + imageWithRenderingMode = [image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]; + } + self.image = imageWithRenderingMode; }); }]; } diff --git a/src/components/helpers/prepareHeaderBarButtonItems.ts b/src/components/helpers/prepareHeaderBarButtonItems.ts index 96ca76c38f..aac7f68d12 100644 --- a/src/components/helpers/prepareHeaderBarButtonItems.ts +++ b/src/components/helpers/prepareHeaderBarButtonItems.ts @@ -38,11 +38,11 @@ export const prepareHeaderBarButtonItems = ( if (item.type === 'spacing') { return item; } - let imageSource; + let imageSource, templateSource; if (item.icon?.type === 'imageSource') { imageSource = Image.resolveAssetSource(item.icon.imageSource); } else if (item.icon?.type === 'templateSource') { - imageSource = Image.resolveAssetSource(item.icon.templateSource); + templateSource = Image.resolveAssetSource(item.icon.templateSource); } const titleStyle = item.titleStyle @@ -62,6 +62,7 @@ export const prepareHeaderBarButtonItems = ( const processedItem = { ...item, imageSource, + templateSource, sfSymbolName: item.icon?.type === 'sfSymbol' ? item.icon.name : undefined, titleStyle, tintColor, From 9c0447ce7cc670f15b226c2ba81ed6df7fc9f8ab Mon Sep 17 00:00:00 2001 From: Krzysztof Ligarski Date: Mon, 27 Oct 2025 13:58:34 +0100 Subject: [PATCH 2/2] use correct react-navigation API in test screen, disable icon tint for one test case --- apps/src/screens/BarButtonItems.tsx | 303 +++++++++++++++++----------- 1 file changed, 180 insertions(+), 123 deletions(-) diff --git a/apps/src/screens/BarButtonItems.tsx b/apps/src/screens/BarButtonItems.tsx index 723bd4d2a5..95ec2de3dd 100644 --- a/apps/src/screens/BarButtonItems.tsx +++ b/apps/src/screens/BarButtonItems.tsx @@ -1,6 +1,13 @@ // NOTE: The full native feature set (style, image, menu, etc.) is available, but the TS types in src/types.tsx need to be updated to match. This example uses only the currently typed props (title, icon, onPress, enabled). import React from 'react'; -import { View, Alert, Button, Text, Platform, TouchableOpacity } from 'react-native'; +import { + View, + Alert, + Button, + Text, + Platform, + TouchableOpacity, +} from 'react-native'; import { createNativeStackNavigator } from '@react-navigation/native-stack'; import { ScrollView } from 'react-native-gesture-handler'; @@ -23,18 +30,20 @@ const demoScreens = [ { name: 'DoneStyleButtonDemo', title: 'Done Style Button' }, { name: 'AdvancedMenuButtonDemo', title: 'Advanced Menu Button' }, { name: 'ReactNodeButtonDemo', title: 'React Node Button' }, - { name: "BackButtonVisibleDemo", title: "Back Button Visible" }, - { name: "IdentifierExample", title: "Identifier Example" }, - { name: "IdentifierExample2", title: "Identifier Example 2" }, - { name: "ExessiveItemsExample", title: "Exessive Items Example" }, + { name: 'BackButtonVisibleDemo', title: 'Back Button Visible' }, + { name: 'IdentifierExample', title: 'Identifier Example' }, + { name: 'IdentifierExample2', title: 'Identifier Example 2' }, + { name: 'ExessiveItemsExample', title: 'Exessive Items Example' }, ]; const MainScreen = ({ navigation }: any) => ( - iOS only + + iOS only + - {demoScreens.map((screen) => ( + {demoScreens.map(screen => (