react-native-gleam 1.0.2 → 1.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/ios/GleamView.mm +32 -2
- package/package.json +1 -1
package/ios/GleamView.mm
CHANGED
|
@@ -182,6 +182,33 @@ static void _unregisterView(GleamView *view) {
|
|
|
182
182
|
[self.layer addSublayer:_shimmerLayer];
|
|
183
183
|
}
|
|
184
184
|
[self _registerClock];
|
|
185
|
+
} else if (!_isTransitioning) {
|
|
186
|
+
[self _setChildrenAlphaIfNeeded:1.0];
|
|
187
|
+
_shimmerLayer.opacity = 0.0;
|
|
188
|
+
[_shimmerLayer removeFromSuperlayer];
|
|
189
|
+
[self _unregisterClock];
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
- (void)didMoveToWindow
|
|
194
|
+
{
|
|
195
|
+
[super didMoveToWindow];
|
|
196
|
+
if (!self.window) return;
|
|
197
|
+
|
|
198
|
+
// View (re)joined a window — resync visual state.
|
|
199
|
+
// Mirrors Android's onAttachedToWindow re-attachment path.
|
|
200
|
+
if (_loading) {
|
|
201
|
+
if (_shimmerLayer.superlayer != self.layer) {
|
|
202
|
+
[self.layer addSublayer:_shimmerLayer];
|
|
203
|
+
}
|
|
204
|
+
[self _registerClock];
|
|
205
|
+
} else if (!_isTransitioning) {
|
|
206
|
+
// _isTransitioning=YES means ticks are actively driving it to
|
|
207
|
+
// completion (we no longer bail on !self.window) — let it finish.
|
|
208
|
+
[self _setChildrenAlphaIfNeeded:1.0];
|
|
209
|
+
_shimmerLayer.opacity = 0.0;
|
|
210
|
+
[_shimmerLayer removeFromSuperlayer];
|
|
211
|
+
[self _unregisterClock];
|
|
185
212
|
}
|
|
186
213
|
}
|
|
187
214
|
|
|
@@ -357,8 +384,10 @@ static void _unregisterView(GleamView *view) {
|
|
|
357
384
|
|
|
358
385
|
- (void)_tickWithTime:(CFTimeInterval)now
|
|
359
386
|
{
|
|
360
|
-
|
|
361
|
-
|
|
387
|
+
// Transitions must always complete to avoid stuck visual state when the
|
|
388
|
+
// view is hidden (display:'none' → hidden=YES) or has no window.
|
|
389
|
+
// Cost is bounded (≤ transitionDuration) and the ops are cheap property sets.
|
|
390
|
+
// Shimmer animation is cosmetic and unbounded — skip when not visible.
|
|
362
391
|
if (_isTransitioning) {
|
|
363
392
|
_transitionElapsed += _displayLink.duration;
|
|
364
393
|
CGFloat t = _transitionDuration > 0 ? fmin(_transitionElapsed / _transitionDuration, 1.0) : 1.0;
|
|
@@ -431,6 +460,7 @@ static void _unregisterView(GleamView *view) {
|
|
|
431
460
|
[self _finishTransition];
|
|
432
461
|
}
|
|
433
462
|
} else if (_loading) {
|
|
463
|
+
if (!self.window) return;
|
|
434
464
|
[self _updateGradientPositionWithTime:now];
|
|
435
465
|
}
|
|
436
466
|
}
|