Expo UI and Router for iOS
Components

Image

A SwiftUI Image component for displaying SF Symbols. Also called Icon (Universal).

Expo UI Image displays SF Symbols using the SwiftUI Image API. SF Symbols are a library of configurable symbols provided by Apple.

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

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

export default function ImageSizeColorExample() {
  return (
    <Host style={{ flex: 1 }}>
      <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.

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.

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 style={{ flex: 1 }}>
      <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.

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';

Component

Image

Type: React.Element<ImageProps>

ImageProps

assetName

Optional • Type: string

The asset catalog name of a custom SF Symbol imported as a symbol set.

color

Optional • Type: ColorValue

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

onPress

Optional • Type: () => void

Callback triggered when the view is pressed.

size

Optional • Type: number

The fixed size of the system image in points. Does not scale with Dynamic Type. Use the font modifier with textStyle for that. Ignored when a font modifier is supplied.

systemName

Optional • Type: SFSymbols7_0

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

uiImage

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.

Modifiers

Use these modifiers in the modifiers prop of the SwiftUI and Universal version.

Modifiers for Image

Modifiers for any view

Sources

The original Expo docs for this page:

On this page