271 lines
4.9 KiB
Markdown
271 lines
4.9 KiB
Markdown
# Native Controls
|
|
|
|
Native iOS controls provide built-in haptics, accessibility, and platform-appropriate styling.
|
|
|
|
## Switch
|
|
|
|
Use for binary on/off settings. Has built-in haptics.
|
|
|
|
```tsx
|
|
import { Switch } from "react-native";
|
|
import { useState } from "react";
|
|
|
|
const [enabled, setEnabled] = useState(false);
|
|
|
|
<Switch value={enabled} onValueChange={setEnabled} />;
|
|
```
|
|
|
|
### Customization
|
|
|
|
```tsx
|
|
<Switch
|
|
value={enabled}
|
|
onValueChange={setEnabled}
|
|
trackColor={{ false: "#767577", true: "#81b0ff" }}
|
|
thumbColor={enabled ? "#f5dd4b" : "#f4f3f4"}
|
|
ios_backgroundColor="#3e3e3e"
|
|
/>
|
|
```
|
|
|
|
## Segmented Control
|
|
|
|
Use for non-navigational tabs or mode selection. Avoid changing default colors.
|
|
|
|
```tsx
|
|
import SegmentedControl from "@react-native-segmented-control/segmented-control";
|
|
import { useState } from "react";
|
|
|
|
const [index, setIndex] = useState(0);
|
|
|
|
<SegmentedControl
|
|
values={["All", "Active", "Done"]}
|
|
selectedIndex={index}
|
|
onChange={({ nativeEvent }) => setIndex(nativeEvent.selectedSegmentIndex)}
|
|
/>;
|
|
```
|
|
|
|
### Rules
|
|
|
|
- Maximum 4 options — use a picker for more
|
|
- Keep labels short (1-2 words)
|
|
- Avoid custom colors — native styling adapts to dark mode
|
|
|
|
### With Icons (iOS 14+)
|
|
|
|
```tsx
|
|
<SegmentedControl
|
|
values={[
|
|
{ label: "List", icon: "list.bullet" },
|
|
{ label: "Grid", icon: "square.grid.2x2" },
|
|
]}
|
|
selectedIndex={index}
|
|
onChange={({ nativeEvent }) => setIndex(nativeEvent.selectedSegmentIndex)}
|
|
/>
|
|
```
|
|
|
|
## Slider
|
|
|
|
Continuous value selection.
|
|
|
|
```tsx
|
|
import Slider from "@react-native-community/slider";
|
|
import { useState } from "react";
|
|
|
|
const [value, setValue] = useState(0.5);
|
|
|
|
<Slider
|
|
value={value}
|
|
onValueChange={setValue}
|
|
minimumValue={0}
|
|
maximumValue={1}
|
|
/>;
|
|
```
|
|
|
|
### Customization
|
|
|
|
```tsx
|
|
<Slider
|
|
value={value}
|
|
onValueChange={setValue}
|
|
minimumValue={0}
|
|
maximumValue={100}
|
|
step={1}
|
|
minimumTrackTintColor="#007AFF"
|
|
maximumTrackTintColor="#E5E5EA"
|
|
thumbTintColor="#007AFF"
|
|
/>
|
|
```
|
|
|
|
### Discrete Steps
|
|
|
|
```tsx
|
|
<Slider
|
|
value={value}
|
|
onValueChange={setValue}
|
|
minimumValue={0}
|
|
maximumValue={10}
|
|
step={1}
|
|
/>
|
|
```
|
|
|
|
## Date/Time Picker
|
|
|
|
Compact pickers with popovers. Has built-in haptics.
|
|
|
|
```tsx
|
|
import DateTimePicker from "@react-native-community/datetimepicker";
|
|
import { useState } from "react";
|
|
|
|
const [date, setDate] = useState(new Date());
|
|
|
|
<DateTimePicker
|
|
value={date}
|
|
onChange={(event, selectedDate) => {
|
|
if (selectedDate) setDate(selectedDate);
|
|
}}
|
|
mode="datetime"
|
|
/>;
|
|
```
|
|
|
|
### Modes
|
|
|
|
- `date` — Date only
|
|
- `time` — Time only
|
|
- `datetime` — Date and time
|
|
|
|
### Display Styles
|
|
|
|
```tsx
|
|
// Compact inline (default)
|
|
<DateTimePicker value={date} mode="date" />
|
|
|
|
// Spinner wheel
|
|
<DateTimePicker
|
|
value={date}
|
|
mode="date"
|
|
display="spinner"
|
|
style={{ width: 200, height: 150 }}
|
|
/>
|
|
|
|
// Full calendar
|
|
<DateTimePicker value={date} mode="date" display="inline" />
|
|
```
|
|
|
|
### Time Intervals
|
|
|
|
```tsx
|
|
<DateTimePicker
|
|
value={date}
|
|
mode="time"
|
|
minuteInterval={15}
|
|
/>
|
|
```
|
|
|
|
### Min/Max Dates
|
|
|
|
```tsx
|
|
<DateTimePicker
|
|
value={date}
|
|
mode="date"
|
|
minimumDate={new Date(2020, 0, 1)}
|
|
maximumDate={new Date(2030, 11, 31)}
|
|
/>
|
|
```
|
|
|
|
## Stepper
|
|
|
|
Increment/decrement numeric values.
|
|
|
|
```tsx
|
|
import { Stepper } from "react-native";
|
|
import { useState } from "react";
|
|
|
|
const [count, setCount] = useState(0);
|
|
|
|
<Stepper
|
|
value={count}
|
|
onValueChange={setCount}
|
|
minimumValue={0}
|
|
maximumValue={10}
|
|
/>;
|
|
```
|
|
|
|
## TextInput
|
|
|
|
Native text input with various keyboard types.
|
|
|
|
```tsx
|
|
import { TextInput } from "react-native";
|
|
|
|
<TextInput
|
|
placeholder="Enter text..."
|
|
placeholderTextColor="#999"
|
|
style={{
|
|
padding: 12,
|
|
fontSize: 16,
|
|
borderRadius: 8,
|
|
backgroundColor: "#f0f0f0",
|
|
}}
|
|
/>
|
|
```
|
|
|
|
### Keyboard Types
|
|
|
|
```tsx
|
|
// Email
|
|
<TextInput keyboardType="email-address" autoCapitalize="none" />
|
|
|
|
// Phone
|
|
<TextInput keyboardType="phone-pad" />
|
|
|
|
// Number
|
|
<TextInput keyboardType="numeric" />
|
|
|
|
// Password
|
|
<TextInput secureTextEntry />
|
|
|
|
// Search
|
|
<TextInput
|
|
returnKeyType="search"
|
|
enablesReturnKeyAutomatically
|
|
/>
|
|
```
|
|
|
|
### Multiline
|
|
|
|
```tsx
|
|
<TextInput
|
|
multiline
|
|
numberOfLines={4}
|
|
textAlignVertical="top"
|
|
style={{ minHeight: 100 }}
|
|
/>
|
|
```
|
|
|
|
## Picker (Wheel)
|
|
|
|
For selection from many options (5+ items).
|
|
|
|
```tsx
|
|
import { Picker } from "@react-native-picker/picker";
|
|
import { useState } from "react";
|
|
|
|
const [selected, setSelected] = useState("js");
|
|
|
|
<Picker selectedValue={selected} onValueChange={setSelected}>
|
|
<Picker.Item label="JavaScript" value="js" />
|
|
<Picker.Item label="TypeScript" value="ts" />
|
|
<Picker.Item label="Python" value="py" />
|
|
<Picker.Item label="Go" value="go" />
|
|
</Picker>;
|
|
```
|
|
|
|
## Best Practices
|
|
|
|
- **Haptics**: Switch and DateTimePicker have built-in haptics — don't add extra
|
|
- **Accessibility**: Native controls have proper accessibility labels by default
|
|
- **Dark Mode**: Avoid custom colors — native styling adapts automatically
|
|
- **Spacing**: Use consistent padding around controls (12-16pt)
|
|
- **Labels**: Place labels above or to the left of controls
|
|
- **Grouping**: Group related controls in sections with headers
|