? 微信輸入支付密碼的彈窗效果相信大家都見過吧秕狰,先描述下它的特點(這里先不做微信支付的時候選擇支付方式這一塊):
? 1.模態(tài)顯示,背景灰色许赃,點擊背景彈窗消失扒袖。
? 2.提供輸入的密碼框是看不到光標的,在文本框上長按的時候是可以看到放大鏡歼培,但是禁止賦值粘貼等操作震蒋。
? 3.輸入密碼的文本框是有分隔線的,而且會用黑色的圓點來替代輸入的字符躲庄。
? 4.密碼為6位數字查剖,當用戶輸入夠6位數字之后彈窗自動消失,然后判斷密碼正確性噪窘,就相當于點擊了確認按鈕笋庄。
下面講具體實現(xiàn):
1.首先,這里用到了一個第三方庫的WTReTextField,這個類是UITextField的一個子類直砂,可以通過設置它的pattern來限制文本框填充內容的格式菌仁,比如我們可以設置它可以輸入像xxx xxxx xxxx這樣格式的手機號碼。在這里静暂,我們限制它填充的內容為6為數字济丘,不能輸入其他非法字符。
2.我們定義一個YLPasswordTextFiled繼承自WTReTextField洽蛀。在這個類里面闪盔,重寫了-(void)setFrame:(CGRect)frame方法,在這里面用UILabel控件來作為占位符(即在輸入數字的時候顯示的黑色圓點)剛開始這些占位符是隱藏的辱士,當輸入內容后顯示,用戶輸入多少個字符就對應顯示多少個黑點:
-(void)setFrame:(CGRect)frame
{
[super setFrame:frame];
CGFloatperWidth = (frame.size.width-kPasswordLength+1)*1.0/kPasswordLength;
for(NSIntegeri=0;i<kPasswordLength;i++){
if(i<kPasswordLength-1){
UILabel*vLine = (UILabel*)[self viewWithTag:kLineTag+ i];
if(!vLine){
vLine = [[UILabel alloc]init];
vLine.tag=kLineTag+ i;
[self addSubview:vLine];
}
vLine.frame=CGRectMake(perWidth + (perWidth +1)*i,0,1, frame.size.height);
vLine.backgroundColor= [UIColor grayColor];
}
UILabel*dotLabel = (UILabel*)[self viewWithTag:kDotTag+ i];
if(!dotLabel){
dotLabel = [[UILabel alloc]init];
dotLabel.tag=kDotTag+ i;
[self addSubview:dotLabel];
}
dotLabel.frame=CGRectMake((perWidth +1)*i + (perWidth -10)*0.5, (frame.size.height-10)*0.5,10,10);
dotLabel.layer.masksToBounds=YES;
dotLabel.layer.cornerRadius=5;
dotLabel.backgroundColor= [UIColorblackColor];
dotLabel.hidden=YES;
}
}
為了防止用戶賦值粘帖听绳,重寫了-(BOOL)canPerformAction:(SEL)action withSender:(id)sender:
//禁止復制粘帖
-(BOOL)canPerformAction:(SEL)action withSender:(id)sender{
UIMenuController *menuController = [UIMenuController sharedMenuController];
if(menuController){
menuController.menuVisible=NO;
}
return NO;
}
這樣就基本完成了供輸入密碼的文本框的構造颂碘。
3.定義一個LMPopInputPasswordView繼承自UIView,這個是彈出視圖,并定義一個LMPopInputPassViewDelegate委托和委托方法-(void)buttonClickedAtIndex:(NSUInteger)index withText:(NSString*)text;來傳遞用戶輸入的內容椅挣。
4.通過設置_textFiled.tintColor= [UIColorclearColor];//看不到光標
_textFiled.textColor= [UIColorclearColor];//看不到輸入內容
來讓用戶看不到文本框的輸入內容以及光標头岔。
5.通過[_textFiledaddTarget:selfaction:@selector(textFiledEdingChanged)forControlEvents:UIControlEventEditingChanged];為文本框綁定事件,并通過以下方法來控制幾個黑點的顯示和隱藏鼠证,并且在輸入密碼長度等于6的時候調用點擊確定按鈕事件對應的方法:
-(void)textFiledEdingChanged
{
NSIntegerlength =_textFiled.text.length;
NSLog(@"lenght=%li",(long)length);
if(length==kPasswordLength){
[self buttonClickedAction:_ensureButton];
}
for(NSIntegeri=0;i
UILabel*dotLabel = (UILabel*)[_textFiled viewWithTag:kDotTag+ i];
if(dotLabel){
dotLabel.hidden= length <= i;
}
}
}
6.最后再為LMPopInputPasswordView添加動畫彈出和動畫消失的轉場動畫:
#pragma mark ---animation methods
-(void)fadeIn
{
self.transform=CGAffineTransformMakeScale(1.3,1.3);
self.alpha=0;
[UIView animateWithDuration:.35animations:^{
self.alpha=1;
self.transform=CGAffineTransformMakeScale(1,1);
}completion:^(BOOLfinished) {
[_textFiled becomeFirstResponder];
}];
}
- (void)fadeOut
{
[self endEditing:YES];
[UIView animateWithDuration:.35animations:^{
self.transform=CGAffineTransformMakeScale(1.3,1.3);
self.alpha=0.0;
}completion:^(BOOLfinished) {
if(finished) {
[_overlayView removeFromSuperview];
[self removeFromSuperview];
}
}];
}
- (void)pop
{
UIWindow*keywindow = [[UIApplication sharedApplication]keyWindow];
[keywindow addSubview:_overlayView];
[keywindow addSubview:self];
self.center=CGPointMake(keywindow.bounds.size.width/2.0f,
keywindow.bounds.size.height/2.0f-100);
[self fadeIn];
}
- (void)dismiss
{
[self fadeOut];
}
7.最后在點擊按鈕的時候調用委托方法峡竣,傳遞用戶輸入的密碼,然后彈窗消失:
-(void)buttonClickedAction:(UIButton*)sender
{
//傳值給委托對象
if([_delegaterespondsToSelector:@selector(buttonClickedAtIndex:withText:)]){
[_delegate buttonClickedAtIndex:sender.tag withText:_textFiled.text];
}
[selfdismiss];
}
最后附上demo地址:DemoInPutPasswordView 仿微信支付密碼輸入框
效果圖如下: