CABasicAnimation на CATextLayer fontSize не работает - PullRequest
0 голосов
/ 30 мая 2019

Я пытаюсь сделать пульсирующую анимацию на CATextLayer, когда пользователь вводит больше символов в UITextView, чем максимально допустимый.

Код работает, но анимация не происходит.

public partial class MyViewController : UIViewController, IUITextViewDelegate
{
   const int MAX_COMMENTS_CHARS = 500;
   CATextLayer charsLeftTextLayer;

   public override void ViewDidLoad()
   {
      base.ViewDidLoad();

      charsLeftTextLayer = new CATextLayer();
      var uiFont = UIFont.SystemFontOfSize(12);
      charsLeftTextLayer.ContentsScale = UIScreen.MainScreen.Scale; //stops text appearing blurry
      charsLeftTextLayer.SetFont(uiFont.Name);
      charsLeftTextLayer.FontSize = 12;
      charsLeftTextLayer.String = $"{MAX_COMMENTS_CHARS} chars left";
      charsLeftTextLayer.ForegroundColor = UIColor.Black.CGColor;
      charsLeftTextLayer.BackgroundColor = UIColor.Clear.CGColor;
      charsLeftTextLayer.Frame = new CGRect(582, 153, 99, 21);

      View.Layer.AddSublayer(charsLeftTextLayer);
   }

   private void PulseCharsLeft()
    {
        var animation = CABasicAnimation.FromKeyPath("fontSize");

        animation.SetFrom(NSNumber.FromNInt(12));
        animation.SetTo(NSNumber.FromNInt(16));
        animation.Duration = 1.0;
        animation.BeginTime = 0.01;
        animation.TimingFunction = CAMediaTimingFunction.FromName(CAMediaTimingFunction.Linear);
        animation.AutoReverses = true;

        charsLeftTextLayer.AddAnimation(animation, null);
    }

    #region UITextView delegates

    [Export("textView:shouldChangeTextInRange:replacementText:")]
    public bool ShouldChangeText(UITextView textView, NSRange range, string text)
    {       
        if (textView.Text.Length + text.Length > MAX_COMMENTS_CHARS)
        {
            PulseCharsLeft();
            return false;
        }

        return true;
    }

    #endregion
}

Я приму ответы на C #, Swift или Objective-C

1 Ответ

2 голосов
/ 31 мая 2019

Удалите animation.BeginTime = 0.01; в методе PulseCharsLeft(), и тогда он будет работать.

Это должно выглядеть так:

private void PulseCharsLeft()
{
    var animation = CABasicAnimation.FromKeyPath("fontSize");

    animation.SetFrom(NSNumber.FromNInt(12));
    animation.SetTo(NSNumber.FromNInt(16));
    animation.Duration = 1.0;
    //animation.BeginTime = 10;
    animation.TimingFunction = CAMediaTimingFunction.FromName(CAMediaTimingFunction.Linear);
    animation.AutoReverses = true;

    charsLeftTextLayer.AddAnimation(animation, "basic");

}

BeginTime указывает относительное время начала от родительской анимации (по умолчанию несколько анимаций в группе запускаются одновременно).

Из документа :

Указывает время начала получателя относительно его родителя. объект, если применимо.

Вы можете посмотреть ответ здесь , чтобы узнать больше о BeginTime.

Кстати, в вопросе, ваш charsLeftTextLayer.Frame = new CGRect(582, 153, 99, 21);, x (582) слишком велик для тестирования?

Я изменил его на небольшое значение и добавил textView для проверки.

    charsLeftTextLayer.Frame = new CGRect(82, 153, 99, 21);

Также я изменил MAX_COMMENTS_CHARS на 10, и его проще тестировать.

...