【发布时间】:2020-08-22 18:04:49
【问题描述】:
我一直在尝试做一些看似简单的事情,但我已经尝试了几个小时,但找不到解决方案。
我有一个 SVG 需要位于屏幕顶部。它来自具有以下尺寸的设计师:
<Svg width="354px" height="190px" viewBox="0 0 354 190">...</Svg>
在 React Native 中,这将进入容器内部,并且 SVG 需要占据屏幕的整个宽度,我从中获取:
Dimensions.get("window").width
我的问题是,我还没有找到一种方法来缩放 SVG 以占用 100% 的屏幕宽度、找出正确的高度(或自动设置它的方法)并保持纵横比。我已经尝试了一百万种方法,包括使用容器的 aspectRatio 样式及其 height(或者根本不设置 height) .每当我找到一些有效的“比例”时,我都会尝试使用具有不同屏幕宽度的不同设备,但它看起来一点也不好看(裁剪、小于屏幕宽度等)。
我觉得 SVG (react-native-svg) 中的 preserveAspectRatio 属性在某种程度上与 aspectRatio 样式冲突。我对 preserveAspectRatio 完全迷失了方向,我还没有找到一种方法可以让它在不被裁剪的情况下进行缩放。
有谁知道如何做到这一点?
这是我的最终代码,它返回一个显示 SVG 的 HeatMap 组件,但尽管它具有正确的高度,但 SVG 的一部分从右侧超出了屏幕(看起来被裁剪了,因为它太宽了):
const windowWidth = Dimensions.get("window").width;
const getSVGRootProps = ({ width, height }) => ({
width: "100%",
height: "100%",
viewBox: `0 0 ${width} ${height}`,
preserveAspectRatio: "xMinYMin meet",
});
const FieldShape = () => {
const width = 354; // Original width
const height = 190; // Original height
const aspectRatio = width / height;
// adjusted height = <screen width> * original height / original width
const calculatedHeight = (windowWidth * height) / width;
const fieldStyles = {
width: windowWidth,
height: calculatedHeight,
aspectRatio,
};
return (
<View style={fieldStyles}>
<Svg {...getSVGRootProps({ windowWidth, calculatedHeight })}>
...
</Svg>
</View>
);
};
const HeatMap = () => {
return <FieldShape />;
};
这是结果:
【问题讨论】:
-
使用 getBBox() 方法。在这里阅读更多:stackoverflow.com/questions/44748197/…
-
我不确定我是否可以在 react-native-svg 中使用它,我还没有看到这里实现的方法......
标签: css react-native svg aspect-ratio