ユーザーが。に入力できる数字の文字数を超えないようにしたいUITextView
。これは、コピーと貼り付けでも機能する必要があります。私はこの解決策を見つけましたが、それはObjective Cであり、制限に達した後にカーソル位置をリセットするという欠点があります。
私が欲しいのは、から継承しUITextView
、プロパティを公開MaxCharacters
し、内部のすべての作業を行うクラスです。
ユーザーが。に入力できる数字の文字数を超えないようにしたいUITextView
。これは、コピーと貼り付けでも機能する必要があります。私はこの解決策を見つけましたが、それはObjective Cであり、制限に達した後にカーソル位置をリセットするという欠点があります。
私が欲しいのは、から継承しUITextView
、プロパティを公開MaxCharacters
し、内部のすべての作業を行うクラスです。
このコードはマニケーザーの回答に基づいていますが、制限に達した後はキャレットの位置をリセットしません。
[Register ("LimitedTextView")]
public class LimitedTextView : UITextView
{
public int MaxCharacters { get; set; }
void Initialize ()
{
MaxCharacters = 140;
ShouldChangeText = ShouldLimit;
}
static bool ShouldLimit (UITextView view, NSRange range, string text)
{
var textView = (LimitedTextView)view;
var limit = textView.MaxCharacters;
int newLength = (view.Text.Length - range.Length) + text.Length;
if (newLength <= limit)
return true;
// This will clip pasted text to include as many characters as possible
// See https://stackoverflow.com/a/5897912/458193
var emptySpace = Math.Max (0, limit - (view.Text.Length - range.Length));
var beforeCaret = view.Text.Substring (0, range.Location) + text.Substring (0, emptySpace);
var afterCaret = view.Text.Substring (range.Location + range.Length);
view.Text = beforeCaret + afterCaret;
view.SelectedRange = new NSRange (beforeCaret.Length, 0);
return false;
}
public LimitedTextView (IntPtr handle) : base (handle) { Initialize (); }
public LimitedTextView (RectangleF frame) : base (frame) { Initialize (); }
}