AvaloniaView.Text.cs 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. #nullable enable
  2. using Avalonia.Input.TextInput;
  3. using UIKit;
  4. namespace Avalonia.iOS;
  5. public partial class AvaloniaView
  6. {
  7. private const string ImeLog = "IOSIME";
  8. private Rect _cursorRect;
  9. private TextInputOptions? _options;
  10. private static UIResponder? CurrentAvaloniaResponder { get; set; }
  11. public override bool BecomeFirstResponder()
  12. {
  13. var res = base.BecomeFirstResponder();
  14. if (res)
  15. CurrentAvaloniaResponder = this;
  16. return res;
  17. }
  18. public override bool ResignFirstResponder()
  19. {
  20. var res = base.ResignFirstResponder();
  21. if (res && ReferenceEquals(CurrentAvaloniaResponder, this))
  22. CurrentAvaloniaResponder = null;
  23. return res;
  24. }
  25. private bool IsDrivingText => CurrentAvaloniaResponder is TextInputResponder t && ReferenceEquals(t.NextResponder, this);
  26. void ITextInputMethodImpl.SetClient(TextInputMethodClient? client)
  27. {
  28. _client = client;
  29. if (_client == null && IsDrivingText)
  30. BecomeFirstResponder();
  31. if (_client is { })
  32. {
  33. new TextInputResponder(this, _client).BecomeFirstResponder();
  34. }
  35. }
  36. void ITextInputMethodImpl.SetCursorRect(Rect rect) => _cursorRect = rect;
  37. void ITextInputMethodImpl.SetOptions(TextInputOptions options) => _options = options;
  38. void ITextInputMethodImpl.Reset()
  39. {
  40. if (IsDrivingText)
  41. BecomeFirstResponder();
  42. }
  43. }