Xamarin.Forms Dispatcher.BeginInvokeOnMainThread, вызывающий взаимоблокировку iOS - PullRequest
0 голосов
/ 22 марта 2020

На моей странице есть индикатор активности, который называется indicator. Я хочу оживить его, чтобы он перебирал все цвета. Для этого я использую этот метод:

public static async Task ActivityIndicatorRainbow(ActivityIndicator indicator, int colorDelay)
        {
            for (double i = 0; i < 1; i += 0.01)
            {
                Color c = Color.FromHsla(i, 0.5, 0.5);

                indicator.Dispatcher.BeginInvokeOnMainThread(()=> indicator.Color = c);

                await Task.Delay(colorDelay);
            }
        }

И в моем методе ButtonPressed я называю это следующим образом:

activityIndicator.IsRunning = true;
await Task.Run(() => ActivityIndicatorRainbow(activityIndicator, 10));

Вкл. Android это работает нормально, индикатор вращается, пока меняя цвета. Но в iOS индикатор останавливается до завершения задачи «Радуга», а затем начинает вращаться.

Я уже пробовал Device.InvokeOnMainThreadAsyn c () с теми же результатами

1 Ответ

2 голосов
/ 23 марта 2020

Я тестировал в iOS Native Develop Tools ( Xcode ) с помощью Objective- C для изменения цвета каждый раз менее чем за 1 секунду, происходит то же самое явление с формами Xamarin. Тогда я думаю, что ActivityIndicator в iOS не поддерживает изменение цвета каждый раз менее чем за одну секунду.

Таким образом, простой способ заставить его работать - это модифицировать код следующим образом, каждую секунду меняя цвет:

activityIndicator.IsRunning = true;
await Task.Run(() => ActivityIndicatorRainbow(activityIndicator, 1000));

Если вам нужно менее одной секунды, чтобы изменить цвет в iOS, вы можете попробовать пользовательский рендер для создания пользовательского ActivityIndicator с помощью Navtive mtethod CADisplayLink или DispatchSource.Timer .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...