void SetupCC() { ccText.ShouldChangeText = (UITextView textView, NSRange NSRange, string replace) => { if (replace != "" && !Char.IsDigit(replace.ToCharArray() [0])) { return(false); } CSRange range = new CSRange((int)NSRange.Location, (int)NSRange.Length); var formattedText = ""; flashForError = false; updateText = false; scrollForward = false; deleting = false; ret = false; deletedSpace = false; cardMonth = 0; if (replace.Length == 0) { updateText = true; deleting = true; if (textView.Text.Length != 0) // handle case of delete when there are no characters left to delete { char c = textView.Text.Substring(range.Location, 1).ToCharArray() [0]; if (range.Location != 0 && range.Length == 1 && (c == ' ' || c == '/')) { range.Location--; range.Length++; deletedSpace = true; } } else { return(false); } } string newTextOrig = ReplaceInPlace(range.Location, range.Length, textView.Text, replace); int newTextLen = newTextOrig.Length; // causes the cc entry field to scroll back if the user deletes back beyond the end of the cc number if (range.Location <= numberLength) { hasFullNumber = false; } if (textScroller.ContentOffset.X < 10f) { ccPlaceHolderWidthConstraint.Constant = 198f; } if (!hasFullNumber) { // scrolls backward int textViewLen = ccText.Text.Length; int formattedLen = ccPlaceHolder.Text.Length; if (textScroller.ContentOffset.X != 0) { textScroller.SetContentOffset(new PointF(0, 0), true); } UpdateCCimageWithTransitionTime(0, false, true); StatusHelpLabel.Text = "Enter Card Details"; string newText = newTextOrig.Replace(" ", String.Empty); int len = newText.Length; if (len < JudoDotNetXamarin.Card.CC_LEN_FOR_TYPE) { updateText = true; formattedText = newTextOrig; Type = CardType.UNKNOWN; } else { Type = cardHelper.GetCCType(newText); switch (Type) { case CardType.UNKNOWN: flashForError = true; break; case CardType.MAESTRO: if (!JudoSDKManager.Instance.MaestroAccepted) { flashForError = true; return(EndDelegate(ccPlaceHolder, ccText, formattedText)); } break; case CardType.AMEX: if (!JudoSDKManager.Instance.AmExAccepted) { flashForError = true; return(EndDelegate(ccPlaceHolder, ccText, formattedText)); } break; } if (len == JudoDotNetXamarin.Card.CC_LEN_FOR_TYPE) { ccPlaceHolder.Text = cardHelper.PromptStringForType(Type, true); cvTwoPlaceHolder.Text = cardHelper.CVTwoPromptForType(Type, true); cvTwoPlaceHolder.SetShowTextOffSet(Math.Min(0, 0)); } formattedText = cardHelper.FormatForViewing(newText); int lenForCard = cardHelper.LengthOfStringForType(Type); if (len < lenForCard) { updateText = true; } else if (len == lenForCard) { if (cardHelper.isValidNumber(newText)) { if (newText.IsLuhnValid()) { numberLength = cardHelper.LengthOfFormattedStringForType(Type); creditCardNum = newText; updateText = true; scrollForward = true; hasFullNumber = true; } else { FlashRecheckNumberMessage(); } } else { FlashRecheckNumberMessage(); } } } UpdateCCimageWithTransitionTime(0.25f); } return(EndDelegate(ccPlaceHolder, ccText, formattedText)); }; }