Skip to content

Commit f9d75e4

Browse files
authored
fix(ios): pass fit in constructor, OOB asset improvements (#237)
- Pass `fit:` directly in `Rive()` constructor instead of setting it post-creation. Removes the `layoutSubviews`/`pendingFit` workaround since rive-ios 6.19.1 handles this (rive-ios#443) - Warn when `updateReferencedAssets` is called on experimental backend (not supported — concurrency API can't update already-bound artboard assets) - Switch asset registration from parallel `TaskGroup` to sequential to ensure command queue ordering - Add debug logging to `ExperimentalAssetLoader` - Add explicit `type` fields to OutOfBandAssets example - Add `expo-font` plugin for `kanit_regular.ttf` in expo examples ## Test plan - QuickStart + DataBindingArtboards render correctly with `Fit.Layout` on first mount - Out-of-Band Assets example loads initial assets correctly - `updateReferencedAssets` logs a warning instead of silently failing
1 parent dcfc431 commit f9d75e4

8 files changed

Lines changed: 22 additions & 43 deletions

File tree

example/src/exercisers/OutOfBandAssets.tsx

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -22,26 +22,17 @@ export default function OutOfBandAssetsExample() {
2222
referencedAssets: {
2323
'Inter-594377': {
2424
source: require('../../assets/fonts/Inter-594377.ttf'),
25-
// source: {
26-
// fileName: 'Inter-594377.ttf',
27-
// path: 'fonts', // only needed for Android assets
28-
// },
25+
type: 'font',
2926
},
3027
'referenced-image-2929282': {
3128
source: {
3229
uri: uri,
3330
},
34-
// source: {
35-
// fileName: 'referenced-image-2929282.png',
36-
// path: 'images', // only needed for Android assets
37-
// },
31+
type: 'image',
3832
},
3933
'referenced_audio-2929340': {
4034
source: require('../../assets/audio/referenced_audio-2929340.wav'),
41-
// source: {
42-
// fileName: 'referenced_audio-2929340.wav',
43-
// path: 'audio', // only needed for Android assets
44-
// },
35+
type: 'audio',
4536
},
4637
},
4738
}

expo-example/app.config.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,12 @@ module.exports = {
4747
assets: ['../example/assets/rive/rewards.riv'],
4848
},
4949
],
50+
[
51+
'expo-font',
52+
{
53+
fonts: ['./assets/kanit_regular.ttf'],
54+
},
55+
],
5056
],
5157
experiments: {
5258
typedRoutes: true,

expo55-example/app.config.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,12 @@ module.exports = {
4747
assets: ['../example/assets/rive/rewards.riv'],
4848
},
4949
],
50+
[
51+
'expo-font',
52+
{
53+
fonts: ['./assets/kanit_regular.ttf'],
54+
},
55+
],
5056
],
5157
experiments: {
5258
typedRoutes: true,

ios/new/ExperimentalAssetLoader.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
@_spi(RiveExperimental) import RiveRuntime
1+
import RiveRuntime
22
import NitroModules
33

44
enum AssetType {

ios/new/HybridRiveFile.swift

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
@_spi(RiveExperimental) import RiveRuntime
1+
import RiveRuntime
22
import NitroModules
33

44
class HybridRiveFile: HybridRiveFileSpec {
@@ -149,14 +149,7 @@ class HybridRiveFile: HybridRiveFileSpec {
149149
}
150150

151151
func updateReferencedAssets(referencedAssets: ReferencedAssetsType) {
152-
guard let worker = worker else {
153-
RCTLogWarn("HybridRiveFile.updateReferencedAssets: No worker available")
154-
return
155-
}
156-
RCTLogInfo("HybridRiveFile.updateReferencedAssets: Updating \(referencedAssets.data?.count ?? 0) assets (note: existing artboards won't refresh)")
157-
Task { @MainActor in
158-
await ExperimentalAssetLoader.registerAssets(referencedAssets, on: worker)
159-
}
152+
RCTLogWarn("[Rive] updateReferencedAssets is not supported with the experimental backend — already-rendered artboards cannot be updated. Use the legacy backend for runtime asset swapping.")
160153
}
161154

162155
func getEnums() throws -> Promise<[RiveEnumDefinition]> {

ios/new/HybridRiveFileFactory.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
@_spi(RiveExperimental) import RiveRuntime
1+
import RiveRuntime
22
import NitroModules
33

44
final class HybridRiveFileFactory: HybridRiveFileFactorySpec, @unchecked Sendable {

ios/new/HybridRiveView.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
@_spi(RiveExperimental) import RiveRuntime
1+
import RiveRuntime
22
import Foundation
33
import NitroModules
44
import UIKit

ios/new/RiveReactNativeView.swift

Lines changed: 2 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import RiveRuntime
22
import NitroModules
33
import UIKit
4-
import MetalKit
54

65
enum ExperimentalBindData {
76
case none
@@ -28,23 +27,8 @@ class RiveReactNativeView: UIView {
2827
private var isViewReady = false
2928
private var configTask: Task<Void, Never>?
3029
private var isPaused = false
31-
private var pendingFit: RiveRuntime.Fit?
32-
3330
var autoPlay: Bool = true
3431

35-
override func layoutSubviews() {
36-
super.layoutSubviews()
37-
applyPendingFitIfMTKViewReady()
38-
}
39-
40-
// https://github.com/rive-app/rive-nitro-react-native/pull/231
41-
private func applyPendingFitIfMTKViewReady() {
42-
guard let fit = pendingFit, let rive = riveInstance,
43-
riveUIView?.subviews.contains(where: { $0 is MTKView }) == true else { return }
44-
rive.fit = fit
45-
pendingFit = nil
46-
}
47-
4832
func awaitViewReady() async -> Bool {
4933
if !isViewReady {
5034
await withCheckedContinuation { continuation in
@@ -101,7 +85,8 @@ class RiveReactNativeView: UIView {
10185
file: config.file,
10286
artboard: artboard,
10387
stateMachine: stateMachine,
104-
dataBind: dataBind
88+
dataBind: dataBind,
89+
fit: config.fit
10590
)
10691

10792
guard !Task.isCancelled else { return }
@@ -110,8 +95,6 @@ class RiveReactNativeView: UIView {
11095
self.riveInstance = rive
11196
self.setupRiveUIView(with: rive)
11297

113-
self.pendingFit = config.fit
114-
11598
if config.autoPlay {
11699
self.isPaused = false
117100
}

0 commit comments

Comments
 (0)