幾個月前,有一個朋友問過我一個關(guān)于支付寶密碼輸入效果的問題孵奶,由于那段時間比較忙疲酌,沒來得及去想這個問題,最近比較閑,比較閑朗恳,因為要過年了湿颅,而我還在上班中......上班,既然是上班粥诫,那就不能浪費自己的時間和青春哇油航。頭腦一發(fā)熱,就想來嘗試做做這個效果怀浆,當(dāng)然肯定還是有些不足地方谊囚,往各位多多指教,話不多說执赡,先來談?wù)勊悸钒伞?/p>
思路:
在支付寶輸入密碼的時候镰踏,如果你不仔細看的話,你就會認為沙合,握草奠伪,不是很簡單的一個UITextField
然后將屬性secureTextEntry
設(shè)置為YES
就可以么,然并....也許這才是支付寶做的好的地方吧首懈,居然在輸入密碼的時候绊率,什么什么也看不到,哪怕是一個數(shù)字究履,也不會有一閃然后變成黑點的效果滤否。那么,問題來了最仑,我們該怎么實現(xiàn)呢藐俺,在靜靜思考十幾分鐘后,終于有一個大概方法盯仪,那就是在輸入密碼的UITextField
上面加view
紊搪,并且設(shè)置為黑色蜜葱,造成一種假象全景,而UITextField
還是和普通的輸入一樣,只是輸入的內(nèi)容和光標(biāo)不能被用戶所看到牵囤。
上圖
上代碼
問題一 :如何解決用戶看不到輸入內(nèi)容和光標(biāo)
- (GLTextField *)passwordField
{
if (nil == _passwordField)
{
_passwordField = [[GLTextField alloc] initWithFrame:CGRectMake((kScreenWidth - 44 * 6)/2.0, 100, 44 * 6, 44)];
_passwordField.delegate = (id)self;
_passwordField.backgroundColor = [UIColor whiteColor];
//將密碼的文字顏色和光標(biāo)顏色設(shè)置為透明色
//之前是設(shè)置的白色 這里有個問題 如果密碼太長的話 文字和光標(biāo)的位置如果到了第一個黑色的密碼點的時候 就看出來了
_passwordField.textColor = [UIColor clearColor];
_passwordField.tintColor = [UIColor clearColor];
[_passwordField setBorderColor:UIColorFromRGB(0xdddddd) width:1];
_passwordField.keyboardType = UIKeyboardTypeNumberPad;
_passwordField.secureTextEntry = YES;
[_passwordField addTarget:self action:@selector(passwordFieldDidChange:) forControlEvents:UIControlEventEditingChanged];
}
return _passwordField;
}
問題二 :怎么做到輸入密碼的時候黑點顯示或消失一致
- (void)passwordFieldDidChange:(UITextField *)field
{
[self setDotsViewHidden];
for (int i = 0; i < _passwordField.text.length; i ++)
{
if (_passwordDotsArray.count > i )
{
UIView *dotView = _passwordDotsArray[i];
[dotView setHidden:NO];
}
}
if (_passwordField.text.length == 6)
{
NSString *password = _passwordField.text;
if ([password isEqualToString:_password])
{
NSLog(@" 打印信息 密碼正確");
}
else
{
UIAlertController *alertController = [UIAlertController alertControllerWithTitle:nil message:@"密碼錯誤爸黄,請重新輸入" preferredStyle:UIAlertControllerStyleAlert];
// Create the actions.
UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"確定" style:UIAlertActionStyleCancel handler:^(UIAlertAction *action) {
[self cleanPassword];
}];
// Add the actions.
[alertController addAction:cancelAction];
[self presentViewController:alertController animated:YES completion:nil];
}
}
}
//將所有的假密碼點設(shè)置為隱藏狀態(tài)
- (void)setDotsViewHidden
{
for (UIView *view in _passwordDotsArray)
{
[view setHidden:YES];
}
}
問題三:由于UITextField 是可以復(fù)制其內(nèi)容的,怎么屏蔽呢揭鳞?
這里我采取的方法是繼承 UITextField
然后重寫方法
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender
//禁止粘貼復(fù)制全選等
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender
{
UIMenuController *menuController = [UIMenuController sharedMenuController];
if (menuController) {
[UIMenuController sharedMenuController].menuVisible = NO;
}
return NO;
}
作為一個程序猿炕贵,我覺得思路很重要,有了好的思路野崇,會少走很短彎路称开,如果有更好的方法,還望各位不吝賜教。
下面附上Demo
iOS 仿支付寶密碼支付Demo