---
modificationDate: May 19, 2026
title: Image
description: A SwiftUI Image component for displaying SF Symbols.
sourceCodeUrl: 'https://github.com/expo/expo/tree/main/packages/expo-ui'
packageName: '@expo/ui'
platforms: ['ios', 'tvos', 'expo-go']
---

<AgentInstructions>

## Submitting Feedback

If this page contains errors, outdated information, or gaps that blocked you from completing a task, report it so the docs can be improved:

curl -X POST https://api.expo.dev/v2/feedback/docs-send -H 'Content-Type: application/json' -d '{"url":"/versions/unversioned/sdk/ui/swift-ui/image/","feedback":"🤖 Agent feedback: <specific, actionable description>"}'

Only submit when you have something specific and actionable to report.

</AgentInstructions>

> This is documentation for the next SDK version. For up-to-date documentation, see the [latest version](/versions/latest/sdk/ui/swift-ui/image) (SDK 56).

# Image

A SwiftUI Image component for displaying SF Symbols.
iOS, tvOS, Included in Expo Go

> For the complete documentation index, see [llms.txt](/llms.txt). Use this file to discover all available pages.

> For cross-platform usage, see the universal [`Icon`](/versions/unversioned/sdk/ui/universal/icon) — it renders the appropriate native component per platform.

Expo UI Image displays SF Symbols using the SwiftUI [Image API](https://developer.apple.com/documentation/swiftui/image). SF Symbols are a library of configurable symbols provided by Apple.

## Installation

```sh
npx expo install @expo/ui
```

If you are installing this in an [existing React Native app](/bare/overview), make sure to [install `expo`](/bare/installing-expo-modules) in your project.

## Usage

### Basic SF Symbol

```tsx
import { Host, Image } from '@expo/ui/swift-ui';

export default function BasicImageExample() {
  return (
    <Host matchContents>
      <Image systemName="star.fill" />
    </Host>
  );
}
```

### With size and color

```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+.

```tsx
import { Host, HStack, Image } from '@expo/ui/swift-ui';

export default function ImageVariableExample() {
  return (
    <Host matchContents>
      <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`](/versions/unversioned/sdk/ui/swift-ui/modifiers#symboleffecteffect-args) 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.

```tsx
import { Host, Image } from '@expo/ui/swift-ui';
import { symbolEffect } from '@expo/ui/swift-ui/modifiers';

export default function ImageSymbolEffectExample() {
  return (
    <Host matchContents>
      <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`](https://docs.swmansion.com/react-native-worklets/docs/threading/scheduleOnUI)) to trigger the effect.

```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.

```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 matchContents>
      <VStack spacing={16}>
        <Image
          systemName="cloud.fill"
          size={48}
          color="cyan"
          modifiers={[symbolEffect({ effect: 'breathe' }, { isActive })]}
        />
        <SyncToggle label="Breathe" isOn={isActive} />
      </VStack>
    </Host>
  );
}
```

## API

```tsx
import { Image } from '@expo/ui/swift-ui';
```

## Component

### `Image`

Supported platforms: iOS, tvOS.

Type: React.[Element](https://www.typescriptlang.org/docs/handbook/jsx.html#function-component)<[ImageProps](#imageprops)\>

ImageProps

### `color`

Supported platforms: iOS, tvOS.

Optional • Type: [ColorValue](https://reactnative.dev/docs/colors)

The color of the system image. Can be a color name like '#ff00ff', 'red', 'blue', etc.

### `onPress`

Supported platforms: iOS, tvOS.

Optional • Type: `() => void`

Callback triggered when the view is pressed.

### `size`

Supported platforms: iOS, tvOS.

Optional • Type: `number`

The size of the system image.

### `systemName`

Supported platforms: iOS, tvOS.

Optional • Type: [SFSymbols7_0](https://github.com/nandorojo/sf-symbols-typescript)

The name of the system image (SF Symbol). For example: 'photo', 'heart.fill', 'star.circle'

### `uiImage`

Supported platforms: iOS, tvOS.

Optional • Type: `string`

The URI of the local image file to display. For example: 'file:///path/to/image.jpg' Performs a synchronous read operation that blocks the main thread.

### `variableValue`

Supported platforms: iOS16.0+, tvOS16.0+.

Optional • Type: `number`

The variable value that alters the symbol's appearance. A number between 0.0 and 1.0. Only works with SF Symbols that support variable values (SF Symbols 4.0+).

#### Inherited Props

-   [CommonViewModifierProps](/versions/unversioned/sdk/ui/swift-ui/modifiers)
