CustomRenderer для перехода цвета фона кнопки - PullRequest
0 голосов
/ 09 мая 2018

Я создал customrenderer для изменения TitleColor и BackgroundColor, когда пользователь нажимает мою кнопку.

По какой-то причине, когда кнопка сфокусирована, TitleColor становится более или менее прозрачным, и мой фон не анимируется, как мой TitleColor.

Это мой код:

public class BtnRendereriOS : ButtonRenderer
{

    protected override void OnElementChanged(ElementChangedEventArgs<Button> e)
    {
        base.OnElementChanged(e);


        if (Control != null)
        {
            Control.Layer.CornerRadius = 0;

            BackgroundNormalState(Control);            

            Control.TouchUpInside += (object sender, EventArgs c) =>
            {
                BackgroundNormalState(sender);
            };
            Control.TouchUpOutside += (object sender, EventArgs c) =>
            {
                BackgroundNormalState(sender);
            };
            Control.TouchDragOutside += (object sender, EventArgs c) =>
            {
                BackgroundNormalState(sender);
            };
            Control.TouchDragInside += (object sender, EventArgs c) =>
            {
                BackgroundChangedState(sender);
            };

            Control.TouchDown += (object sender, EventArgs c) =>
            {
                BackgroundChangedState(sender);
            };
            void BackgroundNormalState(object sender)
            {
                Action a = () => Control.SetTitleColor(UIColor.FromRGB(255,255,255), UIControlState.Normal);
                UIView.PerformWithoutAnimation(a); 

                (sender as UIButton).BackgroundColor = UIColor.FromRGB(3, 169, 244);

            }
            void BackgroundChangedState(object sender)
            {
                Action a = () => Control.SetTitleColor(UIColor.FromRGB(0,0,0), UIControlState.Highlighted);
                UIView.PerformWithoutAnimation(a);

                (sender as UIButton).BackgroundColor = UIColor.FromRGB(104, 206, 253);
            }
        }
    } 
}

В настоящее время я удалил анимацию из TitleColor.

Мои вопросы:

  • Как добавить тот же самый переход к моему BackgroundColor, аналогичный переходу по умолчанию на моем TitleColor?
  • Как убрать «прозрачность» из TitleColor, когда кнопка находится в фокусе?

Ответы [ 2 ]

0 голосов
/ 10 мая 2018

Как убрать "прозрачность" из TitleColor, когда кнопка фокусируется?

Это функция системной кнопки, если вам это не нравится, попробуйте использовать пользовательский стиль, чтобы избежать этого:

UIButton btn = new UIButton(UIButtonType.Custom);
btn.SetTitle(Control.TitleLabel.Text, UIControlState.Normal);
SetNativeControl(btn);
// Pay attention to that the title color just needs to be set once
btn.SetTitleColor(UIColor.FromRGB(255, 255, 255), UIControlState.Normal);
btn.SetTitleColor(UIColor.FromRGB(0, 0, 0), UIControlState.Highlighted);

Затем вы можете использовать UIView.Animate(), чтобы изменить цвет фона кнопки с помощью «transition»:

void BackgroundNormalState(object sender)
{
    UIView.Animate(0.2, () =>
    {
        (sender as UIButton).BackgroundColor = UIColor.FromRGB(3, 169, 244);
    });

}
void BackgroundChangedState(object sender)
{
    UIView.Animate(0.2, () =>
    {
        (sender as UIButton).BackgroundColor = UIColor.FromRGB(104, 206, 253);
    });
}
0 голосов
/ 10 мая 2018

Вы можете использовать UIView.Animate|Async или UIView.TransitionNotify|Async в зависимости от конечного результата, который вы ищете. Ключ заключается в том, чтобы поместить все изменения в один и тот же блок анимации, чтобы они происходили одновременно с помощью Core Animation (CA).

Вот пример использования UIView.TransitionNotifyAsync с использованием TransitionCrossDissolve между сменами цвета.

// Set intial values
var normalTextColor = UIColor.FromRGB(255, 255, 255);
var normalBackgroundColor = UIColor.FromRGB(3, 169, 244);
var highlightTextColor = UIColor.Black;
var highlightBackgroundColor = UIColor.FromRGB(104, 206, 253);
Control.SetTitleColor(normalTextColor, UIControlState.Normal);
Control.BackgroundColor = normalBackgroundColor;

async Task NormalColorState(UIButton button)
{
    await UIView.TransitionNotifyAsync(button, .25, UIViewAnimationOptions.TransitionCrossDissolve, () =>
    {
        button.BackgroundColor = normalBackgroundColor;
        button.SetTitleColor(normalTextColor, UIControlState.Normal);
    });
}
Control.TouchDown += async (object sender, EventArgs e) =>
{
    var button = sender as UIButton;
    await UIView.TransitionNotifyAsync(button, .25, UIViewAnimationOptions.TransitionCrossDissolve, () =>
    {
        button.BackgroundColor = highlightBackgroundColor;
        button.SetTitleColor(highlightTextColor, UIControlState.Highlighted);
    });
};
Control.TouchUpInside += async (object sender, EventArgs e) =>
{
    await NormalColorState(sender as UIButton);
};
Control.TouchUpOutside += async (object sender, EventArgs e) =>
{
    await NormalColorState(sender as UIButton);
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...