国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > iOS > 正文

iOS實(shí)現(xiàn)類似微信和支付寶的密碼輸入框(UIKeyInput協(xié)議)

2020-07-26 03:17:13
字體:
供稿:網(wǎng)友

目前在項(xiàng)目中需要實(shí)現(xiàn)發(fā)紅包的功能,自己就寫了一個(gè)密碼輸入框的控件,主要用到了UIKeyInput協(xié)議和CoreGraphics框架,效果類似微信支付,感覺還行就把我的思路和制作過程寫下來給大家分享一下。

讓你的自定義View具備輸入的功能(UIKeyInput協(xié)議)

通過UIKeyInput協(xié)議可以為響應(yīng)者提供簡(jiǎn)單的鍵盤輸入的功能,讓需要鍵盤的responder成為第一響應(yīng)者就行了。UIKeyInput協(xié)議必須實(shí)現(xiàn)的有三個(gè)方法,分別是以下方法:

#pragma mark - UIKeyInput/** * 用于顯示的文本對(duì)象是否有任何文本 */- (BOOL)hasText {  return self.textStore.length > 0;}/** * 插入文本 */- (void)insertText:(NSString *)text {  if (self.textStore.length < self.passWordNum) {    //判斷是否是數(shù)字    NSCharacterSet *cs = [[NSCharacterSet characterSetWithCharactersInString:MONEYNUMBERS] invertedSet];    NSString*filtered = [[text componentsSeparatedByCharactersInSet:cs] componentsJoinedByString:@""];    BOOL basicTest = [text isEqualToString:filtered];    if(basicTest) {     if ([self.delegate respondsToSelector:@selector(passWordDidChange:)]) {        [self.delegate passWordDidChange:self];      }      if (self.textStore.length == self.passWordNum) {        if ([self.delegate respondsToSelector:@selector(passWordCompleteInput:)]) {          [self.delegate passWordCompleteInput:self];        }      }      [self.textStore appendString:text];      [self setNeedsDisplay];    }  }}/** * 刪除文本 */- (void)deleteBackward {  if (self.textStore.length > 0) {    [self.textStore deleteCharactersInRange:NSMakeRange(self.textStore.length - 1, 1)];   if ([self.delegate respondsToSelector:@selector(passWordDidChange:)]) {      [self.delegate passWordDidChange:self];    }  }  [self setNeedsDisplay];}/** * 是否能成為第一響應(yīng)者 */- (BOOL)canBecomeFirstResponder {  return YES;}/** * 點(diǎn)擊成為第一相應(yīng)者 */- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {  if (![self isFirstResponder]) {    [self becomeFirstResponder];  }}

通過CoreGraphics繪制出密碼輸入框

實(shí)現(xiàn)的思路是通過CoreGraphics框架繪制出密碼輸入框的外框和里面的小黑點(diǎn),然后通過從鍵盤上獲取到的字符串判斷輸入的位數(shù),具體實(shí)現(xiàn)如下:

/** * 設(shè)置正方形的邊長 */- (void)setSquareWidth:(CGFloat)squareWidth {  _squareWidth = squareWidth;  [self setNeedsDisplay];}/** * 設(shè)置鍵盤的類型 */- (UIKeyboardType)keyboardType {  return UIKeyboardTypeNumberPad;}/** * 設(shè)置密碼的位數(shù) */- (void)setPassWordNum:(NSUInteger)passWordNum {  _passWordNum = passWordNum;  [self setNeedsDisplay];}/** * 繪制 */- (void)drawRect:(CGRect)rect {  CGFloat height = rect.size.height;  CGFloat width = rect.size.width;  CGFloat x = (width - self.squareWidth*self.passWordNum)/2.0;  CGFloat y = (height - self.squareWidth)/2.0;  CGContextRef context = UIGraphicsGetCurrentContext();  //畫外框  CGContextAddRect(context, CGRectMake( x, y, self.squareWidth*self.passWordNum, self.squareWidth));  CGContextSetLineWidth(context, 1);  CGContextSetStrokeColorWithColor(context, self.rectColor.CGColor);  CGContextSetFillColorWithColor(context, [UIColor whiteColor].CGColor);  //畫豎條  for (int i = 1; i <= self.passWordNum; i++) {    CGContextMoveToPoint(context, x+i*self.squareWidth, y);    CGContextAddLineToPoint(context, x+i*self.squareWidth, y+self.squareWidth);     CGContextClosePath(context);  }  CGContextDrawPath(context, kCGPathFillStroke);  CGContextSetFillColorWithColor(context, self.pointColor.CGColor);  //畫黑點(diǎn)  for (int i = 1; i <= self.textStore.length; i++) {    CGContextAddArc(context, x+i*self.squareWidth - self.squareWidth/2.0, y+self.squareWidth/2, self.pointRadius, 0, M_PI*2, YES);    CGContextDrawPath(context, kCGPathFill);  }}

源碼下載:https://github.com/631106979/WCLPassWordView

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持武林網(wǎng)。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 昌黎县| 六枝特区| 资中县| 娱乐| 句容市| 鹿邑县| 武山县| 梅河口市| 雷波县| 鄂伦春自治旗| 玉溪市| 章丘市| 华坪县| 辽宁省| 青岛市| 威海市| 永胜县| 越西县| 新蔡县| 莱西市| 孙吴县| 会昌县| 德州市| 抚松县| 延寿县| 永胜县| 临海市| 德惠市| 南投市| 通城县| 乌海市| 德格县| 赣榆县| 化州市| 甘谷县| 昌江| 阜康市| 苗栗市| 大宁县| 宁远县| 喜德县|