Skip to content

Commit 9cdaa30

Browse files
committed
Merge branch 'dev'
2 parents e89f106 + 561906b commit 9cdaa30

File tree

17 files changed

+115
-87
lines changed

17 files changed

+115
-87
lines changed

example/examples/src/routes/TextArea/index.tsx

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ export default class TextAreaView extends Component<TextAreaProps> {
1515
value3: '自定义输入框样式',
1616
value4: '',
1717
value5: '',
18+
value6: '',
1819
};
1920

2021
render() {
@@ -65,6 +66,16 @@ export default class TextAreaView extends Component<TextAreaProps> {
6566
value={this.state.value1}
6667
/>
6768
</Card>
69+
<Card title="允许拖拽" style={styles.card}>
70+
<TextArea
71+
showWords={true}
72+
onChange={(value6: string) => {
73+
this.setState({value6});
74+
}}
75+
value={this.state.value6}
76+
draggable
77+
/>
78+
</Card>
6879
<Card title="自定义输入框样式" style={styles.card}>
6980
<TextArea
7081
height={150}

packages/core/src/ImageViewer/README.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ ImageViewer 图片查看
88

99
### 基础示例
1010

11-
```jsx mdx:preview&background=#bebebe29
11+
```jsx
1212
import React, { Component } from 'react';
1313
import { ImageViewer } from '@uiw/react-native';
1414

@@ -22,7 +22,7 @@ export default Demo
2222

2323
### 指定图片地址
2424

25-
```jsx mdx:preview&background=#bebebe29
25+
```jsx
2626
import React from 'react';
2727
import { ImageViewer } from '@uiw/react-native';
2828

@@ -40,7 +40,7 @@ export default Demo
4040

4141
### 展示多张图片
4242

43-
```jsx mdx:preview&background=#bebebe29
43+
```jsx
4444
import React from 'react';
4545
import { ImageViewer } from '@uiw/react-native';
4646

packages/core/src/ImageViewer/index.tsx

Lines changed: 54 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,17 @@
1-
import React, { useState, useMemo, useRef } from 'react';
1+
import React, { useState, useMemo, useRef, useEffect } from 'react';
22
import { StyleSheet, ViewProps, Dimensions, View, Image, Animated } from 'react-native';
3-
import TransitionImage, { ImageProps } from '../TransitionImage';
4-
import MaskLayer, { MaskLayerProps } from '../MaskLayer';
3+
import TransitionImage from '../TransitionImage';
4+
import MaskLayer from '../MaskLayer';
55
import Swiper from '../Swiper';
66
import { ActivityIndicator } from 'react-native';
77
export let ImageMainWidth = Dimensions.get('window').width;
88
export let ImageMainHeight = Dimensions.get('window').height;
9+
import {
10+
PinchGestureHandler,
11+
PinchGestureHandlerGestureEvent,
12+
HandlerStateChangeEvent,
13+
PinchGestureHandlerEventPayload,
14+
} from 'react-native-gesture-handler';
915

1016
const defaultImage = 'https://wx3.sinaimg.cn/mw690/4718260ely1gt2cg7t5udj23dw1wkhdu.jpg';
1117

@@ -25,12 +31,31 @@ export interface ImageViewerProps extends ViewProps {
2531
}
2632

2733
function ImageViewer(props: ImageViewerProps) {
28-
const { width = 150, height = 150, src = defaultImage, defaultIndex = 0, ...others } = props;
29-
const [visible, setVisible] = useState(false);
34+
const { width = 150, height = 150, src = defaultImage, defaultIndex = 0 } = props;
3035
const [index, setIndex] = useState<number>(0);
36+
const [visible, setVisible] = useState(false);
37+
const [canVisible, setCanVisible] = useState(true);
3138
const fadeAnim = useRef(new Animated.Value(0)).current;
3239

33-
useMemo(() => {
40+
const scale = useRef(new Animated.Value(1)).current; // 初始缩放比例为 1
41+
const lastScale = useRef(1); // 上一次的缩放比例
42+
43+
const onPinchGestureEvent = (event: PinchGestureHandlerGestureEvent) => {
44+
if (event.nativeEvent.scale) {
45+
// 更新缩放比例
46+
scale.setValue(lastScale.current * event.nativeEvent.scale);
47+
}
48+
};
49+
50+
const onPinchHandlerStateChange = (event: HandlerStateChangeEvent<PinchGestureHandlerEventPayload>) => {
51+
if (event.nativeEvent.oldState === 4 && event.nativeEvent.state === 5) {
52+
// 手势结束后,保存缩放比例
53+
lastScale.current *= event.nativeEvent.scale;
54+
scale.setValue(lastScale.current);
55+
}
56+
};
57+
58+
useEffect(() => {
3459
if (!visible) {
3560
fadeAnim.setValue(0);
3661
return;
@@ -49,45 +74,37 @@ function ImageViewer(props: ImageViewerProps) {
4974
return src;
5075
}, [src]);
5176

52-
const onImgClick = (index: number) => {
53-
setIndex(index);
54-
setVisible(true);
55-
};
77+
const PinchGestureHandlerChild = (url: string) =>
78+
useMemo(
79+
() => (
80+
<PinchGestureHandler onGestureEvent={onPinchGestureEvent} onHandlerStateChange={onPinchHandlerStateChange}>
81+
<Animated.View style={[{ transform: [{ scale }] }]}>
82+
<Image style={{ width: '100%', height: '100%', resizeMode: 'contain' }} source={{ uri: url }} />
83+
</Animated.View>
84+
</PinchGestureHandler>
85+
),
86+
[src, scale],
87+
);
5688

5789
return (
5890
<View style={{}}>
59-
<View style={{ flexDirection: 'row', justifyContent: 'space-between' }}>
60-
{Array.isArray(src) ? (
61-
src.map((item: ImageViewerDataSourceProps, index: number) => {
62-
return (
63-
<TransitionImage
64-
key={index}
65-
style={{ width: width, height: height, flex: 1 }}
66-
onPress={() => onImgClick(index)}
67-
source={{ uri: item.url }}
68-
PlaceholderContent={<ActivityIndicator />}
69-
transition={true}
70-
transitionDuration={500}
71-
/>
72-
);
73-
})
74-
) : (
75-
<TransitionImage
76-
style={{ width: width, height: height }}
77-
onPress={() => setVisible(true)}
78-
source={{ uri: imgUrl }}
79-
PlaceholderContent={<ActivityIndicator />}
80-
transition={true}
81-
transitionDuration={500}
82-
/>
83-
)}
84-
</View>
91+
<TransitionImage
92+
style={{ width: width, height: height }}
93+
onPress={() => canVisible && setVisible(true)}
94+
source={{ uri: imgUrl }}
95+
PlaceholderContent={<ActivityIndicator />}
96+
transition={true}
97+
transitionDuration={500}
98+
onError={(e) => {
99+
if (e?.nativeEvent?.error) setCanVisible(false);
100+
}}
101+
/>
85102
<MaskLayer visible={visible} onDismiss={() => setVisible(false)} opacity={0.9}>
86103
<Animated.View style={[styles.content, { opacity: fadeAnim }]}>
87104
{Array.isArray(src) ? (
88105
<Swiper dataSource={src} height={200} autoplay={false} index={index} />
89106
) : (
90-
<Image style={{ width: '100%', height: '100%', resizeMode: 'contain' }} source={{ uri: src }} />
107+
PinchGestureHandlerChild(imgUrl)
91108
)}
92109
</Animated.View>
93110
</MaskLayer>

packages/core/src/TextArea/README.md

Lines changed: 0 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -116,31 +116,6 @@ function Demo() {
116116

117117
export default Demo
118118
```
119-
120-
### 根据内容自动调整高度
121-
122-
```jsx mdx:preview&background=#bebebe29
123-
import React, { useState } from 'react';
124-
import TextArea from '@uiw/react-native/lib/TextArea';
125-
126-
function Demo() {
127-
const [value, setValue] = useState('')
128-
129-
return (
130-
<TextArea
131-
value={value}
132-
onChange={(value) => {
133-
setValue(value);
134-
}}
135-
fontStyle={{ color:'#aaa' }}
136-
placeholder='请输入'
137-
autoSize
138-
/>
139-
)
140-
}
141-
export default Demo
142-
```
143-
144119
### 自定义输入框样式
145120
```jsx mdx:preview&background=#bebebe29
146121
import React, { useState } from 'react';

packages/core/src/TextArea/index.tsx

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,8 @@ import {
1515
TextInputContentSizeChangeEventData,
1616
PanResponder,
1717
PanResponderInstance,
18-
LayoutChangeEvent,
1918
} from 'react-native';
2019

21-
import Icon, { IconsName } from '../Icon';
22-
2320
export interface TextAreaProps extends ViewProps {
2421
/** 文本位置 */
2522
textAlignVertical?: 'top' | 'center' | 'auto' | 'bottom' | undefined;
@@ -92,13 +89,13 @@ function TextArea(props: TextAreaProps) {
9289

9390
const onChangeValue = (event: NativeSyntheticEvent<TextInputChangeEventData>) => {
9491
if (autoSize) {
95-
setDefaultText(event.nativeEvent.text);
92+
setDefaultText(event?.nativeEvent?.text);
9693
}
9794
};
9895

9996
const onContentSizeChange = (event: NativeSyntheticEvent<TextInputContentSizeChangeEventData>) => {
10097
if (autoSize) {
101-
setHeight(event.nativeEvent.contentSize.height + 20);
98+
setHeight(event?.nativeEvent?.contentSize?.height + 20);
10299
}
103100
};
104101

website/src/pages/docs/environment-setup/android-phone/README.md renamed to website/src/pages/docs/phone-run/android-phone/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
Android 真机环境安装
1+
Android 真机运行
22
===
33

44
本文档将指导你通过必须的步骤在设备上运行 React Native app,为生产做准备 。

website/src/pages/docs/environment-setup/ios-phone/index.tsx renamed to website/src/pages/docs/phone-run/android-phone/index.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ const DEMO = () => (
1111
<Preview
1212
{...md}
1313
transformImageUri={transformImageUri}
14-
path="website/src/pages/docs/environment-setup/ios-phone/README.md"
14+
path="website/src/pages/docs/phone-run/android-phone/README.md"
1515
/>
1616
);
1717
export default DEMO;

0 commit comments

Comments
 (0)