This documentation is available as Markdown for AI agents and LLMs. See the full Markdown index or append .md to any documentation URL.
This is documentation for the next SDK version. For up-to-date documentation, see the
latest version (SDK 57).
Image A SwiftUI Image component for displaying SF Symbols.
For cross-platform usage, see the universal Icon — it renders the appropriate native component per platform.
Expo UI Image displays SF Symbols using the SwiftUI Image API . SF Symbols are a library of configurable symbols provided by Apple.
Installation
- npx expo install @expo/ui
- yarn expo install @expo/ui
- pnpm expo install @expo/ui
- bun expo install @expo/ui
If you are installing this in an existing React Native app , make sure to install expo in your project.
Usage
Basic SF Symbol
import { Host , Image } from '@expo/ui/swift-ui' ;
export default function BasicImageExample ( ) {
return (
< Host style = { { flex: 1 } } >
< Image systemName = " star.fill" />
</ Host >
) ;
}
Custom SF Symbol
Use the assetName prop to display a custom SF Symbol imported into the app asset catalog as a symbol set.
import { Host , Image } from '@expo/ui/swift-ui' ;
export default function CustomImageExample ( ) {
return (
< Host matchContents >
< Image assetName = " acme.mark" />
</ Host >
) ;
}
With size and color
ImageSizeColorExample.tsx import { Host , HStack , Image } from '@expo/ui/swift-ui' ;
export default function ImageSizeColorExample ( ) {
return (
< Host matchContents >
< HStack spacing = { 16 } >
< Image systemName = " heart.fill" size = { 24 } color = " red" />
< Image systemName = " star.fill" size = { 32 } color = " orange" />
< Image systemName = " bell.fill" size = { 40 } color = " blue" />
</ HStack >
</ Host >
) ;
}
With variable value
Some SF Symbols alter their appearance based on a variable value. Use the variableValue prop with a value between 0.0 and 1.0 to control the rendered symbol. Requires iOS 16.0+ and SF Symbols 4.0+.
import { Host , HStack , Image } from '@expo/ui/swift-ui' ;
export default function ImageVariableExample ( ) {
return (
< Host style = { { flex: 1 } } >
< HStack spacing = { 16 } >
< Image
systemName = " chart.bar.fill"
size = { 32 }
variableValue = { 0.3 }
/>
< Image
systemName = " chart.bar.fill"
size = { 32 }
variableValue = { 0.6 }
/>
< Image
systemName = " chart.bar.fill"
size = { 32 }
variableValue = { 1.0 }
/>
</ HStack >
</ Host >
) ;
}
With symbol effect
Apply an SF Symbol effect to animate the symbol by passing a symbolEffect modifier from @expo/ui/swift-ui/modifiers. This effect runs continuously by default. You can also pass value for a discrete trigger that fires once per change, or isActive for a boolean toggle that runs the effect while true. Requires iOS 17.0 and later.
ImageSymbolEffectExample.tsx import { Host , Image } from '@expo/ui/swift-ui' ;
import { symbolEffect } from '@expo/ui/swift-ui/modifiers' ;
export default function ImageSymbolEffectExample ( ) {
return (
< Host style = { { flex: 1 } } >
< Image
systemName = " wifi"
size = { 48 }
color = " blue"
modifiers = { [
symbolEffect ( {
effect: 'variableColor' ,
fillStyle: 'iterative' ,
playbackStyle: 'reversing' ,
} ) ,
] }
/>
</ Host >
) ;
}
The following example uses value to play bounce on each button press. Write to state.value from a worklet (or via scheduleOnUI ) to trigger the effect.
ImageSymbolEffectValueExample.tsx import {
Button ,
Host ,
Image ,
useNativeState,
VStack ,
} from '@expo/ui/swift-ui' ;
import { symbolEffect } from '@expo/ui/swift-ui/modifiers' ;
import { scheduleOnUI } from 'react-native-worklets' ;
export default function ImageSymbolEffectValueExample ( ) {
const trigger = useNativeState ( 0 ) ;
return (
< Host matchContents >
< VStack spacing = { 16 } >
< Image
systemName = " bell.fill"
size = { 48 }
color = " orange"
modifiers = { [
symbolEffect (
{ effect: 'bounce' , direction: 'up' } ,
{ value: trigger }
) ,
] }
/>
< Button
label = " Bounce"
onPress = { ( ) =>
scheduleOnUI ( ( ) => {
'worklet' ;
trigger. value = trigger. value + 1 ;
} )
}
/>
</ VStack >
</ Host >
) ;
}
The following example uses isActive to toggle a continuous breathe animation.
ImageSymbolEffectIsActiveExample.tsx import {
Host ,
Image ,
SyncToggle ,
useNativeState,
VStack ,
} from '@expo/ui/swift-ui' ;
import { symbolEffect } from '@expo/ui/swift-ui/modifiers' ;
export default function ImageSymbolEffectIsActiveExample ( ) {
const isActive = useNativeState ( true ) ;
return (
< Host style = { { flex: 1 } } >
< VStack spacing = { 16 } >
< Image
systemName = " cloud.fill"
size = { 48 }
color = " cyan"
modifiers = { [
symbolEffect ( { effect: 'breathe' } , { isActive } ) ,
] }
/>
< SyncToggle label = " Breathe" isOn = { isActive} />
</ VStack >
</ Host >
) ;
}
API
import { Image } from '@expo/ui/swift-ui' ;
No API data file found, sorry!