Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 15 additions & 14 deletions src/Core/src/Platform/iOS/ActivityIndicatorExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ public static class ActivityIndicatorExtensions
public static void UpdateIsRunning(this UIActivityIndicatorView activityIndicatorView, IActivityIndicator activityIndicator)
{
// Since Visibility and IsRunning are dependent on each other, we handle Visibility explicitly.
// Only show and animate if both IsRunning AND Visibility == Visible
// Only show and animate if both IsRunning AND Visibility == Visible.
if (activityIndicator.IsRunning && activityIndicator.Visibility == Visibility.Visible)
{
activityIndicatorView.Inflate();
Expand All @@ -18,19 +18,20 @@ public static void UpdateIsRunning(this UIActivityIndicatorView activityIndicato
{
if (activityIndicatorView.IsAnimating)
activityIndicatorView.StopAnimating();

// Collapsed requires layout constraint (CollapseConstraint) to zero out size;
// Hidden only sets Hidden = true (preserving layout space).
if (activityIndicator.Visibility == Visibility.Collapsed)
{
activityIndicatorView.Hidden = true;
activityIndicatorView.Collapse();
}
else
{
activityIndicatorView.Inflate();
activityIndicatorView.Hidden = activityIndicator.Visibility != Visibility.Visible;
}

// Collapsed requires layout constraint (CollapseConstraint) to zero out size;
// Hidden only sets Hidden = true (preserving layout space).
if (activityIndicator.Visibility == Visibility.Collapsed)
{
activityIndicatorView.Hidden = true;
activityIndicatorView.Collapse();
}
else
{
activityIndicatorView.Inflate();
// Always hide when not (IsRunning && Visible) — avoids frozen static frame.
activityIndicatorView.Hidden = true;
}
}
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
using System;
using System.Threading.Tasks;
using Microsoft.Maui.DeviceTests.Stubs;
using Microsoft.Maui.Graphics;
using Microsoft.Maui.Handlers;
using ObjCRuntime;
using UIKit;
using Xunit;

namespace Microsoft.Maui.DeviceTests
{
Expand All @@ -14,5 +16,34 @@ UIActivityIndicatorView GetNativeActivityIndicator(ActivityIndicatorHandler acti

bool GetNativeIsRunning(ActivityIndicatorHandler activityIndicatorHandler) =>
GetNativeActivityIndicator(activityIndicatorHandler).IsAnimating;

[Fact(DisplayName = "Setting IsRunning False While Visible Should Hide Native View")]
public async Task SettingIsRunningFalseWhileVisibleShouldHideNativeView()
{
var activityIndicator = new ActivityIndicatorStub
{
IsRunning = true,
Visibility = Visibility.Visible
};

bool isAnimating = true;
bool isHidden = false;

await InvokeOnMainThreadAsync(() =>
{
var handler = CreateHandler(activityIndicator);

activityIndicator.IsRunning = false;
handler.UpdateValue(nameof(IActivityIndicator.IsRunning));

var nativeView = GetNativeActivityIndicator(handler);
isAnimating = nativeView.IsAnimating;
isHidden = nativeView.Hidden;
});

Assert.False(isAnimating, "ActivityIndicator should stop animating when IsRunning is false.");
Assert.True(isHidden, "ActivityIndicator should be hidden when IsRunning is false.");
}

}
}
Loading