Я нашел решение и публикую его здесь на случай, если кто-то столкнется с той же проблемой с react native и SVG. По сути, если вы пытаетесь получить файл SVG и превратить его в компонент с частями «Dynami c» (например, программно установить цвета для пути на основе данных или отобразить текст SVG), вы, вероятно, столкнетесь с этим проблема.
Я использовал SVGR для преобразования исходного SVG в собственный компонент реакции (с react-native-svg ). Затем я просто заменил жестко запрограммированные данные на переменные (из реквизита) по мере необходимости. Выглядело неплохо, но у меня возникла проблема с размером компонента. Я не мог найти единообразного способа отображать его на устройствах разных размеров и разрешений. Это казалось легким, но я пытался часами, и результаты были разными для каждого размера экрана. Спросив здесь и открыв вопрос о репозитории react-native-svg, я не получил ни ответов, ни подсказок (никого не обвиняю, просто сказал, что, возможно, это не то, с чем сталкиваются многие люди). Итак, я копал и копал и наконец нашел этот пост Лии Веру , где она говорила об абсолютных и относительных путях SVG. Это заставило меня подумать, что, возможно, у меня было так много проблем, пытаясь найти идеальную формулу изменения размера, потому что мои пути были не относительными, а абсолютными. Итак, я попробовал этот jsfiddle от heyzeuss , вставив свой (исходный) SVG-код, а затем скопировав результаты. Я вставил результаты в этот удобный инструмент SVGR (SVG в JS) , а затем изменил некоторые биты для достижения своей цели:
- Я хочу, чтобы мой SVG принял
Итак, это то, что я изменил:
// SVG's original size is 519 width, 260 height
// <Svg width="519" height="260" viewBox="0 0 519 260">...</Svg>
// I also added a container, which enforces the aspect ratio
const originalWidth = 519;
const originalHeight = 260;
const aspectRatio = originalWidth / originalHeight;
const windowWidth = Dimensions.get("window").width;
return (
<View style={{ width: windowWidth, aspectRatio }}>
<Svg
width="100%"
height="100%"
viewBox={`0 0 ${originalWidth} ${originalHeight}`}>
...
</Svg>
</View>
)
Я узнал кое-что, делая это, например, что есть @ svgr / cli включен в приложение create-react-app, а также доступен в моем проекте, поддерживающем реакцию, без установки чего-либо дополнительного, поэтому он также должен быть связан с исходными зависимостями. Вы можете запустить эту команду, и она превратит отдельный файл или все файлы в папке из .svg в компоненты React:
npx @svgr/cli [-d out-dir] [--ignore-existing] [src-dir]
Скрипт, используемый для преобразования абсолютных путей к родственникам, является частью этой библиотеки, которая называется Snap.svg , но вам понадобится примерно 1% ( Snap.path.toRelative ). Я думаю о небольшом инструменте, который возьмет все пути в файле svg и применит это преобразование. Честно говоря, я имел дело с файлами SVG в течение многих лет, но я никогда не мог должным образом взглянуть на то, как они работают внутри, на формат путей, координат и так далее, так что это было очень поучительно :)
Надеюсь, это поможет вам, если вы окажетесь в такой же ситуации!