Строка состояния Xamarin. iOS сохраняет цвет в углу при изменении и ориентацию на iPad - PullRequest
0 голосов
/ 03 апреля 2020

Мое приложение поддерживает изменение темного режима iOS. Тем не менее, он немного усложнил цвет строки состояния, но в конце концов мне удалось изменить его.

Моя проблема в том, что когда вы работаете на iPad в портретном режиме и переключаете тему, а затем при наклоне iPad в ландшафтный режим расширение строки состояния сохраняет старый цвет (см. скриншот ниже)

Я не знаю, является ли это просто неприятной ошибкой или я делаю что-то не так. В случае, если это ошибка, я бы хотел иметь обходной путь для этого.

Вот как я меняю цвет строки состояния в CustomRenderer (в этом примере на Light Mode)

if (UIDevice.CurrentDevice.CheckSystemVersion(13, 0))
{
    UIView statusBar = new UIView(UIApplication.SharedApplication.KeyWindow.WindowScene.StatusBarManager.StatusBarFrame);
    statusBar.BackgroundColor = Color.FromHex("#FFFFFF").ToUIColor();
    UIApplication.SharedApplication.KeyWindow.AddSubview(statusBar);
}
this.NavigationController.NavigationBar.BarTintColor = Color.FromHex("#FFFFFF").ToUIColor();

Это вызывается в функции TraitCollectionDidChange.

enter image description here

1 Ответ

0 голосов
/ 06 апреля 2020

Это потому, что вы использовали Frame для добавления пользовательской строки состояния. Когда он сталкивается с пейзажем, его ширина остается значением портрета. Попробуйте изменить его на autolayout, например:

if (UIDevice.CurrentDevice.CheckSystemVersion(13, 0))
{
    UIView statusBar = new UIView();
    statusBar.TranslatesAutoresizingMaskIntoConstraints = false;
    statusBar.BackgroundColor = UIColor.White;
    UIApplication.SharedApplication.KeyWindow.AddSubview(statusBar);

    statusBar.LeadingAnchor.ConstraintEqualTo(UIApplication.SharedApplication.KeyWindow.LeadingAnchor).Active = true;
    statusBar.TopAnchor.ConstraintEqualTo(UIApplication.SharedApplication.KeyWindow.TopAnchor).Active = true;
    statusBar.TrailingAnchor.ConstraintEqualTo(UIApplication.SharedApplication.KeyWindow.TrailingAnchor).Active = true;
    statusBar.HeightAnchor.ConstraintEqualTo(UIApplication.SharedApplication.KeyWindow.WindowScene.StatusBarManager.StatusBarFrame.Height).Active = true;
}

Обновить

Если вы хотите изменить цвет обратно на исходное значение, попробуйте код здесь:

public override void TraitCollectionDidChange(UITraitCollection previousTraitCollection)
{
    base.TraitCollectionDidChange(previousTraitCollection);

    if (UIDevice.CurrentDevice.CheckSystemVersion(13, 0))
    {
        var window = UIApplication.SharedApplication.KeyWindow;
        UIView statusBar;
        if (window.ViewWithTag(4) != null)
        {
            statusBar = window.ViewWithTag(4);
        }
        else
        {
            statusBar = new UIView();
            statusBar.TranslatesAutoresizingMaskIntoConstraints = false;
            statusBar.Tag = 4;
            UIApplication.SharedApplication.KeyWindow.AddSubview(statusBar);
            statusBar.LeadingAnchor.ConstraintEqualTo(UIApplication.SharedApplication.KeyWindow.LeadingAnchor).Active = true;
            statusBar.TopAnchor.ConstraintEqualTo(UIApplication.SharedApplication.KeyWindow.TopAnchor).Active = true;
            statusBar.TrailingAnchor.ConstraintEqualTo(UIApplication.SharedApplication.KeyWindow.TrailingAnchor).Active = true;
            statusBar.HeightAnchor.ConstraintEqualTo(UIApplication.SharedApplication.KeyWindow.WindowScene.StatusBarManager.StatusBarFrame.Height).Active = true;
        }                    

        if (previousTraitCollection.UserInterfaceStyle == UIUserInterfaceStyle.Light)
        {
            statusBar.BackgroundColor = UIColor.White;
        }
        else
        {
            statusBar.BackgroundColor = UIColor.Clear;
        }
    }
}

Если это не то, что вы хотите, не могли бы вы добавить больше описаний вашей проблемы?

Кстати, если вы хотите добавить какой-то переход, попробуйте это:

UIView.Animate(0.3, () =>
{
    statusBar.BackgroundColor = UIColor.White;
}); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...