├── LICENSE ├── PPTextField.podspec ├── PPTextField ├── NSString+PPTextField.h ├── NSString+PPTextField.m ├── PPTextField.h ├── PPTextField.m ├── PPTextFieldAssistant.h └── PPTextFieldAssistant.m ├── PPTextfieldDemo.xcodeproj ├── project.pbxproj ├── project.xcworkspace │ ├── contents.xcworkspacedata │ ├── xcshareddata │ │ └── IDEWorkspaceChecks.plist │ └── xcuserdata │ │ ├── PPMT.xcuserdatad │ │ └── UserInterfaceState.xcuserstate │ │ ├── admin.xcuserdatad │ │ └── UserInterfaceState.xcuserstate │ │ └── jikesoft.xcuserdatad │ │ └── UserInterfaceState.xcuserstate ├── xcshareddata │ └── xcschemes │ │ └── PPTextfieldDemo.xcscheme └── xcuserdata │ ├── PPMT.xcuserdatad │ └── xcschemes │ │ ├── PPTextfieldDemo.xcscheme │ │ └── xcschememanagement.plist │ ├── admin.xcuserdatad │ ├── xcdebugger │ │ └── Breakpoints_v2.xcbkptlist │ └── xcschemes │ │ └── xcschememanagement.plist │ └── jikesoft.xcuserdatad │ └── xcschemes │ ├── PPTextfieldDemo.xcscheme │ └── xcschememanagement.plist ├── PPTextfieldDemo.xcworkspace ├── contents.xcworkspacedata ├── xcshareddata │ └── IDEWorkspaceChecks.plist └── xcuserdata │ ├── admin.xcuserdatad │ ├── UserInterfaceState.xcuserstate │ └── xcdebugger │ │ └── Breakpoints_v2.xcbkptlist │ └── peijianbo.xcuserdatad │ └── UserInterfaceState.xcuserstate ├── PPTextfieldDemo ├── AppDelegate.h ├── AppDelegate.m ├── Assets.xcassets │ └── AppIcon.appiconset │ │ └── Contents.json ├── Base.lproj │ ├── LaunchScreen.storyboard │ └── Main.storyboard ├── Example │ ├── PPTextFieldExampleViewController.h │ └── PPTextFieldExampleViewController.m ├── Info.plist ├── ViewController.h ├── ViewController.m └── main.m ├── Podfile ├── Podfile.lock ├── Pods ├── Local Podspecs │ └── PPTextField.podspec.json ├── Manifest.lock ├── Pods.xcodeproj │ ├── project.pbxproj │ └── xcuserdata │ │ ├── admin.xcuserdatad │ │ └── xcschemes │ │ │ ├── PPTextField.xcscheme │ │ │ ├── Pods-PPTextfieldDemo.xcscheme │ │ │ └── xcschememanagement.plist │ │ └── peijianbo.xcuserdatad │ │ └── xcschemes │ │ ├── PPTextField.xcscheme │ │ ├── Pods-PPTextfieldDemo.xcscheme │ │ └── xcschememanagement.plist └── Target Support Files │ ├── PPTextField │ ├── PPTextField-Info.plist │ ├── PPTextField-dummy.m │ ├── PPTextField-prefix.pch │ ├── PPTextField-umbrella.h │ ├── PPTextField.debug.xcconfig │ ├── PPTextField.modulemap │ └── PPTextField.release.xcconfig │ └── Pods-PPTextfieldDemo │ ├── Pods-PPTextfieldDemo-Info.plist │ ├── Pods-PPTextfieldDemo-acknowledgements.markdown │ ├── Pods-PPTextfieldDemo-acknowledgements.plist │ ├── Pods-PPTextfieldDemo-dummy.m │ ├── Pods-PPTextfieldDemo-frameworks.sh │ ├── Pods-PPTextfieldDemo-umbrella.h │ ├── Pods-PPTextfieldDemo.debug.xcconfig │ ├── Pods-PPTextfieldDemo.modulemap │ └── Pods-PPTextfieldDemo.release.xcconfig └── README.md /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2016 PP_Abner 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /PPTextField.podspec: -------------------------------------------------------------------------------- 1 | # 2 | # Be sure to run `pod spec lint PPTextField.podspec' to ensure this is a 3 | # valid spec and to remove all comments including this before submitting the spec. 4 | # 5 | # To learn more about Podspec attributes see https://guides.cocoapods.org/syntax/podspec.html 6 | # To see working Podspecs in the CocoaPods repo see https://github.com/CocoaPods/Specs/ 7 | # 8 | 9 | Pod::Spec.new do |spec| 10 | 11 | # ――― Spec Metadata ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――― # 12 | # 13 | # These will help people to find your library, and whilst it 14 | # can feel like a chore to fill in it's definitely to your advantage. The 15 | # summary should be tweet-length, and the description more in depth. 16 | # 17 | 18 | spec.name = "PPTextField" 19 | spec.version = "0.0.3" 20 | spec.summary = "UITextField各种限制,从此一个属性就能解决!比如:手机号(11位)、密码(只能数字和字母)、最大字符串(是否区分中英文)等等这样的限制,以及实时监测输入文字、结束编辑时回调等。" 21 | 22 | # This description is used to generate tags and improve search results. 23 | # * Think: What does it do? Why did you write it? What is the focus? 24 | # * Try to keep it short, snappy and to the point. 25 | # * Write the description between the DESC delimiters below. 26 | # * Finally, don't worry about the indent, CocoaPods strips it! 27 | spec.description = <<-DESC 28 | 最近总算抽空整理一下,支持pod。UITextField各种限制,从此一个属性就能解决!比如:手机号(11位)、密码(只能数字和字母)、最大字符串(是否区分中英文)等等这样的限制,以及实时监测输入文字、结束编辑时回调等。 29 | DESC 30 | 31 | spec.homepage = "https://github.com/PPAbner/PPTextField" 32 | # spec.screenshots = "www.example.com/screenshots_1.gif", "www.example.com/screenshots_2.gif" 33 | 34 | 35 | # ――― Spec License ――――――――――――――――――――――――――――――――――――――――――――――――――――――――――― # 36 | # 37 | # Licensing your code is important. See https://choosealicense.com for more info. 38 | # CocoaPods will detect a license file if there is a named LICENSE* 39 | # Popular ones are 'MIT', 'BSD' and 'Apache License, Version 2.0'. 40 | # 41 | 42 | spec.license = { :type => 'MIT', :text => <<-LICENSE 43 | Copyright PPAbner 2016 44 | LICENSE 45 | } 46 | 47 | # spec.license = { :type => "MIT", :file => "FILE_LICENSE" } 48 | 49 | 50 | # ――― Author Metadata ――――――――――――――――――――――――――――――――――――――――――――――――――――――――― # 51 | # 52 | # Specify the authors of the library, with email addresses. Email addresses 53 | # of the authors are extracted from the SCM log. E.g. $ git log. CocoaPods also 54 | # accepts just a name if you'd rather not provide an email address. 55 | # 56 | # Specify a social_media_url where others can refer to, for example a twitter 57 | # profile URL. 58 | # 59 | 60 | spec.author = { "PPAbner" => "chinesemanbobo@163.com" } 61 | # Or just: spec.author = "PPAbner" 62 | # spec.authors = { "PPAbner" => "chinesemanbobo@163.com" } 63 | # spec.social_media_url = "https://twitter.com/PPAbner" 64 | 65 | # ――― Platform Specifics ――――――――――――――――――――――――――――――――――――――――――――――――――――――― # 66 | # 67 | # If this Pod runs only on iOS or OS X, then specify the platform and 68 | # the deployment target. You can optionally include the target after the platform. 69 | # 70 | 71 | spec.platform = :ios 72 | # spec.platform = :ios, "5.0" 73 | 74 | # When using multiple platforms 75 | spec.ios.deployment_target = "9.0" 76 | # spec.osx.deployment_target = "10.7" 77 | # spec.watchos.deployment_target = "2.0" 78 | # spec.tvos.deployment_target = "9.0" 79 | 80 | 81 | # ――― Source Location ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――― # 82 | # 83 | # Specify the location from where the source should be retrieved. 84 | # Supports git, hg, bzr, svn and HTTP. 85 | # 86 | 87 | spec.source = { :git => "https://github.com/PPAbner/PPTextField.git", :tag => "#{spec.version}" } 88 | 89 | 90 | # ――― Source Code ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――― # 91 | # 92 | # CocoaPods is smart about how it includes source code. For source files 93 | # giving a folder will include any swift, h, m, mm, c & cpp files. 94 | # For header files it will include any header in the folder. 95 | # Not including the public_header_files will make all headers public. 96 | # 97 | 98 | spec.source_files = "PPTextField/*" 99 | # spec.exclude_files = "Classes/Exclude" 100 | 101 | spec.public_header_files = "PPTextField/PPTextField.h" 102 | 103 | 104 | # ――― Resources ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――― # 105 | # 106 | # A list of resources included with the Pod. These are copied into the 107 | # target bundle with a build phase script. Anything else will be cleaned. 108 | # You can preserve files from being cleaned, please don't preserve 109 | # non-essential files like tests, examples and documentation. 110 | # 111 | 112 | # spec.resource = "icon.png" 113 | # spec.resources = "Resources/*.png" 114 | 115 | # spec.preserve_paths = "FilesToSave", "MoreFilesToSave" 116 | 117 | 118 | # ――― Project Linking ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――― # 119 | # 120 | # Link your library with frameworks, or libraries. Libraries do not include 121 | # the lib prefix of their name. 122 | # 123 | 124 | # spec.framework = "SomeFramework" 125 | # spec.frameworks = "SomeFramework", "AnotherFramework" 126 | 127 | # spec.library = "iconv" 128 | # spec.libraries = "iconv", "xml2" 129 | 130 | 131 | # ――― Project Settings ――――――――――――――――――――――――――――――――――――――――――――――――――――――――― # 132 | # 133 | # If your library depends on compiler flags you can set them in the xcconfig hash 134 | # where they will only apply to your library. If you depend on other Podspecs 135 | # you can include multiple dependencies to ensure it works. 136 | 137 | spec.requires_arc = true 138 | 139 | # spec.xcconfig = { "HEADER_SEARCH_PATHS" => "$(SDKROOT)/usr/include/libxml2" } 140 | # spec.dependency "JSONKit", "~> 1.4" 141 | 142 | end 143 | -------------------------------------------------------------------------------- /PPTextField/NSString+PPTextField.h: -------------------------------------------------------------------------------- 1 | // 2 | // NSString+PPTextField.h 3 | // PPDemos 4 | // 5 | // Created by ╰莪呮想好好宠Nǐつ on 2017/3/19. 6 | // Copyright © 2017年 PPAbner. All rights reserved. 7 | // 8 | 9 | 10 | 11 | #import 12 | 13 | typedef NS_ENUM(NSInteger,PPTextFieldStringType) { 14 | PPTextFieldStringTypeNumber, ///数字 15 | PPTextFieldStringTypeLetter, ///字母 16 | PPTextFieldStringTypeChinese ///汉字 17 | }; 18 | 19 | @interface NSString (PPTextField) 20 | 21 | ///某个字符串是不是数字、字母、汉字。 22 | - (BOOL)pp_is:(PPTextFieldStringType)stringType; 23 | 24 | ///字符串是不是特殊字符,此时的特殊字符就是:除数字、字母、汉字以外的。 25 | - (BOOL)pp_isSpecialLetter; 26 | 27 | ///字符串长度 【一个汉字算2个字符串,一个英文算1个字符串】 28 | @property (nonatomic, assign, readonly) NSUInteger pp_lengthForCN2EN1; 29 | 30 | ///移除字符串中除exceptLetters外的所有特殊字符 31 | - (NSString *)pp_removeSpecialLettersExceptLetters:(NSArray *)exceptLetters; 32 | 33 | @end 34 | -------------------------------------------------------------------------------- /PPTextField/NSString+PPTextField.m: -------------------------------------------------------------------------------- 1 | // 2 | // NSString+PPTextField.m 3 | // PPDemos 4 | // 5 | // Created by ╰莪呮想好好宠Nǐつ on 2017/3/19. 6 | // Copyright © 2017年 PPAbner. All rights reserved. 7 | // 8 | 9 | #import "NSString+PPTextField.h" 10 | 11 | @implementation NSString (PPTextField) 12 | - (BOOL)pp_is:(PPTextFieldStringType)stringType 13 | { 14 | return [self matchRegularWith:stringType]; 15 | } 16 | 17 | 18 | - (BOOL)pp_isSpecialLetter 19 | { 20 | if ([self pp_is:PPTextFieldStringTypeNumber] || [self pp_is:PPTextFieldStringTypeLetter] || [self pp_is:PPTextFieldStringTypeChinese]) { 21 | return NO; 22 | } 23 | return YES; 24 | } 25 | 26 | #pragma mark --- 用正则判断条件 27 | - (BOOL)matchRegularWith:(PPTextFieldStringType)type 28 | { 29 | NSString *regularStr = @""; 30 | switch (type) { 31 | case PPTextFieldStringTypeNumber: //数字 32 | regularStr = @"^[0-9]*$"; 33 | break; 34 | case PPTextFieldStringTypeLetter: //字母 35 | regularStr = @"^[A-Za-z]+$"; 36 | break; 37 | case PPTextFieldStringTypeChinese: //汉字 38 | regularStr = @"^[\u4e00-\u9fa5]{0,}$"; 39 | break; 40 | default: 41 | break; 42 | } 43 | NSPredicate *regextestA = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regularStr]; 44 | 45 | if ([regextestA evaluateWithObject:self] == YES){ 46 | return YES; 47 | } 48 | return NO; 49 | } 50 | 51 | - (NSUInteger)pp_lengthForCN2EN1 52 | { 53 | NSUInteger length = 0; 54 | char* p = (char*)[self cStringUsingEncoding:NSUnicodeStringEncoding]; 55 | for (int i = 0 ; i < [self lengthOfBytesUsingEncoding:NSUnicodeStringEncoding]; i++) { 56 | if (*p) { 57 | p++; 58 | length++; 59 | }else { 60 | p++; 61 | } 62 | } 63 | return length; 64 | } 65 | 66 | - (NSString *)pp_removeSpecialLettersExceptLetters:(NSArray *)exceptLetters 67 | { 68 | if (self.length > 0) { 69 | NSMutableString *resultStr = [[NSMutableString alloc]init]; 70 | for (int i = 0; i < self.length; i++) { 71 | NSString *indexStr = [self substringWithRange:NSMakeRange(i, 1)]; 72 | 73 | if (![indexStr pp_isSpecialLetter] || (exceptLetters && [exceptLetters containsObject:indexStr])) { 74 | [resultStr appendString:indexStr]; 75 | } 76 | } 77 | if (resultStr.length > 0) { 78 | return resultStr; 79 | }else{ 80 | return @""; 81 | } 82 | }else{ 83 | return @""; 84 | } 85 | } 86 | 87 | @end 88 | -------------------------------------------------------------------------------- /PPTextField/PPTextField.h: -------------------------------------------------------------------------------- 1 | // 2 | // PPTextField.h 3 | // PPDemos 4 | // 5 | // Created by Abner on 16/10/9. 6 | // Copyright © 2016年 PPAbner. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @class PPTextField; 12 | @class PPTextFieldAssistant; 13 | 14 | NS_ASSUME_NONNULL_BEGIN 15 | 16 | 17 | /* 18 | 支持PPTextFieldDidChangedTextBlockTimingWhenDidTappedChinese的大厂APPs: 19 | - 微信 20 | - 微博 21 | 22 | 支持PPTextFieldDidChangedTextBlockTimingWhenDidTappedChinese的大厂APPs: 23 | - 抖音 「当我输入bobo时,搜索结果有bobm的,只出现过一次」 24 | 25 | ///⚠️九宫格中文⚠️时,控制台打印如下: 26 | ///原因可参考[iOS 自带九宫格拼音键盘与 Emoji 表情之间的坑](https://kangzubin.com/nine-keyboard-emoji/) 27 | selectedRange is = <_UITextKitTextRange: 0x600003a0f760> (0, 1)F 28 | text = a 29 | selectedRange is = <_UITextKitTextRange: 0x600003a210a0> (0, 1)F 30 | text = b 31 | selectedRange is = <_UITextKitTextRange: 0x600003aebc00> (0, 2)F 32 | text = bm 33 | selectedRange is = <_UITextKitTextRange: 0x600003aea940> (0, 2)F 34 | text = bo 35 | selectedRange is = <_UITextKitTextRange: 0x600003a2c700> (0, 3)F 36 | text = boa 37 | selectedRange is = <_UITextKitTextRange: 0x600003a2c3e0> (0, 4)F 38 | text = bo b 39 | selectedRange is = <_UITextKitTextRange: 0x600003aff600> (0, 5)F 40 | text = bo bm 41 | selectedRange is = <_UITextKitTextRange: 0x600003a0f560> (0, 5)F 42 | text = bo bo 43 | 44 | */ 45 | ///tf文字变化回调时机「主要针对中文」 46 | typedef NS_ENUM(NSInteger, PPTextFieldDidChangedTextBlockTiming) { 47 | PPTextFieldDidChangedTextBlockTimingWhenDidTappedChinese, ///中文输入,单击中文文字才回调 48 | PPTextFieldDidChangedTextBlockTimingIfChanged ///只要改变,就回调 49 | }; 50 | 51 | typedef NS_ENUM(NSInteger, PPTextFieldMaxLengthStyle) { 52 | PPTextFieldMaxLengthStyleCN1EN1, ///不区分中英文 53 | PPTextFieldMaxLengthStyleCN2EN1 ///一个中文2个字符,一个英文1个字符【中文输入法下的都算中文】 54 | }; 55 | 56 | typedef void(^PPTextFieldDidChangedTextBlock)(PPTextField *tf); 57 | typedef void(^PPTextFieldDidEndEditingBlock)(PPTextField *tf); 58 | typedef void(^PPTextFieldDidTappedReturnBlock)(PPTextField *tf); 59 | 60 | @interface PPTextField : UITextField 61 | 62 | #pragma mark --- ❶❶❶❶❶❶❶❶---☪☪☪PPTextField is属性设置☪☪☪---❶❶❶❶❶❶❶❶ 63 | 64 | ///是否开启Debug调试输出 65 | @property (nonatomic, assign) BOOL isOnDebug; 66 | 67 | ///tf的助手类实例 68 | @property (nonatomic, strong, readonly) PPTextFieldAssistant *assistant; 69 | 70 | ///是否当编辑的时候显示clearButton,默认为yes。 71 | @property (nonatomic, assign) BOOL isClearWhileEditing; 72 | 73 | ///字符串最大长度的计算方式。 74 | @property (nonatomic, assign) PPTextFieldMaxLengthStyle maxLengthStyle; 75 | 76 | ///tf.text最大长度,具体会根据`maxLengthStyle`来计算。 77 | @property (nonatomic, assign) NSUInteger maxTextLength; 78 | 79 | ///是否可以输入特殊字符,默认YES,即可以输入。 80 | @property (nonatomic, assign) BOOL canInputSpecialCharacter; 81 | 82 | ///不可以输入的字符串数组,🐖①:全局限制,没有前提条件。 83 | @property (nonatomic, copy, nullable) NSArray *charactersThatCanotInput; 84 | 85 | ///可以输入的字符串数组 【控制不可以输入特殊字符,但是某个或者某些特殊字符又是可以输入的】。 86 | ///⚠️⚠️⚠️只有当canInputSpecialCharacter为NO时,有效。⚠️⚠️⚠️ 87 | @property (nonatomic, copy, nullable) NSArray *charactersThatCanInput; 88 | 89 | ///是否只能输入数字,默认为NO。 90 | @property (nonatomic, assign) BOOL isOnlyNumber; 91 | 92 | ///是否是手机号码。 93 | /// ☠☠设置了isPhoneNumber,就默认 isOnlyNumber = YES && maxTextLength == 11 ,此时maxTextLength和maxCharactersLength无效☠☠ 94 | @property (nonatomic, assign) BOOL isPhoneNumber; 95 | 96 | /** 97 | 价格(只有一个".",默认小数点后保留2位小数) 98 | 99 | ◥◤首位不能输入.◥◤ 100 | ◥◤首位输入0,第二位不是.,会自动补充.◥◤ 101 | 102 | ☠☠如果isPrice == YES,则isOnlyNumber=No,即使isOnlyNumber设置为YES也没用,此时canotInputCharacters无效☠☠ 103 | */ 104 | @property (nonatomic, assign) BOOL isPrice; 105 | 106 | /// 小数点后保留X位小数,默认2 107 | @property (nonatomic, assign) NSUInteger decimalPlaces; 108 | 109 | ///价格是否允许以“.”开头,默认是不允许,如果允许,请设置为YES。 110 | /// ☠☠设置了isAllowPricePrefixPoint,则isPrice = YES,此时canotInputCharacters无效☠☠ 111 | @property (nonatomic, assign) BOOL isAllowPricePrefixPoint; 112 | 113 | ///是不是密码 (默认只能字母和数字) 114 | @property (nonatomic, assign) BOOL isPassword; 115 | 116 | ///密码可以输入的字符串数组 【控制不可以输入特殊字符,但是某个或者某些特殊字符又是可以输入的】。 117 | ///⚠️⚠️⚠️只有当`isPassword`为YES时,有效。⚠️⚠️⚠️ 118 | @property (nonatomic, copy, nullable) NSArray *passwordsThatCanInput; 119 | 120 | ///tf文字变化回调时机「主要针对中文」,默认PPTextFieldDidChangedTextBlockTimingWhenDidTappedChinese。 121 | @property (nonatomic, assign) PPTextFieldDidChangedTextBlockTiming didChangedTextBlockTiming; 122 | 123 | 124 | #pragma mark --- ❷❷❷❷❷❷❷❷---☮☮☮PPTextField Block回调☮☮☮---❷❷❷❷❷❷❷❷ 125 | @property (nonatomic, copy, nullable) PPTextFieldDidChangedTextBlock didChangedTextBlock; 126 | @property (nonatomic, copy, nullable) PPTextFieldDidEndEditingBlock didEndEditingBlock; 127 | @property (nonatomic, copy, nullable) PPTextFieldDidTappedReturnBlock didTappedReturnBlock; 128 | 129 | @end 130 | 131 | NS_ASSUME_NONNULL_END 132 | -------------------------------------------------------------------------------- /PPTextField/PPTextField.m: -------------------------------------------------------------------------------- 1 | // 2 | // PPTextField.m 3 | // PPDemos 4 | // 5 | // Created by Abner on 16/10/9. 6 | // Copyright © 2016年 PPAbner. All rights reserved. 7 | // 8 | 9 | #import "PPTextField.h" 10 | #import "NSString+PPTextField.h" 11 | #import "PPTextFieldAssistant.h" 12 | 13 | @interface PPTextField () 14 | @property (nonatomic, strong) PPTextFieldAssistant *internalAssistant; 15 | @end 16 | 17 | 18 | @implementation PPTextField 19 | 20 | - (void)configurePPTextField 21 | { 22 | self.internalAssistant.tf = self; 23 | self.autocorrectionType = UITextAutocorrectionTypeNo;//不自动提示 24 | [self setupDefaultConfigure]; 25 | 26 | } 27 | 28 | #pragma mark --- 配置默认设置 29 | - (void)setupDefaultConfigure 30 | { 31 | _canInputSpecialCharacter = YES; 32 | _isOnlyNumber = NO; 33 | _isAllowPricePrefixPoint = NO; 34 | _maxLengthStyle = PPTextFieldMaxLengthStyleCN1EN1; 35 | _didChangedTextBlockTiming = PPTextFieldDidChangedTextBlockTimingWhenDidTappedChinese; 36 | _isOnDebug = NO; 37 | _isClearWhileEditing = YES; 38 | _decimalPlaces = 2; 39 | if (_isClearWhileEditing) { 40 | self.clearButtonMode = UITextFieldViewModeWhileEditing; 41 | } 42 | } 43 | 44 | - (instancetype)init 45 | { 46 | self = [super init]; 47 | if (self) { 48 | [self configurePPTextField]; 49 | } 50 | return self; 51 | } 52 | 53 | - (instancetype)initWithFrame:(CGRect)frame 54 | { 55 | self = [super initWithFrame:frame]; 56 | if (self) { 57 | [self configurePPTextField]; 58 | } 59 | return self; 60 | } 61 | 62 | - (NSString *)text 63 | { 64 | NSString *tfText = [self valueForKey:@"_text"]; 65 | if (self.assistant.isChineseInputMethod) { 66 | UITextRange *markedTextRange = self.markedTextRange; 67 | if (markedTextRange) { 68 | if (self.didChangedTextBlockTiming == PPTextFieldDidChangedTextBlockTimingWhenDidTappedChinese) { 69 | NSString *str = [self textInRange:markedTextRange]; 70 | str = [tfText substringWithRange:NSMakeRange(0, tfText.length - str.length)]; 71 | return str; 72 | } 73 | } 74 | } 75 | return tfText; 76 | } 77 | 78 | #pragma mark --- 支持xib 79 | - (void)awakeFromNib 80 | { 81 | [super awakeFromNib]; 82 | [self configurePPTextField]; 83 | } 84 | 85 | - (void)setIsClearWhileEditing:(BOOL)isClearWhileEditing 86 | { 87 | _isClearWhileEditing = isClearWhileEditing; 88 | if (isClearWhileEditing) { 89 | self.clearButtonMode = UITextFieldViewModeWhileEditing; 90 | }else{ 91 | self.clearButtonMode = UITextFieldViewModeNever; 92 | } 93 | } 94 | 95 | 96 | - (void)setCharactersThatCanInput:(NSArray *)charactersThatCanInput 97 | { 98 | _charactersThatCanInput = charactersThatCanInput; 99 | ///再次说明:当不可以输入特殊字符,但是特殊字符中的某个或某几个又是需要的时,所以前提是不可以输入特殊字符 100 | if (charactersThatCanInput.count > 0) { 101 | _canInputSpecialCharacter = NO; 102 | } 103 | 104 | } 105 | 106 | 107 | - (void)setIsOnlyNumber:(BOOL)isOnlyNumber 108 | { 109 | _isOnlyNumber = isOnlyNumber; 110 | _canInputSpecialCharacter = NO; 111 | if (_isOnlyNumber) { 112 | _isPrice = NO; 113 | self.keyboardType = UIKeyboardTypeNumberPad; 114 | _maxLengthStyle = PPTextFieldMaxLengthStyleCN1EN1; 115 | } 116 | } 117 | 118 | - (void)setIsPrice:(BOOL)isPrice 119 | { 120 | _isPrice = isPrice; 121 | _canInputSpecialCharacter = NO; 122 | ///防止冲突 123 | if (_isPrice) { 124 | _isOnlyNumber = NO; 125 | self.keyboardType = UIKeyboardTypeDecimalPad; 126 | _maxLengthStyle = PPTextFieldMaxLengthStyleCN1EN1; 127 | } 128 | 129 | } 130 | 131 | - (void)setIsAllowPricePrefixPoint:(BOOL)isAllowPricePrefixPoint 132 | { 133 | _isAllowPricePrefixPoint = isAllowPricePrefixPoint; 134 | [self setIsPrice:YES]; 135 | } 136 | 137 | #pragma mark --- 电话号码 138 | - (void)setIsPhoneNumber:(BOOL)isPhoneNumber 139 | { 140 | _isPhoneNumber = isPhoneNumber; 141 | [self setIsOnlyNumber:YES]; 142 | [self setMaxTextLength:11]; 143 | 144 | } 145 | 146 | #pragma mark --- 是不是密码 147 | - (void)setIsPassword:(BOOL)isPassword 148 | { 149 | _isPassword = isPassword; 150 | self.secureTextEntry = YES; 151 | _canInputSpecialCharacter = NO; 152 | } 153 | 154 | - (void)setPasswordsThatCanInput:(NSArray *)passwordsThatCanInput 155 | { 156 | ///再次说明:密码默认只能输入字母和数字,但有时又要可以输入某个或某些非字母或数字的字符,所以前提是(是输入密码) 157 | _passwordsThatCanInput = passwordsThatCanInput; 158 | if (passwordsThatCanInput.count > 0) { 159 | [self setIsPassword:YES]; 160 | } 161 | } 162 | 163 | 164 | #pragma mark --- getter 165 | - (PPTextFieldAssistant *)assistant 166 | { 167 | return _internalAssistant; 168 | } 169 | 170 | #pragma mark --- lazy load 171 | - (PPTextFieldAssistant *)internalAssistant 172 | { 173 | if (!_internalAssistant) { 174 | _internalAssistant = PPTextFieldAssistant.assistant; 175 | } 176 | return _internalAssistant; 177 | } 178 | 179 | 180 | #ifdef DEBUG 181 | - (void)dealloc 182 | { 183 | PPTFLog(@"%s",__func__); 184 | } 185 | #endif 186 | 187 | @end 188 | 189 | -------------------------------------------------------------------------------- /PPTextField/PPTextFieldAssistant.h: -------------------------------------------------------------------------------- 1 | // 2 | // PPTextFieldAssistant.h 3 | // PPTextfieldDemo 4 | // 5 | // Created by PPAbner on 2020/12/11. 6 | // Copyright © 2020 PPAbner. All rights reserved. 7 | // 8 | 9 | #import 10 | #import 11 | @class PPTextField; 12 | 13 | NS_ASSUME_NONNULL_BEGIN 14 | 15 | ///字母和数字 16 | extern NSString * _Nonnull const PPTFLeterNumber; 17 | 18 | ///中文输入法标示符「@"zh-"」 19 | ///zh-Hans : 中文简体 20 | ///zh-Hant : 中文繁体 21 | extern NSString * _Nonnull const PPTFChineseInputMethodIdentifier; 22 | 23 | void PPTFLog(NSString *format, ...); 24 | void PPTFLogText(PPTextField *tf); 25 | 26 | 27 | @interface PPTextFieldAssistant : NSObject 28 | 29 | @property (nonatomic, strong, class, readonly) PPTextFieldAssistant *assistant; 30 | 31 | @property (nonatomic, unsafe_unretained, nullable) PPTextField *tf; 32 | 33 | ///是否是中文输入法 34 | @property (nonatomic, assign, readonly) BOOL isChineseInputMethod; 35 | 36 | @end 37 | 38 | NS_ASSUME_NONNULL_END 39 | -------------------------------------------------------------------------------- /PPTextField/PPTextFieldAssistant.m: -------------------------------------------------------------------------------- 1 | // 2 | // PPTextFieldAssistant.m 3 | // PPTextfieldDemo 4 | // 5 | // Created by PPAbner on 2020/12/11. 6 | // Copyright © 2020 PPAbner. All rights reserved. 7 | // 8 | /* 9 | 只要方法: 10 | 11 | ///主要用来判断可以不可以输入 12 | - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string; 13 | 14 | ///处理超过规定后,截取想要的范围! 15 | - (void)setupLimits:(NSString *)toBeString; 16 | 17 | */ 18 | 19 | #import "PPTextFieldAssistant.h" 20 | #import "NSString+PPTextField.h" 21 | #import "PPTextField.h" 22 | 23 | NSString * _Nonnull const PPTFLeterNumber = @"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; 24 | NSString * _Nonnull const PPTFChineseInputMethodIdentifier = @"zh-"; 25 | 26 | void PPTFLog(NSString *format, ...){ 27 | #ifdef DEBUG 28 | va_list argptr; 29 | va_start(argptr, format); 30 | NSLogv(format, argptr); 31 | va_end(argptr); 32 | #endif 33 | } 34 | 35 | void PPTFLogText(PPTextField *tf){ 36 | PPTFLog(@"tf.text is %@",tf.text); 37 | } 38 | 39 | @interface PPTextFieldAssistant () 40 | 41 | @property (nonatomic, assign) BOOL isChineseInput; 42 | 43 | ///上次回调的tf文字 44 | @property (nonatomic, copy) NSString *lastCallBackTFText; 45 | 46 | @end 47 | 48 | 49 | @implementation PPTextFieldAssistant 50 | 51 | #pragma mark --- ☮☮☮UITextfieldDelegate☮☮☮ 52 | - (BOOL)textFieldShouldReturn:(UITextField *)textField 53 | { 54 | if (self.tf.didTappedReturnBlock) { 55 | self.tf.didTappedReturnBlock(self.tf); 56 | } 57 | return YES; 58 | } 59 | 60 | - (BOOL)textFieldShouldEndEditing:(UITextField *)textField 61 | { 62 | return YES; 63 | } 64 | 65 | - (void)textFieldDidEndEditing:(UITextField *)textField 66 | { 67 | ///必须textFieldShouldEndEditing返回为YES 68 | if (self.tf.didEndEditingBlock) { 69 | self.tf.didEndEditingBlock(self.tf); 70 | } 71 | } 72 | 73 | - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string 74 | { 75 | 76 | ///【注】此方法里面不需要根据字符串最大个数判断是否可以输入,截取方法里面用到,超过了就截取!!! 77 | 78 | ///判断输入的是否为数字 (只能输入数字) 79 | if (_tf.isOnlyNumber) { 80 | ///如果是数字了,但是该数字包含在数组canotInputCharacters里,同样不能输入 81 | if ([string pp_is:PPTextFieldStringTypeNumber]) { 82 | return ![_tf.charactersThatCanotInput containsObject:string]; 83 | }else{ 84 | return NO; 85 | } 86 | } 87 | 88 | ///密码 89 | if (_tf.isPassword) { 90 | NSCharacterSet *cs = [[NSCharacterSet characterSetWithCharactersInString:PPTFLeterNumber] invertedSet]; 91 | NSString *inputStr = [[string componentsSeparatedByCharactersInSet:cs] componentsJoinedByString:@""]; 92 | BOOL canInput = [string isEqualToString:inputStr]; 93 | if (canInput) { 94 | return YES; 95 | }else{ 96 | return [_tf.passwordsThatCanInput containsObject:string]; 97 | } 98 | } 99 | 100 | ///价格 101 | ///与_isSpecialCharacter互斥,所以此处必须写,要不走下面的_isSpecialCharacter的判断 102 | if (_tf.isPrice) { 103 | return [self limitPriceWithTextField:textField shouldChangeCharactersInRange:range replacementString:string]; 104 | } 105 | 106 | ///特殊字符 【一定要放在该方法最后一个判断,要不会影响哪些它互斥的设置】 107 | if (!_tf.canInputSpecialCharacter && (_tf.charactersThatCanInput.count > 0 || _tf.passwordsThatCanInput.count > 0)) { 108 | if ([_tf.charactersThatCanInput containsObject:string] || [_tf.passwordsThatCanInput containsObject:string]) { 109 | return YES; 110 | }else{ 111 | if ([string pp_isSpecialLetter] || [_tf.charactersThatCanotInput containsObject:string]) { 112 | return NO; 113 | } 114 | return YES; 115 | } 116 | } 117 | 118 | return YES; 119 | } 120 | 121 | 122 | 123 | #pragma mark --- getter 124 | + (PPTextFieldAssistant *)assistant 125 | { 126 | return [[PPTextFieldAssistant alloc] init]; 127 | } 128 | 129 | - (UITextInputMode *)currentInputMode 130 | { 131 | ///[控制textview输入文字个数的方法](http://blog.sina.com.cn/s/blog_1410870560102x0ct.html) 132 | return [UIApplication sharedApplication].textInputMode; 133 | } 134 | 135 | - (BOOL)isChineseInputMethod 136 | { 137 | NSString *primaryLanguage = self.currentInputMode.primaryLanguage; 138 | return [primaryLanguage containsString:PPTFChineseInputMethodIdentifier]; 139 | } 140 | 141 | #pragma mark --- setter 142 | - (void)setTf:(PPTextField *)tf 143 | { 144 | _tf = tf; 145 | _tf.delegate = self; 146 | [_tf addTarget:self action:@selector(textFieldTextEditingChanged) forControlEvents:UIControlEventEditingChanged]; 147 | } 148 | 149 | #pragma mark --- private method 150 | - (void)textFieldTextEditingChanged 151 | { 152 | NSString *toBeString = _tf.text; 153 | UITextRange *markedTextRange = _tf.markedTextRange; 154 | 155 | ///中文输入法下 156 | if (self.isChineseInputMethod) { 157 | if (markedTextRange) { 158 | ///如果markedTextRange不为空,说明中文输入中,但是键盘toolBar有字母组合&输入框有字母拼音, 159 | ///由于现在用户还没有决定选择哪个汉字,所以不做限制,可以随意输入。 160 | }else{ 161 | ///没有高亮选择的字,则对已输入的文字进行字数统计和限制 162 | [self setupLimits:toBeString]; 163 | } 164 | }else{ 165 | [self setupLimits:toBeString]; 166 | } 167 | 168 | ///所有都处理完了来回调 169 | if (_tf.didChangedTextBlock) { 170 | if (markedTextRange && _tf.didChangedTextBlockTiming == PPTextFieldDidChangedTextBlockTimingWhenDidTappedChinese) { 171 | return; 172 | } 173 | 174 | if (_lastCallBackTFText &&_tf.text && [_lastCallBackTFText isEqualToString:_tf.text]) { 175 | ///回调会走2次,所以这里判断一下 176 | }else{ 177 | if (_tf.isOnDebug) { 178 | PPTFLogText(_tf); 179 | } 180 | _lastCallBackTFText = _tf.text; 181 | _tf.didChangedTextBlock(_tf); 182 | } 183 | } 184 | } 185 | 186 | - (void)setupLimits:(NSString *)toBeString 187 | { 188 | if (toBeString.length == 0) { 189 | return; 190 | } 191 | 192 | ///价格 【要记得return,不然的话会走(特殊字符处理),这样就把`.`去掉了】 193 | if (_tf.isPrice) { 194 | _tf.text = toBeString; 195 | ///价格要放在【特殊字符处理】前,并且不让再继续下去。 196 | return; 197 | } 198 | 199 | ///特殊字符处理 200 | if (!_tf.canInputSpecialCharacter) { 201 | NSMutableArray *filterArrs; 202 | if (_tf.charactersThatCanInput.count > 0) { 203 | filterArrs = [NSMutableArray arrayWithArray:_tf.charactersThatCanInput]; 204 | }else{ 205 | filterArrs = [NSMutableArray array]; 206 | } 207 | ///要处理 208 | if (_tf.isPassword && _tf.passwordsThatCanInput.count > 0) { 209 | [filterArrs addObjectsFromArray:_tf.passwordsThatCanInput]; 210 | } 211 | _tf.text = [toBeString pp_removeSpecialLettersExceptLetters:filterArrs]; 212 | } 213 | 214 | ///☠要放在特殊字符处理后,因为放在前,走特殊字符时,toBeString并没有被裁剪,而self.text又 = toBeString,所以放后面☠ 215 | if (_tf.isOnlyNumber) { 216 | if ([toBeString pp_is:PPTextFieldStringTypeNumber]) { 217 | if (_tf.maxTextLength > 0) { 218 | if (toBeString.length > _tf.maxTextLength) { 219 | _tf.text = [toBeString substringToIndex:_tf.maxTextLength]; 220 | }else{ 221 | _tf.text = toBeString; 222 | } 223 | } 224 | } 225 | } 226 | 227 | if (_tf.maxLengthStyle == PPTextFieldMaxLengthStyleCN2EN1) { 228 | ///区分中英文 229 | if (!_tf.isPhoneNumber) { 230 | NSUInteger length = toBeString.pp_lengthForCN2EN1; 231 | if (length > _tf.maxTextLength) { 232 | NSUInteger totalCount = 0; 233 | for (NSUInteger i = 0; i < toBeString.length; i++) { 234 | NSString *str1 = [toBeString substringWithRange:NSMakeRange(i, 1)]; 235 | BOOL currentIsCN = [str1 pp_is:PPTextFieldStringTypeChinese]; //当前字符是不是中文 236 | if (currentIsCN) { 237 | totalCount +=2; 238 | }else{ 239 | totalCount +=1; 240 | } 241 | if (totalCount > _tf.maxTextLength) { 242 | _tf.text = [toBeString substringToIndex:i]; 243 | return; 244 | } 245 | } 246 | } 247 | } 248 | }else{ 249 | ///不区分中英文 250 | if (_tf.maxTextLength > 0) { 251 | if (toBeString.length > _tf.maxTextLength) { 252 | _tf.text = [toBeString substringToIndex:_tf.maxTextLength]; 253 | } 254 | } 255 | } 256 | } 257 | 258 | - (BOOL)limitPriceWithTextField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string 259 | { 260 | BOOL hasPoint = YES; 261 | if ([textField.text rangeOfString:@"."].location == NSNotFound) { 262 | hasPoint = NO; 263 | } 264 | if ([string length] > 0){ 265 | ///当前输入的字符 266 | unichar single = [string characterAtIndex:0]; 267 | ///数据格式正确 268 | if ((single >= '0' && single <= '9') || single == '.') { 269 | if (_tf.isAllowPricePrefixPoint) { 270 | ///首字母可以为小数点 271 | if([textField.text length] == 0){ 272 | if(single == '.'){ 273 | //此处强制让textField.text = 0,然后又return YES,这样第一个字符输入`.`,显示的就是`0.`。 274 | textField.text = @"0"; 275 | return YES; 276 | } 277 | } 278 | }else{ 279 | ///首字母不能为小数点 280 | if([textField.text length] == 0){ 281 | if(single == '.'){ 282 | [textField.text stringByReplacingCharactersInRange:range withString:@""]; 283 | return NO; 284 | } 285 | } 286 | } 287 | 288 | ///如果开头是`0`,自动添加`.`,则输入框文字为`0.` 289 | if([textField.text length] == 1 && [textField.text isEqualToString:@"0"]){ 290 | if(single != '.'){ 291 | textField.text = @"0."; 292 | return YES; 293 | } 294 | } 295 | 296 | ///限制只能输入一个`.` 297 | if (single == '.'){ 298 | if(hasPoint){ 299 | ///text中有小数点 300 | [textField.text stringByReplacingCharactersInRange:range withString:@""]; 301 | return NO; 302 | }else{ 303 | ///text中还没有小数点 304 | hasPoint = YES; 305 | return YES; 306 | } 307 | }else{ 308 | if (hasPoint){ 309 | ///存在小数点 310 | ///判断小数点的位数 311 | NSRange pointRange = [textField.text rangeOfString:@"."]; 312 | NSUInteger pointDigit = range.location - pointRange.location; 313 | if (pointDigit <= _tf.decimalPlaces){ 314 | return YES; 315 | }else{ 316 | return NO; 317 | } 318 | }else{ 319 | return YES; 320 | } 321 | } 322 | }else{ 323 | ///输入的数据格式不正确 324 | [textField.text stringByReplacingCharactersInRange:range withString:@""]; 325 | return NO; 326 | } 327 | }else{ 328 | return YES; 329 | } 330 | } 331 | 332 | 333 | 334 | #ifdef DEBUG 335 | - (void)dealloc 336 | { 337 | PPTFLog(@"%s",__func__); 338 | } 339 | #endif 340 | 341 | 342 | 343 | 344 | @end 345 | -------------------------------------------------------------------------------- /PPTextfieldDemo.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 8468C15A2584F83E00A03CB2 /* PPTextFieldExampleViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 8468C1592584F83E00A03CB2 /* PPTextFieldExampleViewController.m */; }; 11 | A662A4118985AF5B3F92C65E /* Pods_PPTextfieldDemo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A287AAA3F004AD9870B851E0 /* Pods_PPTextfieldDemo.framework */; }; 12 | C6FEE3FB1DAB74BA00316D14 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = C6FEE3FA1DAB74BA00316D14 /* main.m */; }; 13 | C6FEE3FE1DAB74BA00316D14 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = C6FEE3FD1DAB74BA00316D14 /* AppDelegate.m */; }; 14 | C6FEE4011DAB74BA00316D14 /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = C6FEE4001DAB74BA00316D14 /* ViewController.m */; }; 15 | C6FEE4041DAB74BA00316D14 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = C6FEE4021DAB74BA00316D14 /* Main.storyboard */; }; 16 | C6FEE4061DAB74BA00316D14 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = C6FEE4051DAB74BA00316D14 /* Assets.xcassets */; }; 17 | C6FEE4091DAB74BA00316D14 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = C6FEE4071DAB74BA00316D14 /* LaunchScreen.storyboard */; }; 18 | /* End PBXBuildFile section */ 19 | 20 | /* Begin PBXFileReference section */ 21 | 1D7C260DD4CA0A7C060676EE /* Pods-PPTextfieldDemo.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-PPTextfieldDemo.debug.xcconfig"; path = "Target Support Files/Pods-PPTextfieldDemo/Pods-PPTextfieldDemo.debug.xcconfig"; sourceTree = ""; }; 22 | 8468C1582584F83E00A03CB2 /* PPTextFieldExampleViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PPTextFieldExampleViewController.h; sourceTree = ""; }; 23 | 8468C1592584F83E00A03CB2 /* PPTextFieldExampleViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PPTextFieldExampleViewController.m; sourceTree = ""; }; 24 | A287AAA3F004AD9870B851E0 /* Pods_PPTextfieldDemo.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_PPTextfieldDemo.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 25 | C6FEE3F61DAB74BA00316D14 /* PPTextfieldDemo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = PPTextfieldDemo.app; sourceTree = BUILT_PRODUCTS_DIR; }; 26 | C6FEE3FA1DAB74BA00316D14 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 27 | C6FEE3FC1DAB74BA00316D14 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; 28 | C6FEE3FD1DAB74BA00316D14 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; 29 | C6FEE3FF1DAB74BA00316D14 /* ViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ViewController.h; sourceTree = ""; }; 30 | C6FEE4001DAB74BA00316D14 /* ViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ViewController.m; sourceTree = ""; }; 31 | C6FEE4031DAB74BA00316D14 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 32 | C6FEE4051DAB74BA00316D14 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 33 | C6FEE4081DAB74BA00316D14 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 34 | C6FEE40A1DAB74BB00316D14 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 35 | E7C043A2FDC961661B7E719A /* Pods-PPTextfieldDemo.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-PPTextfieldDemo.release.xcconfig"; path = "Target Support Files/Pods-PPTextfieldDemo/Pods-PPTextfieldDemo.release.xcconfig"; sourceTree = ""; }; 36 | /* End PBXFileReference section */ 37 | 38 | /* Begin PBXFrameworksBuildPhase section */ 39 | C6FEE3F31DAB74BA00316D14 /* Frameworks */ = { 40 | isa = PBXFrameworksBuildPhase; 41 | buildActionMask = 2147483647; 42 | files = ( 43 | A662A4118985AF5B3F92C65E /* Pods_PPTextfieldDemo.framework in Frameworks */, 44 | ); 45 | runOnlyForDeploymentPostprocessing = 0; 46 | }; 47 | /* End PBXFrameworksBuildPhase section */ 48 | 49 | /* Begin PBXGroup section */ 50 | 05AE32F3D3D8D9DA8276B312 /* Pods */ = { 51 | isa = PBXGroup; 52 | children = ( 53 | 1D7C260DD4CA0A7C060676EE /* Pods-PPTextfieldDemo.debug.xcconfig */, 54 | E7C043A2FDC961661B7E719A /* Pods-PPTextfieldDemo.release.xcconfig */, 55 | ); 56 | path = Pods; 57 | sourceTree = ""; 58 | }; 59 | 2A0A46C783B69457E5E10636 /* Frameworks */ = { 60 | isa = PBXGroup; 61 | children = ( 62 | A287AAA3F004AD9870B851E0 /* Pods_PPTextfieldDemo.framework */, 63 | ); 64 | name = Frameworks; 65 | sourceTree = ""; 66 | }; 67 | 8468C1572584F81700A03CB2 /* Example */ = { 68 | isa = PBXGroup; 69 | children = ( 70 | 8468C1582584F83E00A03CB2 /* PPTextFieldExampleViewController.h */, 71 | 8468C1592584F83E00A03CB2 /* PPTextFieldExampleViewController.m */, 72 | ); 73 | path = Example; 74 | sourceTree = ""; 75 | }; 76 | C6FEE3ED1DAB74B900316D14 = { 77 | isa = PBXGroup; 78 | children = ( 79 | C6FEE3F81DAB74BA00316D14 /* PPTextfieldDemo */, 80 | C6FEE3F71DAB74BA00316D14 /* Products */, 81 | 05AE32F3D3D8D9DA8276B312 /* Pods */, 82 | 2A0A46C783B69457E5E10636 /* Frameworks */, 83 | ); 84 | sourceTree = ""; 85 | }; 86 | C6FEE3F71DAB74BA00316D14 /* Products */ = { 87 | isa = PBXGroup; 88 | children = ( 89 | C6FEE3F61DAB74BA00316D14 /* PPTextfieldDemo.app */, 90 | ); 91 | name = Products; 92 | sourceTree = ""; 93 | }; 94 | C6FEE3F81DAB74BA00316D14 /* PPTextfieldDemo */ = { 95 | isa = PBXGroup; 96 | children = ( 97 | 8468C1572584F81700A03CB2 /* Example */, 98 | C6FEE3FC1DAB74BA00316D14 /* AppDelegate.h */, 99 | C6FEE3FD1DAB74BA00316D14 /* AppDelegate.m */, 100 | C6FEE3FF1DAB74BA00316D14 /* ViewController.h */, 101 | C6FEE4001DAB74BA00316D14 /* ViewController.m */, 102 | C6FEE4021DAB74BA00316D14 /* Main.storyboard */, 103 | C6FEE4051DAB74BA00316D14 /* Assets.xcassets */, 104 | C6FEE4071DAB74BA00316D14 /* LaunchScreen.storyboard */, 105 | C6FEE40A1DAB74BB00316D14 /* Info.plist */, 106 | C6FEE3F91DAB74BA00316D14 /* Supporting Files */, 107 | ); 108 | path = PPTextfieldDemo; 109 | sourceTree = ""; 110 | }; 111 | C6FEE3F91DAB74BA00316D14 /* Supporting Files */ = { 112 | isa = PBXGroup; 113 | children = ( 114 | C6FEE3FA1DAB74BA00316D14 /* main.m */, 115 | ); 116 | name = "Supporting Files"; 117 | sourceTree = ""; 118 | }; 119 | /* End PBXGroup section */ 120 | 121 | /* Begin PBXNativeTarget section */ 122 | C6FEE3F51DAB74BA00316D14 /* PPTextfieldDemo */ = { 123 | isa = PBXNativeTarget; 124 | buildConfigurationList = C6FEE40D1DAB74BB00316D14 /* Build configuration list for PBXNativeTarget "PPTextfieldDemo" */; 125 | buildPhases = ( 126 | 0619E6DD3F6BF3FCD60FFD99 /* [CP] Check Pods Manifest.lock */, 127 | C6FEE3F21DAB74BA00316D14 /* Sources */, 128 | C6FEE3F31DAB74BA00316D14 /* Frameworks */, 129 | C6FEE3F41DAB74BA00316D14 /* Resources */, 130 | 1C6C35051C6DB4AD51AC7A8A /* [CP] Embed Pods Frameworks */, 131 | ); 132 | buildRules = ( 133 | ); 134 | dependencies = ( 135 | ); 136 | name = PPTextfieldDemo; 137 | productName = PPTextfieldDemo; 138 | productReference = C6FEE3F61DAB74BA00316D14 /* PPTextfieldDemo.app */; 139 | productType = "com.apple.product-type.application"; 140 | }; 141 | /* End PBXNativeTarget section */ 142 | 143 | /* Begin PBXProject section */ 144 | C6FEE3EE1DAB74B900316D14 /* Project object */ = { 145 | isa = PBXProject; 146 | attributes = { 147 | LastUpgradeCheck = 1220; 148 | ORGANIZATIONNAME = PPAbner; 149 | TargetAttributes = { 150 | C6FEE3F51DAB74BA00316D14 = { 151 | CreatedOnToolsVersion = 7.3; 152 | DevelopmentTeam = W96TKX86AZ; 153 | }; 154 | }; 155 | }; 156 | buildConfigurationList = C6FEE3F11DAB74B900316D14 /* Build configuration list for PBXProject "PPTextfieldDemo" */; 157 | compatibilityVersion = "Xcode 3.2"; 158 | developmentRegion = en; 159 | hasScannedForEncodings = 0; 160 | knownRegions = ( 161 | en, 162 | Base, 163 | ); 164 | mainGroup = C6FEE3ED1DAB74B900316D14; 165 | productRefGroup = C6FEE3F71DAB74BA00316D14 /* Products */; 166 | projectDirPath = ""; 167 | projectRoot = ""; 168 | targets = ( 169 | C6FEE3F51DAB74BA00316D14 /* PPTextfieldDemo */, 170 | ); 171 | }; 172 | /* End PBXProject section */ 173 | 174 | /* Begin PBXResourcesBuildPhase section */ 175 | C6FEE3F41DAB74BA00316D14 /* Resources */ = { 176 | isa = PBXResourcesBuildPhase; 177 | buildActionMask = 2147483647; 178 | files = ( 179 | C6FEE4091DAB74BA00316D14 /* LaunchScreen.storyboard in Resources */, 180 | C6FEE4061DAB74BA00316D14 /* Assets.xcassets in Resources */, 181 | C6FEE4041DAB74BA00316D14 /* Main.storyboard in Resources */, 182 | ); 183 | runOnlyForDeploymentPostprocessing = 0; 184 | }; 185 | /* End PBXResourcesBuildPhase section */ 186 | 187 | /* Begin PBXShellScriptBuildPhase section */ 188 | 0619E6DD3F6BF3FCD60FFD99 /* [CP] Check Pods Manifest.lock */ = { 189 | isa = PBXShellScriptBuildPhase; 190 | buildActionMask = 2147483647; 191 | files = ( 192 | ); 193 | inputFileListPaths = ( 194 | ); 195 | inputPaths = ( 196 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock", 197 | "${PODS_ROOT}/Manifest.lock", 198 | ); 199 | name = "[CP] Check Pods Manifest.lock"; 200 | outputFileListPaths = ( 201 | ); 202 | outputPaths = ( 203 | "$(DERIVED_FILE_DIR)/Pods-PPTextfieldDemo-checkManifestLockResult.txt", 204 | ); 205 | runOnlyForDeploymentPostprocessing = 0; 206 | shellPath = /bin/sh; 207 | shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; 208 | showEnvVarsInLog = 0; 209 | }; 210 | 1C6C35051C6DB4AD51AC7A8A /* [CP] Embed Pods Frameworks */ = { 211 | isa = PBXShellScriptBuildPhase; 212 | buildActionMask = 2147483647; 213 | files = ( 214 | ); 215 | inputPaths = ( 216 | "${PODS_ROOT}/Target Support Files/Pods-PPTextfieldDemo/Pods-PPTextfieldDemo-frameworks.sh", 217 | "${BUILT_PRODUCTS_DIR}/PPTextField/PPTextField.framework", 218 | ); 219 | name = "[CP] Embed Pods Frameworks"; 220 | outputPaths = ( 221 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/PPTextField.framework", 222 | ); 223 | runOnlyForDeploymentPostprocessing = 0; 224 | shellPath = /bin/sh; 225 | shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-PPTextfieldDemo/Pods-PPTextfieldDemo-frameworks.sh\"\n"; 226 | showEnvVarsInLog = 0; 227 | }; 228 | /* End PBXShellScriptBuildPhase section */ 229 | 230 | /* Begin PBXSourcesBuildPhase section */ 231 | C6FEE3F21DAB74BA00316D14 /* Sources */ = { 232 | isa = PBXSourcesBuildPhase; 233 | buildActionMask = 2147483647; 234 | files = ( 235 | C6FEE4011DAB74BA00316D14 /* ViewController.m in Sources */, 236 | 8468C15A2584F83E00A03CB2 /* PPTextFieldExampleViewController.m in Sources */, 237 | C6FEE3FE1DAB74BA00316D14 /* AppDelegate.m in Sources */, 238 | C6FEE3FB1DAB74BA00316D14 /* main.m in Sources */, 239 | ); 240 | runOnlyForDeploymentPostprocessing = 0; 241 | }; 242 | /* End PBXSourcesBuildPhase section */ 243 | 244 | /* Begin PBXVariantGroup section */ 245 | C6FEE4021DAB74BA00316D14 /* Main.storyboard */ = { 246 | isa = PBXVariantGroup; 247 | children = ( 248 | C6FEE4031DAB74BA00316D14 /* Base */, 249 | ); 250 | name = Main.storyboard; 251 | sourceTree = ""; 252 | }; 253 | C6FEE4071DAB74BA00316D14 /* LaunchScreen.storyboard */ = { 254 | isa = PBXVariantGroup; 255 | children = ( 256 | C6FEE4081DAB74BA00316D14 /* Base */, 257 | ); 258 | name = LaunchScreen.storyboard; 259 | sourceTree = ""; 260 | }; 261 | /* End PBXVariantGroup section */ 262 | 263 | /* Begin XCBuildConfiguration section */ 264 | C6FEE40B1DAB74BB00316D14 /* Debug */ = { 265 | isa = XCBuildConfiguration; 266 | buildSettings = { 267 | ALWAYS_SEARCH_USER_PATHS = NO; 268 | CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; 269 | CLANG_ANALYZER_NONNULL = YES; 270 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 271 | CLANG_CXX_LIBRARY = "libc++"; 272 | CLANG_ENABLE_MODULES = YES; 273 | CLANG_ENABLE_OBJC_ARC = YES; 274 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 275 | CLANG_WARN_BOOL_CONVERSION = YES; 276 | CLANG_WARN_COMMA = YES; 277 | CLANG_WARN_CONSTANT_CONVERSION = YES; 278 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 279 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 280 | CLANG_WARN_EMPTY_BODY = YES; 281 | CLANG_WARN_ENUM_CONVERSION = YES; 282 | CLANG_WARN_INFINITE_RECURSION = YES; 283 | CLANG_WARN_INT_CONVERSION = YES; 284 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 285 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 286 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 287 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 288 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; 289 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 290 | CLANG_WARN_STRICT_PROTOTYPES = YES; 291 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 292 | CLANG_WARN_UNREACHABLE_CODE = YES; 293 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 294 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 295 | COPY_PHASE_STRIP = NO; 296 | DEBUG_INFORMATION_FORMAT = dwarf; 297 | ENABLE_STRICT_OBJC_MSGSEND = YES; 298 | ENABLE_TESTABILITY = YES; 299 | GCC_C_LANGUAGE_STANDARD = gnu99; 300 | GCC_DYNAMIC_NO_PIC = NO; 301 | GCC_NO_COMMON_BLOCKS = YES; 302 | GCC_OPTIMIZATION_LEVEL = 0; 303 | GCC_PREPROCESSOR_DEFINITIONS = ( 304 | "DEBUG=1", 305 | "$(inherited)", 306 | ); 307 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 308 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 309 | GCC_WARN_UNDECLARED_SELECTOR = YES; 310 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 311 | GCC_WARN_UNUSED_FUNCTION = YES; 312 | GCC_WARN_UNUSED_VARIABLE = YES; 313 | IPHONEOS_DEPLOYMENT_TARGET = 12.0; 314 | MTL_ENABLE_DEBUG_INFO = YES; 315 | ONLY_ACTIVE_ARCH = YES; 316 | SDKROOT = iphoneos; 317 | }; 318 | name = Debug; 319 | }; 320 | C6FEE40C1DAB74BB00316D14 /* Release */ = { 321 | isa = XCBuildConfiguration; 322 | buildSettings = { 323 | ALWAYS_SEARCH_USER_PATHS = NO; 324 | CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; 325 | CLANG_ANALYZER_NONNULL = YES; 326 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 327 | CLANG_CXX_LIBRARY = "libc++"; 328 | CLANG_ENABLE_MODULES = YES; 329 | CLANG_ENABLE_OBJC_ARC = YES; 330 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 331 | CLANG_WARN_BOOL_CONVERSION = YES; 332 | CLANG_WARN_COMMA = YES; 333 | CLANG_WARN_CONSTANT_CONVERSION = YES; 334 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 335 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 336 | CLANG_WARN_EMPTY_BODY = YES; 337 | CLANG_WARN_ENUM_CONVERSION = YES; 338 | CLANG_WARN_INFINITE_RECURSION = YES; 339 | CLANG_WARN_INT_CONVERSION = YES; 340 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 341 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 342 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 343 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 344 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; 345 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 346 | CLANG_WARN_STRICT_PROTOTYPES = YES; 347 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 348 | CLANG_WARN_UNREACHABLE_CODE = YES; 349 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 350 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 351 | COPY_PHASE_STRIP = NO; 352 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 353 | ENABLE_NS_ASSERTIONS = NO; 354 | ENABLE_STRICT_OBJC_MSGSEND = YES; 355 | GCC_C_LANGUAGE_STANDARD = gnu99; 356 | GCC_NO_COMMON_BLOCKS = YES; 357 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 358 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 359 | GCC_WARN_UNDECLARED_SELECTOR = YES; 360 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 361 | GCC_WARN_UNUSED_FUNCTION = YES; 362 | GCC_WARN_UNUSED_VARIABLE = YES; 363 | IPHONEOS_DEPLOYMENT_TARGET = 12.0; 364 | MTL_ENABLE_DEBUG_INFO = NO; 365 | SDKROOT = iphoneos; 366 | VALIDATE_PRODUCT = YES; 367 | }; 368 | name = Release; 369 | }; 370 | C6FEE40E1DAB74BB00316D14 /* Debug */ = { 371 | isa = XCBuildConfiguration; 372 | baseConfigurationReference = 1D7C260DD4CA0A7C060676EE /* Pods-PPTextfieldDemo.debug.xcconfig */; 373 | buildSettings = { 374 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 375 | DEVELOPMENT_TEAM = W96TKX86AZ; 376 | INFOPLIST_FILE = PPTextfieldDemo/Info.plist; 377 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 378 | PRODUCT_BUNDLE_IDENTIFIER = github.io.abnerpei.tf; 379 | PRODUCT_NAME = "$(TARGET_NAME)"; 380 | }; 381 | name = Debug; 382 | }; 383 | C6FEE40F1DAB74BB00316D14 /* Release */ = { 384 | isa = XCBuildConfiguration; 385 | baseConfigurationReference = E7C043A2FDC961661B7E719A /* Pods-PPTextfieldDemo.release.xcconfig */; 386 | buildSettings = { 387 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 388 | DEVELOPMENT_TEAM = W96TKX86AZ; 389 | INFOPLIST_FILE = PPTextfieldDemo/Info.plist; 390 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 391 | PRODUCT_BUNDLE_IDENTIFIER = github.io.abnerpei.tf; 392 | PRODUCT_NAME = "$(TARGET_NAME)"; 393 | }; 394 | name = Release; 395 | }; 396 | /* End XCBuildConfiguration section */ 397 | 398 | /* Begin XCConfigurationList section */ 399 | C6FEE3F11DAB74B900316D14 /* Build configuration list for PBXProject "PPTextfieldDemo" */ = { 400 | isa = XCConfigurationList; 401 | buildConfigurations = ( 402 | C6FEE40B1DAB74BB00316D14 /* Debug */, 403 | C6FEE40C1DAB74BB00316D14 /* Release */, 404 | ); 405 | defaultConfigurationIsVisible = 0; 406 | defaultConfigurationName = Release; 407 | }; 408 | C6FEE40D1DAB74BB00316D14 /* Build configuration list for PBXNativeTarget "PPTextfieldDemo" */ = { 409 | isa = XCConfigurationList; 410 | buildConfigurations = ( 411 | C6FEE40E1DAB74BB00316D14 /* Debug */, 412 | C6FEE40F1DAB74BB00316D14 /* Release */, 413 | ); 414 | defaultConfigurationIsVisible = 0; 415 | defaultConfigurationName = Release; 416 | }; 417 | /* End XCConfigurationList section */ 418 | }; 419 | rootObject = C6FEE3EE1DAB74B900316D14 /* Project object */; 420 | } 421 | -------------------------------------------------------------------------------- /PPTextfieldDemo.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /PPTextfieldDemo.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /PPTextfieldDemo.xcodeproj/project.xcworkspace/xcuserdata/PPMT.xcuserdatad/UserInterfaceState.xcuserstate: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AbnerPei/PPTextField/1ff591d0f85a9965a9376e58e689acde7d73b8ae/PPTextfieldDemo.xcodeproj/project.xcworkspace/xcuserdata/PPMT.xcuserdatad/UserInterfaceState.xcuserstate -------------------------------------------------------------------------------- /PPTextfieldDemo.xcodeproj/project.xcworkspace/xcuserdata/admin.xcuserdatad/UserInterfaceState.xcuserstate: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AbnerPei/PPTextField/1ff591d0f85a9965a9376e58e689acde7d73b8ae/PPTextfieldDemo.xcodeproj/project.xcworkspace/xcuserdata/admin.xcuserdatad/UserInterfaceState.xcuserstate -------------------------------------------------------------------------------- /PPTextfieldDemo.xcodeproj/project.xcworkspace/xcuserdata/jikesoft.xcuserdatad/UserInterfaceState.xcuserstate: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AbnerPei/PPTextField/1ff591d0f85a9965a9376e58e689acde7d73b8ae/PPTextfieldDemo.xcodeproj/project.xcworkspace/xcuserdata/jikesoft.xcuserdatad/UserInterfaceState.xcuserstate -------------------------------------------------------------------------------- /PPTextfieldDemo.xcodeproj/xcshareddata/xcschemes/PPTextfieldDemo.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 43 | 45 | 51 | 52 | 53 | 54 | 60 | 62 | 68 | 69 | 70 | 71 | 73 | 74 | 77 | 78 | 79 | -------------------------------------------------------------------------------- /PPTextfieldDemo.xcodeproj/xcuserdata/PPMT.xcuserdatad/xcschemes/PPTextfieldDemo.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 39 | 40 | 41 | 42 | 43 | 44 | 54 | 56 | 62 | 63 | 64 | 65 | 66 | 67 | 73 | 75 | 81 | 82 | 83 | 84 | 86 | 87 | 90 | 91 | 92 | -------------------------------------------------------------------------------- /PPTextfieldDemo.xcodeproj/xcuserdata/PPMT.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | PPTextfieldDemo.xcscheme 8 | 9 | orderHint 10 | 0 11 | 12 | 13 | SuppressBuildableAutocreation 14 | 15 | C6FEE3F51DAB74BA00316D14 16 | 17 | primary 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /PPTextfieldDemo.xcodeproj/xcuserdata/admin.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 9 | 17 | 18 | 19 | 21 | 33 | 34 | 35 | 37 | 49 | 50 | 51 | 53 | 65 | 66 | 67 | 68 | 69 | -------------------------------------------------------------------------------- /PPTextfieldDemo.xcodeproj/xcuserdata/admin.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | PPTextfieldDemo.xcscheme_^#shared#^_ 8 | 9 | orderHint 10 | 0 11 | 12 | 13 | SuppressBuildableAutocreation 14 | 15 | C6FEE3F51DAB74BA00316D14 16 | 17 | primary 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /PPTextfieldDemo.xcodeproj/xcuserdata/jikesoft.xcuserdatad/xcschemes/PPTextfieldDemo.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 39 | 40 | 41 | 42 | 43 | 44 | 54 | 56 | 62 | 63 | 64 | 65 | 66 | 67 | 73 | 75 | 81 | 82 | 83 | 84 | 86 | 87 | 90 | 91 | 92 | -------------------------------------------------------------------------------- /PPTextfieldDemo.xcodeproj/xcuserdata/jikesoft.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | PPTextfieldDemo.xcscheme 8 | 9 | orderHint 10 | 0 11 | 12 | 13 | SuppressBuildableAutocreation 14 | 15 | C6FEE3F51DAB74BA00316D14 16 | 17 | primary 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /PPTextfieldDemo.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /PPTextfieldDemo.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /PPTextfieldDemo.xcworkspace/xcuserdata/admin.xcuserdatad/UserInterfaceState.xcuserstate: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AbnerPei/PPTextField/1ff591d0f85a9965a9376e58e689acde7d73b8ae/PPTextfieldDemo.xcworkspace/xcuserdata/admin.xcuserdatad/UserInterfaceState.xcuserstate -------------------------------------------------------------------------------- /PPTextfieldDemo.xcworkspace/xcuserdata/admin.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 9 | 21 | 22 | 23 | 25 | 37 | 38 | 39 | 40 | 41 | -------------------------------------------------------------------------------- /PPTextfieldDemo.xcworkspace/xcuserdata/peijianbo.xcuserdatad/UserInterfaceState.xcuserstate: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AbnerPei/PPTextField/1ff591d0f85a9965a9376e58e689acde7d73b8ae/PPTextfieldDemo.xcworkspace/xcuserdata/peijianbo.xcuserdatad/UserInterfaceState.xcuserstate -------------------------------------------------------------------------------- /PPTextfieldDemo/AppDelegate.h: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.h 3 | // PPTextfieldDemo 4 | // 5 | // Created by Abner on 16/10/10. 6 | // Copyright © 2016年 PPAbner. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface AppDelegate : UIResponder 12 | 13 | @property (strong, nonatomic) UIWindow *window; 14 | 15 | 16 | @end 17 | 18 | -------------------------------------------------------------------------------- /PPTextfieldDemo/AppDelegate.m: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.m 3 | // PPTextfieldDemo 4 | // 5 | // Created by Abner on 16/10/10. 6 | // Copyright © 2016年 PPAbner. All rights reserved. 7 | // 8 | 9 | #import "AppDelegate.h" 10 | #import "ViewController.h" 11 | 12 | @interface AppDelegate () 13 | 14 | @end 15 | 16 | @implementation AppDelegate 17 | 18 | 19 | - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 20 | // Override point for customization after application launch. 21 | UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:[ViewController new]]; 22 | self.window.rootViewController = nav; 23 | return YES; 24 | } 25 | 26 | - (void)applicationWillResignActive:(UIApplication *)application { 27 | // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. 28 | // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. 29 | } 30 | 31 | - (void)applicationDidEnterBackground:(UIApplication *)application { 32 | // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. 33 | // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. 34 | } 35 | 36 | - (void)applicationWillEnterForeground:(UIApplication *)application { 37 | // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background. 38 | } 39 | 40 | - (void)applicationDidBecomeActive:(UIApplication *)application { 41 | // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. 42 | } 43 | 44 | - (void)applicationWillTerminate:(UIApplication *)application { 45 | // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. 46 | } 47 | 48 | @end 49 | -------------------------------------------------------------------------------- /PPTextfieldDemo/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "size" : "29x29", 6 | "scale" : "2x" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "size" : "29x29", 11 | "scale" : "3x" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "size" : "40x40", 16 | "scale" : "2x" 17 | }, 18 | { 19 | "idiom" : "iphone", 20 | "size" : "40x40", 21 | "scale" : "3x" 22 | }, 23 | { 24 | "idiom" : "iphone", 25 | "size" : "60x60", 26 | "scale" : "2x" 27 | }, 28 | { 29 | "idiom" : "iphone", 30 | "size" : "60x60", 31 | "scale" : "3x" 32 | } 33 | ], 34 | "info" : { 35 | "version" : 1, 36 | "author" : "xcode" 37 | } 38 | } -------------------------------------------------------------------------------- /PPTextfieldDemo/Base.lproj/LaunchScreen.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /PPTextfieldDemo/Base.lproj/Main.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /PPTextfieldDemo/Example/PPTextFieldExampleViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // PPTextFieldExampleViewController.h 3 | // PPTextfieldDemo 4 | // 5 | // Created by PPAbner on 2020/12/12. 6 | // Copyright © 2020 PPAbner. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @interface PPTextFieldExampleViewController : UIViewController 14 | 15 | @end 16 | 17 | NS_ASSUME_NONNULL_END 18 | -------------------------------------------------------------------------------- /PPTextfieldDemo/Example/PPTextFieldExampleViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // PPTextFieldExampleViewController.m 3 | // PPTextfieldDemo 4 | // 5 | // Created by PPAbner on 2020/12/12. 6 | // Copyright © 2020 PPAbner. All rights reserved. 7 | // 8 | 9 | #import "PPTextFieldExampleViewController.h" 10 | #import 11 | 12 | @interface PPTextFieldExampleViewController () 13 | @property (nonatomic, strong) UIScrollView *scrollView; 14 | @end 15 | 16 | @implementation PPTextFieldExampleViewController 17 | 18 | - (void)viewDidLoad { 19 | [super viewDidLoad]; 20 | // Do any additional setup after loading the view. 21 | 22 | self.title = @"PPTextField"; 23 | [self.view addSubview:self.scrollView]; 24 | 25 | [self test_PPTextField]; 26 | } 27 | 28 | 29 | - (void)test_PPTextField 30 | { 31 | UILabel *lb_onlyNumber = [[UILabel alloc] initWithFrame:CGRectMake(20, 80, 200, 20)]; 32 | [self.scrollView addSubview:lb_onlyNumber]; 33 | lb_onlyNumber.text = @"01-只能输入数字"; 34 | 35 | PPTextField *tf_onlyNumber = [[PPTextField alloc] initWithFrame:CGRectMake(20, 110, 300, 30)]; 36 | [self.scrollView addSubview:tf_onlyNumber]; 37 | tf_onlyNumber.isOnlyNumber = YES; 38 | tf_onlyNumber.placeholder = @"设置maxTextLength即可限制最多数字个数"; 39 | tf_onlyNumber.borderStyle = UITextBorderStyleRoundedRect; 40 | 41 | //========= 42 | UILabel *lb_isPrice = [[UILabel alloc] initWithFrame:CGRectMake(20, 150, 200, 20)]; 43 | [self.scrollView addSubview:lb_isPrice]; 44 | lb_isPrice.text = @"02-价格"; 45 | 46 | PPTextField *tf_isPrice = [[PPTextField alloc] initWithFrame:CGRectMake(20, 180, 200, 30)]; 47 | [self.scrollView addSubview:tf_isPrice]; 48 | tf_isPrice.isPrice = YES; 49 | tf_isPrice.isAllowPricePrefixPoint = YES; 50 | tf_isPrice.decimalPlaces = 1; 51 | tf_isPrice.placeholder = @"tf_isPrice"; 52 | tf_isPrice.borderStyle = UITextBorderStyleRoundedRect; 53 | 54 | 55 | //==========区分中英 56 | UILabel *lb_maxCharactersLength = [[UILabel alloc] initWithFrame:CGRectMake(20, 220, 300, 20)]; 57 | [self.scrollView addSubview:lb_maxCharactersLength]; 58 | lb_maxCharactersLength.text = @"03-区分中英文,最多8个"; 59 | PPTextField *tf_maxCharactersLength = [[PPTextField alloc] initWithFrame:CGRectMake(20, 250, 300, 30)]; 60 | [self.scrollView addSubview:tf_maxCharactersLength]; 61 | tf_maxCharactersLength.maxTextLength = 8; 62 | tf_maxCharactersLength.maxLengthStyle = PPTextFieldMaxLengthStyleCN2EN1; 63 | tf_maxCharactersLength.didChangedTextBlockTiming = PPTextFieldDidChangedTextBlockTimingIfChanged; 64 | tf_maxCharactersLength.placeholder = @"设置为maxTextLength,则不区分"; 65 | tf_maxCharactersLength.borderStyle = UITextBorderStyleRoundedRect; 66 | tf_maxCharactersLength.canInputSpecialCharacter = NO; 67 | tf_maxCharactersLength.didChangedTextBlock = ^(PPTextField * _Nonnull tf) { 68 | NSLog(@"输入框内容变化了 %@",tf.text); 69 | }; 70 | 71 | 72 | 73 | } 74 | 75 | - (UIScrollView *)scrollView 76 | { 77 | if (!_scrollView) { 78 | _scrollView = [[UIScrollView alloc] initWithFrame:self.view.bounds]; 79 | _scrollView.backgroundColor = UIColor.whiteColor; 80 | } 81 | return _scrollView; 82 | } 83 | @end 84 | -------------------------------------------------------------------------------- /PPTextfieldDemo/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | APPL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | LSRequiresIPhoneOS 24 | 25 | UILaunchStoryboardName 26 | LaunchScreen 27 | UIMainStoryboardFile 28 | Main 29 | UIRequiredDeviceCapabilities 30 | 31 | armv7 32 | 33 | UISupportedInterfaceOrientations 34 | 35 | UIInterfaceOrientationPortrait 36 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /PPTextfieldDemo/ViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // ViewController.h 3 | // PPTextfieldDemo 4 | // 5 | // Created by Abner on 16/10/10. 6 | // Copyright © 2016年 PPAbner. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface ViewController : UIViewController 12 | 13 | 14 | @end 15 | 16 | -------------------------------------------------------------------------------- /PPTextfieldDemo/ViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // ViewController.m 3 | // PPTextfieldDemo 4 | // 5 | // Created by Abner on 16/10/10. 6 | // Copyright © 2016年 PPAbner. All rights reserved. 7 | // 8 | 9 | #import "ViewController.h" 10 | #import "PPTextFieldExampleViewController.h" 11 | 12 | @interface ViewController () 13 | 14 | @end 15 | 16 | @implementation ViewController 17 | 18 | - (void)viewDidLoad { 19 | [super viewDidLoad]; 20 | 21 | self.view.backgroundColor = [UIColor colorWithRed:176/255.0 green:23/255.0 blue:31/255.0 alpha:1.0]; 22 | self.title = @"PPTextField"; 23 | 24 | [self pushToExampleVC:NO]; 25 | 26 | } 27 | 28 | - (void)pushToExampleVC:(BOOL)animated 29 | { 30 | PPTextFieldExampleViewController *vc = [[PPTextFieldExampleViewController alloc] init]; 31 | [self.navigationController pushViewController:vc animated:animated]; 32 | } 33 | 34 | - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 35 | { 36 | [self pushToExampleVC:YES]; 37 | } 38 | 39 | 40 | 41 | - (void)didReceiveMemoryWarning { 42 | [super didReceiveMemoryWarning]; 43 | // Dispose of any resources that can be recreated. 44 | } 45 | 46 | @end 47 | -------------------------------------------------------------------------------- /PPTextfieldDemo/main.m: -------------------------------------------------------------------------------- 1 | // 2 | // main.m 3 | // PPTextfieldDemo 4 | // 5 | // Created by Abner on 16/10/10. 6 | // Copyright © 2016年 PPAbner. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "AppDelegate.h" 11 | 12 | int main(int argc, char * argv[]) { 13 | @autoreleasepool { 14 | return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /Podfile: -------------------------------------------------------------------------------- 1 | # Uncomment the next line to define a global platform for your project 2 | platform :ios, '9.0' 3 | 4 | target 'PPTextfieldDemo' do 5 | # Comment the next line if you don't want to use dynamic frameworks 6 | use_frameworks! 7 | 8 | # Pods for PPTextfieldDemo 9 | pod "PPTextField", :path => "../PPTextField" 10 | 11 | 12 | end 13 | -------------------------------------------------------------------------------- /Podfile.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - PPTextField (0.0.2) 3 | 4 | DEPENDENCIES: 5 | - PPTextField (from `../PPTextField`) 6 | 7 | EXTERNAL SOURCES: 8 | PPTextField: 9 | :path: "../PPTextField" 10 | 11 | SPEC CHECKSUMS: 12 | PPTextField: 34b5e67ba9892575134f6c351f11010503ea465c 13 | 14 | PODFILE CHECKSUM: 7f79498b101bb360291c1d970e6d268e558407a2 15 | 16 | COCOAPODS: 1.12.1 17 | -------------------------------------------------------------------------------- /Pods/Local Podspecs/PPTextField.podspec.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "PPTextField", 3 | "version": "0.0.2", 4 | "summary": "UITextField各种限制,从此一个属性就能解决!比如:手机号(11位)、密码(只能数字和字母)、最大字符串(是否区分中英文)等等这样的限制,以及实时监测输入文字、结束编辑时回调等。", 5 | "description": "最近总算抽空整理一下,支持pod。UITextField各种限制,从此一个属性就能解决!比如:手机号(11位)、密码(只能数字和字母)、最大字符串(是否区分中英文)等等这样的限制,以及实时监测输入文字、结束编辑时回调等。", 6 | "homepage": "https://github.com/PPAbner/PPTextField", 7 | "license": { 8 | "type": "MIT", 9 | "text": " Copyright PPAbner 2016\n" 10 | }, 11 | "authors": { 12 | "PPAbner": "chinesemanbobo@163.com" 13 | }, 14 | "platforms": { 15 | "ios": "9.0" 16 | }, 17 | "source": { 18 | "git": "https://github.com/PPAbner/PPTextField.git", 19 | "tag": "0.0.2" 20 | }, 21 | "source_files": "PPTextField/*", 22 | "public_header_files": "PPTextField/PPTextField.h", 23 | "requires_arc": true 24 | } 25 | -------------------------------------------------------------------------------- /Pods/Manifest.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - PPTextField (0.0.2) 3 | 4 | DEPENDENCIES: 5 | - PPTextField (from `../PPTextField`) 6 | 7 | EXTERNAL SOURCES: 8 | PPTextField: 9 | :path: "../PPTextField" 10 | 11 | SPEC CHECKSUMS: 12 | PPTextField: 34b5e67ba9892575134f6c351f11010503ea465c 13 | 14 | PODFILE CHECKSUM: 7f79498b101bb360291c1d970e6d268e558407a2 15 | 16 | COCOAPODS: 1.12.1 17 | -------------------------------------------------------------------------------- /Pods/Pods.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 046462A2AC25D4A73F8717F6F0B680B9 /* PPTextFieldAssistant.h in Headers */ = {isa = PBXBuildFile; fileRef = 35B05C3B44A0B93CB9C3BD6F9218EED1 /* PPTextFieldAssistant.h */; settings = {ATTRIBUTES = (Project, ); }; }; 11 | 0F489B1DCCB78A69DAEDE6C3816577D6 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 73010CC983E3809BECEE5348DA1BB8C6 /* Foundation.framework */; }; 12 | 11A8A0DF35A35157BC5010DC7BCCB060 /* PPTextField.m in Sources */ = {isa = PBXBuildFile; fileRef = D990A6E456D0CCD5E1DF2A2A128F73AA /* PPTextField.m */; }; 13 | 40546D7052374D5F6E71E586E4E518BF /* NSString+PPTextField.h in Headers */ = {isa = PBXBuildFile; fileRef = B3F9B648DA92F7BBFB88CBE8733CDC83 /* NSString+PPTextField.h */; settings = {ATTRIBUTES = (Project, ); }; }; 14 | 430D0FDA615781C8CC0062F1E36A9FBD /* PPTextField-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = FE6297D2FF962BA9BE87A1D9E035BF9D /* PPTextField-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; 15 | 6879D3872F79D963D0FF4959C855BC7C /* Pods-PPTextfieldDemo-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 75F5DFF3881BC705F6E8A186F3677CBD /* Pods-PPTextfieldDemo-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; 16 | 85377CC897A0B8080A2F95833B3F17DE /* PPTextField.h in Headers */ = {isa = PBXBuildFile; fileRef = 6E9D8AA311B6B8E0B89F05EFA52FEA7A /* PPTextField.h */; settings = {ATTRIBUTES = (Public, ); }; }; 17 | B16325BD09AC0DDFE12969EC3D8A7AA5 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 73010CC983E3809BECEE5348DA1BB8C6 /* Foundation.framework */; }; 18 | C436D727D216E917403172027A0255A5 /* PPTextField-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = E8F9A55EC9358F1756B9083E701EE0F7 /* PPTextField-dummy.m */; }; 19 | CDF72F93FCBF8B4A5D2709561C93F117 /* Pods-PPTextfieldDemo-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = AC6D29DFE338D1A6535B976D93D4C2A1 /* Pods-PPTextfieldDemo-dummy.m */; }; 20 | F38891CF9B10C9322524AC7C1BDE40C2 /* PPTextFieldAssistant.m in Sources */ = {isa = PBXBuildFile; fileRef = 54CB023E84514C29E2CA721CA3B16A25 /* PPTextFieldAssistant.m */; }; 21 | F4831C12E0AD445FE21C505114D2BACB /* NSString+PPTextField.m in Sources */ = {isa = PBXBuildFile; fileRef = 37692452297C800763BC54AEE9FB347F /* NSString+PPTextField.m */; }; 22 | /* End PBXBuildFile section */ 23 | 24 | /* Begin PBXContainerItemProxy section */ 25 | 527928FE32E3FDB432D6FCAF6CDB7E0D /* PBXContainerItemProxy */ = { 26 | isa = PBXContainerItemProxy; 27 | containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; 28 | proxyType = 1; 29 | remoteGlobalIDString = 8ADF4CBE8EF374EB4609CF2CFC4DF394; 30 | remoteInfo = PPTextField; 31 | }; 32 | /* End PBXContainerItemProxy section */ 33 | 34 | /* Begin PBXFileReference section */ 35 | 021A29DD04BFA19DCEB4921F5842D7C9 /* Pods-PPTextfieldDemo-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-PPTextfieldDemo-frameworks.sh"; sourceTree = ""; }; 36 | 1D8BB70AA0A3CC6BD45FBE1E85413F7B /* Pods-PPTextfieldDemo.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-PPTextfieldDemo.debug.xcconfig"; sourceTree = ""; }; 37 | 2A43F466BCF87AE20A6AC87697B79EB2 /* PPTextField.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = PPTextField.debug.xcconfig; sourceTree = ""; }; 38 | 3082BCF508BB12A184C2DDC01CE6A1C0 /* Pods-PPTextfieldDemo.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-PPTextfieldDemo.release.xcconfig"; sourceTree = ""; }; 39 | 35B05C3B44A0B93CB9C3BD6F9218EED1 /* PPTextFieldAssistant.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = PPTextFieldAssistant.h; path = PPTextField/PPTextFieldAssistant.h; sourceTree = ""; }; 40 | 37692452297C800763BC54AEE9FB347F /* NSString+PPTextField.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSString+PPTextField.m"; path = "PPTextField/NSString+PPTextField.m"; sourceTree = ""; }; 41 | 54CB023E84514C29E2CA721CA3B16A25 /* PPTextFieldAssistant.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = PPTextFieldAssistant.m; path = PPTextField/PPTextFieldAssistant.m; sourceTree = ""; }; 42 | 67859076D57ECCD5D26311713F3AC2C1 /* PPTextField.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = PPTextField.release.xcconfig; sourceTree = ""; }; 43 | 6AE9A543D6EB6AC2CDFD1AA5801615D1 /* PPTextField.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = PPTextField.modulemap; sourceTree = ""; }; 44 | 6C9EF99EC0E4448EB9F670C2AE670703 /* PPTextField */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = PPTextField; path = PPTextField.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 45 | 6E9D8AA311B6B8E0B89F05EFA52FEA7A /* PPTextField.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = PPTextField.h; path = PPTextField/PPTextField.h; sourceTree = ""; }; 46 | 73010CC983E3809BECEE5348DA1BB8C6 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; 47 | 75F5DFF3881BC705F6E8A186F3677CBD /* Pods-PPTextfieldDemo-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-PPTextfieldDemo-umbrella.h"; sourceTree = ""; }; 48 | 8AB64A6ABF21A74FB72910163C372DC2 /* PPTextField-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "PPTextField-Info.plist"; sourceTree = ""; }; 49 | 96AB13D2E7DF5AB810D6CFBE41D8B266 /* README.md */ = {isa = PBXFileReference; includeInIndex = 1; path = README.md; sourceTree = ""; }; 50 | 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; lastKnownFileType = text; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; 51 | A1186CC6F0A7B67B51377F088A0133E9 /* Pods-PPTextfieldDemo.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-PPTextfieldDemo.modulemap"; sourceTree = ""; }; 52 | AC6D29DFE338D1A6535B976D93D4C2A1 /* Pods-PPTextfieldDemo-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-PPTextfieldDemo-dummy.m"; sourceTree = ""; }; 53 | B3F9B648DA92F7BBFB88CBE8733CDC83 /* NSString+PPTextField.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSString+PPTextField.h"; path = "PPTextField/NSString+PPTextField.h"; sourceTree = ""; }; 54 | BB6668740D137A42F6758754152F12B9 /* Pods-PPTextfieldDemo-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-PPTextfieldDemo-acknowledgements.plist"; sourceTree = ""; }; 55 | BE6D66E48E337843DE948089967F6604 /* LICENSE */ = {isa = PBXFileReference; includeInIndex = 1; path = LICENSE; sourceTree = ""; }; 56 | D96B77D8D87F5DF31202A8FB57D6A8BE /* Pods-PPTextfieldDemo-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-PPTextfieldDemo-acknowledgements.markdown"; sourceTree = ""; }; 57 | D990A6E456D0CCD5E1DF2A2A128F73AA /* PPTextField.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = PPTextField.m; path = PPTextField/PPTextField.m; sourceTree = ""; }; 58 | D9D918670FE1769EDE84478A5C970DEA /* Pods-PPTextfieldDemo */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = "Pods-PPTextfieldDemo"; path = Pods_PPTextfieldDemo.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 59 | DF00B43A07B8A1F40823600494566B5B /* PPTextField-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "PPTextField-prefix.pch"; sourceTree = ""; }; 60 | E8F9A55EC9358F1756B9083E701EE0F7 /* PPTextField-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "PPTextField-dummy.m"; sourceTree = ""; }; 61 | E93A3B82740AA3F55C20C7276CCD7206 /* Pods-PPTextfieldDemo-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-PPTextfieldDemo-Info.plist"; sourceTree = ""; }; 62 | F3AAA008857323509F0A08EBC41A7EDA /* PPTextField.podspec */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; lastKnownFileType = text; path = PPTextField.podspec; sourceTree = ""; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; 63 | FE6297D2FF962BA9BE87A1D9E035BF9D /* PPTextField-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "PPTextField-umbrella.h"; sourceTree = ""; }; 64 | /* End PBXFileReference section */ 65 | 66 | /* Begin PBXFrameworksBuildPhase section */ 67 | D29DACEC55E64C40713399B632D934FE /* Frameworks */ = { 68 | isa = PBXFrameworksBuildPhase; 69 | buildActionMask = 2147483647; 70 | files = ( 71 | B16325BD09AC0DDFE12969EC3D8A7AA5 /* Foundation.framework in Frameworks */, 72 | ); 73 | runOnlyForDeploymentPostprocessing = 0; 74 | }; 75 | EE436EC4F6D7EC38A226B7EA9CD76C5D /* Frameworks */ = { 76 | isa = PBXFrameworksBuildPhase; 77 | buildActionMask = 2147483647; 78 | files = ( 79 | 0F489B1DCCB78A69DAEDE6C3816577D6 /* Foundation.framework in Frameworks */, 80 | ); 81 | runOnlyForDeploymentPostprocessing = 0; 82 | }; 83 | /* End PBXFrameworksBuildPhase section */ 84 | 85 | /* Begin PBXGroup section */ 86 | 0CCC57259A12CC8B8C97129528E35AF1 /* Development Pods */ = { 87 | isa = PBXGroup; 88 | children = ( 89 | 89200CE8C32C8A1B18CA8EC999844DC7 /* PPTextField */, 90 | ); 91 | name = "Development Pods"; 92 | sourceTree = ""; 93 | }; 94 | 1F2F5DD0E28C83E09EA0ED9521C3C05A /* Support Files */ = { 95 | isa = PBXGroup; 96 | children = ( 97 | 6AE9A543D6EB6AC2CDFD1AA5801615D1 /* PPTextField.modulemap */, 98 | E8F9A55EC9358F1756B9083E701EE0F7 /* PPTextField-dummy.m */, 99 | 8AB64A6ABF21A74FB72910163C372DC2 /* PPTextField-Info.plist */, 100 | DF00B43A07B8A1F40823600494566B5B /* PPTextField-prefix.pch */, 101 | FE6297D2FF962BA9BE87A1D9E035BF9D /* PPTextField-umbrella.h */, 102 | 2A43F466BCF87AE20A6AC87697B79EB2 /* PPTextField.debug.xcconfig */, 103 | 67859076D57ECCD5D26311713F3AC2C1 /* PPTextField.release.xcconfig */, 104 | ); 105 | name = "Support Files"; 106 | path = "Pods/Target Support Files/PPTextField"; 107 | sourceTree = ""; 108 | }; 109 | 3B8D213378905EA57E7FC81B41C38FFC /* Targets Support Files */ = { 110 | isa = PBXGroup; 111 | children = ( 112 | D83B3C7B42103E0E28A285482688194B /* Pods-PPTextfieldDemo */, 113 | ); 114 | name = "Targets Support Files"; 115 | sourceTree = ""; 116 | }; 117 | 47CE159653FC20A9A0A116F63B5FFCA9 /* Pod */ = { 118 | isa = PBXGroup; 119 | children = ( 120 | BE6D66E48E337843DE948089967F6604 /* LICENSE */, 121 | F3AAA008857323509F0A08EBC41A7EDA /* PPTextField.podspec */, 122 | 96AB13D2E7DF5AB810D6CFBE41D8B266 /* README.md */, 123 | ); 124 | name = Pod; 125 | sourceTree = ""; 126 | }; 127 | 578452D2E740E91742655AC8F1636D1F /* iOS */ = { 128 | isa = PBXGroup; 129 | children = ( 130 | 73010CC983E3809BECEE5348DA1BB8C6 /* Foundation.framework */, 131 | ); 132 | name = iOS; 133 | sourceTree = ""; 134 | }; 135 | 6857F847A13E6C2DC5458B5569E3D2B3 /* Products */ = { 136 | isa = PBXGroup; 137 | children = ( 138 | D9D918670FE1769EDE84478A5C970DEA /* Pods-PPTextfieldDemo */, 139 | 6C9EF99EC0E4448EB9F670C2AE670703 /* PPTextField */, 140 | ); 141 | name = Products; 142 | sourceTree = ""; 143 | }; 144 | 89200CE8C32C8A1B18CA8EC999844DC7 /* PPTextField */ = { 145 | isa = PBXGroup; 146 | children = ( 147 | B3F9B648DA92F7BBFB88CBE8733CDC83 /* NSString+PPTextField.h */, 148 | 37692452297C800763BC54AEE9FB347F /* NSString+PPTextField.m */, 149 | 6E9D8AA311B6B8E0B89F05EFA52FEA7A /* PPTextField.h */, 150 | D990A6E456D0CCD5E1DF2A2A128F73AA /* PPTextField.m */, 151 | 35B05C3B44A0B93CB9C3BD6F9218EED1 /* PPTextFieldAssistant.h */, 152 | 54CB023E84514C29E2CA721CA3B16A25 /* PPTextFieldAssistant.m */, 153 | 47CE159653FC20A9A0A116F63B5FFCA9 /* Pod */, 154 | 1F2F5DD0E28C83E09EA0ED9521C3C05A /* Support Files */, 155 | ); 156 | name = PPTextField; 157 | path = ..; 158 | sourceTree = ""; 159 | }; 160 | CF1408CF629C7361332E53B88F7BD30C = { 161 | isa = PBXGroup; 162 | children = ( 163 | 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */, 164 | 0CCC57259A12CC8B8C97129528E35AF1 /* Development Pods */, 165 | D210D550F4EA176C3123ED886F8F87F5 /* Frameworks */, 166 | 6857F847A13E6C2DC5458B5569E3D2B3 /* Products */, 167 | 3B8D213378905EA57E7FC81B41C38FFC /* Targets Support Files */, 168 | ); 169 | sourceTree = ""; 170 | }; 171 | D210D550F4EA176C3123ED886F8F87F5 /* Frameworks */ = { 172 | isa = PBXGroup; 173 | children = ( 174 | 578452D2E740E91742655AC8F1636D1F /* iOS */, 175 | ); 176 | name = Frameworks; 177 | sourceTree = ""; 178 | }; 179 | D83B3C7B42103E0E28A285482688194B /* Pods-PPTextfieldDemo */ = { 180 | isa = PBXGroup; 181 | children = ( 182 | A1186CC6F0A7B67B51377F088A0133E9 /* Pods-PPTextfieldDemo.modulemap */, 183 | D96B77D8D87F5DF31202A8FB57D6A8BE /* Pods-PPTextfieldDemo-acknowledgements.markdown */, 184 | BB6668740D137A42F6758754152F12B9 /* Pods-PPTextfieldDemo-acknowledgements.plist */, 185 | AC6D29DFE338D1A6535B976D93D4C2A1 /* Pods-PPTextfieldDemo-dummy.m */, 186 | 021A29DD04BFA19DCEB4921F5842D7C9 /* Pods-PPTextfieldDemo-frameworks.sh */, 187 | E93A3B82740AA3F55C20C7276CCD7206 /* Pods-PPTextfieldDemo-Info.plist */, 188 | 75F5DFF3881BC705F6E8A186F3677CBD /* Pods-PPTextfieldDemo-umbrella.h */, 189 | 1D8BB70AA0A3CC6BD45FBE1E85413F7B /* Pods-PPTextfieldDemo.debug.xcconfig */, 190 | 3082BCF508BB12A184C2DDC01CE6A1C0 /* Pods-PPTextfieldDemo.release.xcconfig */, 191 | ); 192 | name = "Pods-PPTextfieldDemo"; 193 | path = "Target Support Files/Pods-PPTextfieldDemo"; 194 | sourceTree = ""; 195 | }; 196 | /* End PBXGroup section */ 197 | 198 | /* Begin PBXHeadersBuildPhase section */ 199 | D75D48CA9CC666874081A6557106A8FA /* Headers */ = { 200 | isa = PBXHeadersBuildPhase; 201 | buildActionMask = 2147483647; 202 | files = ( 203 | 40546D7052374D5F6E71E586E4E518BF /* NSString+PPTextField.h in Headers */, 204 | 85377CC897A0B8080A2F95833B3F17DE /* PPTextField.h in Headers */, 205 | 430D0FDA615781C8CC0062F1E36A9FBD /* PPTextField-umbrella.h in Headers */, 206 | 046462A2AC25D4A73F8717F6F0B680B9 /* PPTextFieldAssistant.h in Headers */, 207 | ); 208 | runOnlyForDeploymentPostprocessing = 0; 209 | }; 210 | F5F8FB7B6D261E9A168A0C0AFE77E9BC /* Headers */ = { 211 | isa = PBXHeadersBuildPhase; 212 | buildActionMask = 2147483647; 213 | files = ( 214 | 6879D3872F79D963D0FF4959C855BC7C /* Pods-PPTextfieldDemo-umbrella.h in Headers */, 215 | ); 216 | runOnlyForDeploymentPostprocessing = 0; 217 | }; 218 | /* End PBXHeadersBuildPhase section */ 219 | 220 | /* Begin PBXNativeTarget section */ 221 | 4FF62F0E97C42DCF4638FFD794A66D77 /* Pods-PPTextfieldDemo */ = { 222 | isa = PBXNativeTarget; 223 | buildConfigurationList = 7C75F2D9908E944DE51E878C2956524B /* Build configuration list for PBXNativeTarget "Pods-PPTextfieldDemo" */; 224 | buildPhases = ( 225 | F5F8FB7B6D261E9A168A0C0AFE77E9BC /* Headers */, 226 | 55E372200BD41D41FE875F1E193F7234 /* Sources */, 227 | D29DACEC55E64C40713399B632D934FE /* Frameworks */, 228 | 5AA24BD8A6584A8179336FCD123D7119 /* Resources */, 229 | ); 230 | buildRules = ( 231 | ); 232 | dependencies = ( 233 | 25C0F9FAB3D89F507E9FA447619C9F8A /* PBXTargetDependency */, 234 | ); 235 | name = "Pods-PPTextfieldDemo"; 236 | productName = Pods_PPTextfieldDemo; 237 | productReference = D9D918670FE1769EDE84478A5C970DEA /* Pods-PPTextfieldDemo */; 238 | productType = "com.apple.product-type.framework"; 239 | }; 240 | 8ADF4CBE8EF374EB4609CF2CFC4DF394 /* PPTextField */ = { 241 | isa = PBXNativeTarget; 242 | buildConfigurationList = 7A57D2B12959D3E92CC19F9EB7EB2420 /* Build configuration list for PBXNativeTarget "PPTextField" */; 243 | buildPhases = ( 244 | D75D48CA9CC666874081A6557106A8FA /* Headers */, 245 | 3BC4BADFD37DC04C09927752EC6271F0 /* Sources */, 246 | EE436EC4F6D7EC38A226B7EA9CD76C5D /* Frameworks */, 247 | 74397CC8DE1BAC1D5080829FA4D057A1 /* Resources */, 248 | ); 249 | buildRules = ( 250 | ); 251 | dependencies = ( 252 | ); 253 | name = PPTextField; 254 | productName = PPTextField; 255 | productReference = 6C9EF99EC0E4448EB9F670C2AE670703 /* PPTextField */; 256 | productType = "com.apple.product-type.framework"; 257 | }; 258 | /* End PBXNativeTarget section */ 259 | 260 | /* Begin PBXProject section */ 261 | BFDFE7DC352907FC980B868725387E98 /* Project object */ = { 262 | isa = PBXProject; 263 | attributes = { 264 | LastSwiftUpdateCheck = 1300; 265 | LastUpgradeCheck = 1300; 266 | }; 267 | buildConfigurationList = 4821239608C13582E20E6DA73FD5F1F9 /* Build configuration list for PBXProject "Pods" */; 268 | compatibilityVersion = "Xcode 3.2"; 269 | developmentRegion = en; 270 | hasScannedForEncodings = 0; 271 | knownRegions = ( 272 | Base, 273 | en, 274 | ); 275 | mainGroup = CF1408CF629C7361332E53B88F7BD30C; 276 | productRefGroup = 6857F847A13E6C2DC5458B5569E3D2B3 /* Products */; 277 | projectDirPath = ""; 278 | projectRoot = ""; 279 | targets = ( 280 | 4FF62F0E97C42DCF4638FFD794A66D77 /* Pods-PPTextfieldDemo */, 281 | 8ADF4CBE8EF374EB4609CF2CFC4DF394 /* PPTextField */, 282 | ); 283 | }; 284 | /* End PBXProject section */ 285 | 286 | /* Begin PBXResourcesBuildPhase section */ 287 | 5AA24BD8A6584A8179336FCD123D7119 /* Resources */ = { 288 | isa = PBXResourcesBuildPhase; 289 | buildActionMask = 2147483647; 290 | files = ( 291 | ); 292 | runOnlyForDeploymentPostprocessing = 0; 293 | }; 294 | 74397CC8DE1BAC1D5080829FA4D057A1 /* Resources */ = { 295 | isa = PBXResourcesBuildPhase; 296 | buildActionMask = 2147483647; 297 | files = ( 298 | ); 299 | runOnlyForDeploymentPostprocessing = 0; 300 | }; 301 | /* End PBXResourcesBuildPhase section */ 302 | 303 | /* Begin PBXSourcesBuildPhase section */ 304 | 3BC4BADFD37DC04C09927752EC6271F0 /* Sources */ = { 305 | isa = PBXSourcesBuildPhase; 306 | buildActionMask = 2147483647; 307 | files = ( 308 | F4831C12E0AD445FE21C505114D2BACB /* NSString+PPTextField.m in Sources */, 309 | 11A8A0DF35A35157BC5010DC7BCCB060 /* PPTextField.m in Sources */, 310 | C436D727D216E917403172027A0255A5 /* PPTextField-dummy.m in Sources */, 311 | F38891CF9B10C9322524AC7C1BDE40C2 /* PPTextFieldAssistant.m in Sources */, 312 | ); 313 | runOnlyForDeploymentPostprocessing = 0; 314 | }; 315 | 55E372200BD41D41FE875F1E193F7234 /* Sources */ = { 316 | isa = PBXSourcesBuildPhase; 317 | buildActionMask = 2147483647; 318 | files = ( 319 | CDF72F93FCBF8B4A5D2709561C93F117 /* Pods-PPTextfieldDemo-dummy.m in Sources */, 320 | ); 321 | runOnlyForDeploymentPostprocessing = 0; 322 | }; 323 | /* End PBXSourcesBuildPhase section */ 324 | 325 | /* Begin PBXTargetDependency section */ 326 | 25C0F9FAB3D89F507E9FA447619C9F8A /* PBXTargetDependency */ = { 327 | isa = PBXTargetDependency; 328 | name = PPTextField; 329 | target = 8ADF4CBE8EF374EB4609CF2CFC4DF394 /* PPTextField */; 330 | targetProxy = 527928FE32E3FDB432D6FCAF6CDB7E0D /* PBXContainerItemProxy */; 331 | }; 332 | /* End PBXTargetDependency section */ 333 | 334 | /* Begin XCBuildConfiguration section */ 335 | 25AD9454612BF454A1E3DC4CD4FA8C6D /* Debug */ = { 336 | isa = XCBuildConfiguration; 337 | buildSettings = { 338 | ALWAYS_SEARCH_USER_PATHS = NO; 339 | CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; 340 | CLANG_ANALYZER_NONNULL = YES; 341 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 342 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 343 | CLANG_CXX_LIBRARY = "libc++"; 344 | CLANG_ENABLE_MODULES = YES; 345 | CLANG_ENABLE_OBJC_ARC = YES; 346 | CLANG_ENABLE_OBJC_WEAK = YES; 347 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 348 | CLANG_WARN_BOOL_CONVERSION = YES; 349 | CLANG_WARN_COMMA = YES; 350 | CLANG_WARN_CONSTANT_CONVERSION = YES; 351 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 352 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 353 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 354 | CLANG_WARN_EMPTY_BODY = YES; 355 | CLANG_WARN_ENUM_CONVERSION = YES; 356 | CLANG_WARN_INFINITE_RECURSION = YES; 357 | CLANG_WARN_INT_CONVERSION = YES; 358 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 359 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 360 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 361 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 362 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; 363 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 364 | CLANG_WARN_STRICT_PROTOTYPES = YES; 365 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 366 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 367 | CLANG_WARN_UNREACHABLE_CODE = YES; 368 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 369 | COPY_PHASE_STRIP = NO; 370 | DEBUG_INFORMATION_FORMAT = dwarf; 371 | ENABLE_STRICT_OBJC_MSGSEND = YES; 372 | ENABLE_TESTABILITY = YES; 373 | GCC_C_LANGUAGE_STANDARD = gnu11; 374 | GCC_DYNAMIC_NO_PIC = NO; 375 | GCC_NO_COMMON_BLOCKS = YES; 376 | GCC_OPTIMIZATION_LEVEL = 0; 377 | GCC_PREPROCESSOR_DEFINITIONS = ( 378 | "POD_CONFIGURATION_DEBUG=1", 379 | "DEBUG=1", 380 | "$(inherited)", 381 | ); 382 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 383 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 384 | GCC_WARN_UNDECLARED_SELECTOR = YES; 385 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 386 | GCC_WARN_UNUSED_FUNCTION = YES; 387 | GCC_WARN_UNUSED_VARIABLE = YES; 388 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 389 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; 390 | MTL_FAST_MATH = YES; 391 | ONLY_ACTIVE_ARCH = YES; 392 | PRODUCT_NAME = "$(TARGET_NAME)"; 393 | STRIP_INSTALLED_PRODUCT = NO; 394 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 395 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 396 | SWIFT_VERSION = 5.0; 397 | SYMROOT = "${SRCROOT}/../build"; 398 | }; 399 | name = Debug; 400 | }; 401 | 6FBC69FC81EDABA9DE1738C0C8FE0595 /* Debug */ = { 402 | isa = XCBuildConfiguration; 403 | baseConfigurationReference = 2A43F466BCF87AE20A6AC87697B79EB2 /* PPTextField.debug.xcconfig */; 404 | buildSettings = { 405 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 406 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 407 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; 408 | CURRENT_PROJECT_VERSION = 1; 409 | DEFINES_MODULE = YES; 410 | DYLIB_COMPATIBILITY_VERSION = 1; 411 | DYLIB_CURRENT_VERSION = 1; 412 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 413 | GCC_PREFIX_HEADER = "Target Support Files/PPTextField/PPTextField-prefix.pch"; 414 | INFOPLIST_FILE = "Target Support Files/PPTextField/PPTextField-Info.plist"; 415 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 416 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 417 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 418 | MODULEMAP_FILE = "Target Support Files/PPTextField/PPTextField.modulemap"; 419 | PRODUCT_MODULE_NAME = PPTextField; 420 | PRODUCT_NAME = PPTextField; 421 | SDKROOT = iphoneos; 422 | SKIP_INSTALL = YES; 423 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; 424 | TARGETED_DEVICE_FAMILY = "1,2"; 425 | VERSIONING_SYSTEM = "apple-generic"; 426 | VERSION_INFO_PREFIX = ""; 427 | }; 428 | name = Debug; 429 | }; 430 | 9214060F11249B5107DCE9791374E62F /* Release */ = { 431 | isa = XCBuildConfiguration; 432 | baseConfigurationReference = 67859076D57ECCD5D26311713F3AC2C1 /* PPTextField.release.xcconfig */; 433 | buildSettings = { 434 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 435 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 436 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; 437 | CURRENT_PROJECT_VERSION = 1; 438 | DEFINES_MODULE = YES; 439 | DYLIB_COMPATIBILITY_VERSION = 1; 440 | DYLIB_CURRENT_VERSION = 1; 441 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 442 | GCC_PREFIX_HEADER = "Target Support Files/PPTextField/PPTextField-prefix.pch"; 443 | INFOPLIST_FILE = "Target Support Files/PPTextField/PPTextField-Info.plist"; 444 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 445 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 446 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 447 | MODULEMAP_FILE = "Target Support Files/PPTextField/PPTextField.modulemap"; 448 | PRODUCT_MODULE_NAME = PPTextField; 449 | PRODUCT_NAME = PPTextField; 450 | SDKROOT = iphoneos; 451 | SKIP_INSTALL = YES; 452 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; 453 | TARGETED_DEVICE_FAMILY = "1,2"; 454 | VALIDATE_PRODUCT = YES; 455 | VERSIONING_SYSTEM = "apple-generic"; 456 | VERSION_INFO_PREFIX = ""; 457 | }; 458 | name = Release; 459 | }; 460 | AF9FA78A14AC5A187A9CAC7F17CBB72D /* Release */ = { 461 | isa = XCBuildConfiguration; 462 | baseConfigurationReference = 3082BCF508BB12A184C2DDC01CE6A1C0 /* Pods-PPTextfieldDemo.release.xcconfig */; 463 | buildSettings = { 464 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; 465 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 466 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 467 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; 468 | CURRENT_PROJECT_VERSION = 1; 469 | DEFINES_MODULE = YES; 470 | DYLIB_COMPATIBILITY_VERSION = 1; 471 | DYLIB_CURRENT_VERSION = 1; 472 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 473 | INFOPLIST_FILE = "Target Support Files/Pods-PPTextfieldDemo/Pods-PPTextfieldDemo-Info.plist"; 474 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 475 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 476 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 477 | MACH_O_TYPE = staticlib; 478 | MODULEMAP_FILE = "Target Support Files/Pods-PPTextfieldDemo/Pods-PPTextfieldDemo.modulemap"; 479 | OTHER_LDFLAGS = ""; 480 | OTHER_LIBTOOLFLAGS = ""; 481 | PODS_ROOT = "$(SRCROOT)"; 482 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; 483 | PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; 484 | SDKROOT = iphoneos; 485 | SKIP_INSTALL = YES; 486 | TARGETED_DEVICE_FAMILY = "1,2"; 487 | VALIDATE_PRODUCT = YES; 488 | VERSIONING_SYSTEM = "apple-generic"; 489 | VERSION_INFO_PREFIX = ""; 490 | }; 491 | name = Release; 492 | }; 493 | CA547D2C7E9A8A153DC2B27FBE00B112 /* Release */ = { 494 | isa = XCBuildConfiguration; 495 | buildSettings = { 496 | ALWAYS_SEARCH_USER_PATHS = NO; 497 | CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; 498 | CLANG_ANALYZER_NONNULL = YES; 499 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 500 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 501 | CLANG_CXX_LIBRARY = "libc++"; 502 | CLANG_ENABLE_MODULES = YES; 503 | CLANG_ENABLE_OBJC_ARC = YES; 504 | CLANG_ENABLE_OBJC_WEAK = YES; 505 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 506 | CLANG_WARN_BOOL_CONVERSION = YES; 507 | CLANG_WARN_COMMA = YES; 508 | CLANG_WARN_CONSTANT_CONVERSION = YES; 509 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 510 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 511 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 512 | CLANG_WARN_EMPTY_BODY = YES; 513 | CLANG_WARN_ENUM_CONVERSION = YES; 514 | CLANG_WARN_INFINITE_RECURSION = YES; 515 | CLANG_WARN_INT_CONVERSION = YES; 516 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 517 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 518 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 519 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 520 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; 521 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 522 | CLANG_WARN_STRICT_PROTOTYPES = YES; 523 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 524 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 525 | CLANG_WARN_UNREACHABLE_CODE = YES; 526 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 527 | COPY_PHASE_STRIP = NO; 528 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 529 | ENABLE_NS_ASSERTIONS = NO; 530 | ENABLE_STRICT_OBJC_MSGSEND = YES; 531 | GCC_C_LANGUAGE_STANDARD = gnu11; 532 | GCC_NO_COMMON_BLOCKS = YES; 533 | GCC_PREPROCESSOR_DEFINITIONS = ( 534 | "POD_CONFIGURATION_RELEASE=1", 535 | "$(inherited)", 536 | ); 537 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 538 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 539 | GCC_WARN_UNDECLARED_SELECTOR = YES; 540 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 541 | GCC_WARN_UNUSED_FUNCTION = YES; 542 | GCC_WARN_UNUSED_VARIABLE = YES; 543 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 544 | MTL_ENABLE_DEBUG_INFO = NO; 545 | MTL_FAST_MATH = YES; 546 | PRODUCT_NAME = "$(TARGET_NAME)"; 547 | STRIP_INSTALLED_PRODUCT = NO; 548 | SWIFT_COMPILATION_MODE = wholemodule; 549 | SWIFT_OPTIMIZATION_LEVEL = "-O"; 550 | SWIFT_VERSION = 5.0; 551 | SYMROOT = "${SRCROOT}/../build"; 552 | }; 553 | name = Release; 554 | }; 555 | CBB71AEDCB8EA1846DE9C3C2392DDC59 /* Debug */ = { 556 | isa = XCBuildConfiguration; 557 | baseConfigurationReference = 1D8BB70AA0A3CC6BD45FBE1E85413F7B /* Pods-PPTextfieldDemo.debug.xcconfig */; 558 | buildSettings = { 559 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; 560 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 561 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 562 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; 563 | CURRENT_PROJECT_VERSION = 1; 564 | DEFINES_MODULE = YES; 565 | DYLIB_COMPATIBILITY_VERSION = 1; 566 | DYLIB_CURRENT_VERSION = 1; 567 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 568 | INFOPLIST_FILE = "Target Support Files/Pods-PPTextfieldDemo/Pods-PPTextfieldDemo-Info.plist"; 569 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 570 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 571 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 572 | MACH_O_TYPE = staticlib; 573 | MODULEMAP_FILE = "Target Support Files/Pods-PPTextfieldDemo/Pods-PPTextfieldDemo.modulemap"; 574 | OTHER_LDFLAGS = ""; 575 | OTHER_LIBTOOLFLAGS = ""; 576 | PODS_ROOT = "$(SRCROOT)"; 577 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; 578 | PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; 579 | SDKROOT = iphoneos; 580 | SKIP_INSTALL = YES; 581 | TARGETED_DEVICE_FAMILY = "1,2"; 582 | VERSIONING_SYSTEM = "apple-generic"; 583 | VERSION_INFO_PREFIX = ""; 584 | }; 585 | name = Debug; 586 | }; 587 | /* End XCBuildConfiguration section */ 588 | 589 | /* Begin XCConfigurationList section */ 590 | 4821239608C13582E20E6DA73FD5F1F9 /* Build configuration list for PBXProject "Pods" */ = { 591 | isa = XCConfigurationList; 592 | buildConfigurations = ( 593 | 25AD9454612BF454A1E3DC4CD4FA8C6D /* Debug */, 594 | CA547D2C7E9A8A153DC2B27FBE00B112 /* Release */, 595 | ); 596 | defaultConfigurationIsVisible = 0; 597 | defaultConfigurationName = Release; 598 | }; 599 | 7A57D2B12959D3E92CC19F9EB7EB2420 /* Build configuration list for PBXNativeTarget "PPTextField" */ = { 600 | isa = XCConfigurationList; 601 | buildConfigurations = ( 602 | 6FBC69FC81EDABA9DE1738C0C8FE0595 /* Debug */, 603 | 9214060F11249B5107DCE9791374E62F /* Release */, 604 | ); 605 | defaultConfigurationIsVisible = 0; 606 | defaultConfigurationName = Release; 607 | }; 608 | 7C75F2D9908E944DE51E878C2956524B /* Build configuration list for PBXNativeTarget "Pods-PPTextfieldDemo" */ = { 609 | isa = XCConfigurationList; 610 | buildConfigurations = ( 611 | CBB71AEDCB8EA1846DE9C3C2392DDC59 /* Debug */, 612 | AF9FA78A14AC5A187A9CAC7F17CBB72D /* Release */, 613 | ); 614 | defaultConfigurationIsVisible = 0; 615 | defaultConfigurationName = Release; 616 | }; 617 | /* End XCConfigurationList section */ 618 | }; 619 | rootObject = BFDFE7DC352907FC980B868725387E98 /* Project object */; 620 | } 621 | -------------------------------------------------------------------------------- /Pods/Pods.xcodeproj/xcuserdata/admin.xcuserdatad/xcschemes/PPTextField.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 43 | 44 | 50 | 51 | 53 | 54 | 57 | 58 | 59 | -------------------------------------------------------------------------------- /Pods/Pods.xcodeproj/xcuserdata/admin.xcuserdatad/xcschemes/Pods-PPTextfieldDemo.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 43 | 44 | 50 | 51 | 53 | 54 | 57 | 58 | 59 | -------------------------------------------------------------------------------- /Pods/Pods.xcodeproj/xcuserdata/admin.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | PPTextField.xcscheme 8 | 9 | isShown 10 | 11 | 12 | Pods-PPTextfieldDemo.xcscheme 13 | 14 | isShown 15 | 16 | 17 | 18 | SuppressBuildableAutocreation 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /Pods/Pods.xcodeproj/xcuserdata/peijianbo.xcuserdatad/xcschemes/PPTextField.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 43 | 44 | 50 | 51 | 53 | 54 | 57 | 58 | 59 | -------------------------------------------------------------------------------- /Pods/Pods.xcodeproj/xcuserdata/peijianbo.xcuserdatad/xcschemes/Pods-PPTextfieldDemo.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 43 | 44 | 50 | 51 | 53 | 54 | 57 | 58 | 59 | -------------------------------------------------------------------------------- /Pods/Pods.xcodeproj/xcuserdata/peijianbo.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | PPTextField.xcscheme 8 | 9 | isShown 10 | 11 | 12 | Pods-PPTextfieldDemo.xcscheme 13 | 14 | isShown 15 | 16 | 17 | 18 | SuppressBuildableAutocreation 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /Pods/Target Support Files/PPTextField/PPTextField-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | ${PODS_DEVELOPMENT_LANGUAGE} 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | ${PRODUCT_BUNDLE_IDENTIFIER} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 0.0.2 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Pods/Target Support Files/PPTextField/PPTextField-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_PPTextField : NSObject 3 | @end 4 | @implementation PodsDummy_PPTextField 5 | @end 6 | -------------------------------------------------------------------------------- /Pods/Target Support Files/PPTextField/PPTextField-prefix.pch: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | -------------------------------------------------------------------------------- /Pods/Target Support Files/PPTextField/PPTextField-umbrella.h: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | #import "PPTextField.h" 14 | 15 | FOUNDATION_EXPORT double PPTextFieldVersionNumber; 16 | FOUNDATION_EXPORT const unsigned char PPTextFieldVersionString[]; 17 | 18 | -------------------------------------------------------------------------------- /Pods/Target Support Files/PPTextField/PPTextField.debug.xcconfig: -------------------------------------------------------------------------------- 1 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO 2 | CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/PPTextField 3 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 4 | PODS_BUILD_DIR = ${BUILD_DIR} 5 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 6 | PODS_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE} 7 | PODS_ROOT = ${SRCROOT} 8 | PODS_TARGET_SRCROOT = ${PODS_ROOT}/.. 9 | PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates 10 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} 11 | SKIP_INSTALL = YES 12 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES 13 | -------------------------------------------------------------------------------- /Pods/Target Support Files/PPTextField/PPTextField.modulemap: -------------------------------------------------------------------------------- 1 | framework module PPTextField { 2 | umbrella header "PPTextField-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Pods/Target Support Files/PPTextField/PPTextField.release.xcconfig: -------------------------------------------------------------------------------- 1 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO 2 | CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/PPTextField 3 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 4 | PODS_BUILD_DIR = ${BUILD_DIR} 5 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 6 | PODS_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE} 7 | PODS_ROOT = ${SRCROOT} 8 | PODS_TARGET_SRCROOT = ${PODS_ROOT}/.. 9 | PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates 10 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} 11 | SKIP_INSTALL = YES 12 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES 13 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-PPTextfieldDemo/Pods-PPTextfieldDemo-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | ${PODS_DEVELOPMENT_LANGUAGE} 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | ${PRODUCT_BUNDLE_IDENTIFIER} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-PPTextfieldDemo/Pods-PPTextfieldDemo-acknowledgements.markdown: -------------------------------------------------------------------------------- 1 | # Acknowledgements 2 | This application makes use of the following third party libraries: 3 | 4 | ## PPTextField 5 | 6 | Copyright PPAbner 2016 7 | 8 | Generated by CocoaPods - https://cocoapods.org 9 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-PPTextfieldDemo/Pods-PPTextfieldDemo-acknowledgements.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreferenceSpecifiers 6 | 7 | 8 | FooterText 9 | This application makes use of the following third party libraries: 10 | Title 11 | Acknowledgements 12 | Type 13 | PSGroupSpecifier 14 | 15 | 16 | FooterText 17 | Copyright PPAbner 2016 18 | 19 | License 20 | MIT 21 | Title 22 | PPTextField 23 | Type 24 | PSGroupSpecifier 25 | 26 | 27 | FooterText 28 | Generated by CocoaPods - https://cocoapods.org 29 | Title 30 | 31 | Type 32 | PSGroupSpecifier 33 | 34 | 35 | StringsTable 36 | Acknowledgements 37 | Title 38 | Acknowledgements 39 | 40 | 41 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-PPTextfieldDemo/Pods-PPTextfieldDemo-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_Pods_PPTextfieldDemo : NSObject 3 | @end 4 | @implementation PodsDummy_Pods_PPTextfieldDemo 5 | @end 6 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-PPTextfieldDemo/Pods-PPTextfieldDemo-frameworks.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | set -e 3 | set -u 4 | set -o pipefail 5 | 6 | function on_error { 7 | echo "$(realpath -mq "${0}"):$1: error: Unexpected failure" 8 | } 9 | trap 'on_error $LINENO' ERR 10 | 11 | if [ -z ${FRAMEWORKS_FOLDER_PATH+x} ]; then 12 | # If FRAMEWORKS_FOLDER_PATH is not set, then there's nowhere for us to copy 13 | # frameworks to, so exit 0 (signalling the script phase was successful). 14 | exit 0 15 | fi 16 | 17 | echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 18 | mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 19 | 20 | COCOAPODS_PARALLEL_CODE_SIGN="${COCOAPODS_PARALLEL_CODE_SIGN:-false}" 21 | SWIFT_STDLIB_PATH="${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" 22 | BCSYMBOLMAP_DIR="BCSymbolMaps" 23 | 24 | 25 | # This protects against multiple targets copying the same framework dependency at the same time. The solution 26 | # was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html 27 | RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????") 28 | 29 | # Copies and strips a vendored framework 30 | install_framework() 31 | { 32 | if [ -r "${BUILT_PRODUCTS_DIR}/$1" ]; then 33 | local source="${BUILT_PRODUCTS_DIR}/$1" 34 | elif [ -r "${BUILT_PRODUCTS_DIR}/$(basename "$1")" ]; then 35 | local source="${BUILT_PRODUCTS_DIR}/$(basename "$1")" 36 | elif [ -r "$1" ]; then 37 | local source="$1" 38 | fi 39 | 40 | local destination="${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 41 | 42 | if [ -L "${source}" ]; then 43 | echo "Symlinked..." 44 | source="$(readlink -f "${source}")" 45 | fi 46 | 47 | if [ -d "${source}/${BCSYMBOLMAP_DIR}" ]; then 48 | # Locate and install any .bcsymbolmaps if present, and remove them from the .framework before the framework is copied 49 | find "${source}/${BCSYMBOLMAP_DIR}" -name "*.bcsymbolmap"|while read f; do 50 | echo "Installing $f" 51 | install_bcsymbolmap "$f" "$destination" 52 | rm "$f" 53 | done 54 | rmdir "${source}/${BCSYMBOLMAP_DIR}" 55 | fi 56 | 57 | # Use filter instead of exclude so missing patterns don't throw errors. 58 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${destination}\"" 59 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${destination}" 60 | 61 | local basename 62 | basename="$(basename -s .framework "$1")" 63 | binary="${destination}/${basename}.framework/${basename}" 64 | 65 | if ! [ -r "$binary" ]; then 66 | binary="${destination}/${basename}" 67 | elif [ -L "${binary}" ]; then 68 | echo "Destination binary is symlinked..." 69 | dirname="$(dirname "${binary}")" 70 | binary="${dirname}/$(readlink "${binary}")" 71 | fi 72 | 73 | # Strip invalid architectures so "fat" simulator / device frameworks work on device 74 | if [[ "$(file "$binary")" == *"dynamically linked shared library"* ]]; then 75 | strip_invalid_archs "$binary" 76 | fi 77 | 78 | # Resign the code if required by the build settings to avoid unstable apps 79 | code_sign_if_enabled "${destination}/$(basename "$1")" 80 | 81 | # Embed linked Swift runtime libraries. No longer necessary as of Xcode 7. 82 | if [ "${XCODE_VERSION_MAJOR}" -lt 7 ]; then 83 | local swift_runtime_libs 84 | swift_runtime_libs=$(xcrun otool -LX "$binary" | grep --color=never @rpath/libswift | sed -E s/@rpath\\/\(.+dylib\).*/\\1/g | uniq -u) 85 | for lib in $swift_runtime_libs; do 86 | echo "rsync -auv \"${SWIFT_STDLIB_PATH}/${lib}\" \"${destination}\"" 87 | rsync -auv "${SWIFT_STDLIB_PATH}/${lib}" "${destination}" 88 | code_sign_if_enabled "${destination}/${lib}" 89 | done 90 | fi 91 | } 92 | # Copies and strips a vendored dSYM 93 | install_dsym() { 94 | local source="$1" 95 | warn_missing_arch=${2:-true} 96 | if [ -r "$source" ]; then 97 | # Copy the dSYM into the targets temp dir. 98 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${DERIVED_FILES_DIR}\"" 99 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${DERIVED_FILES_DIR}" 100 | 101 | local basename 102 | basename="$(basename -s .dSYM "$source")" 103 | binary_name="$(ls "$source/Contents/Resources/DWARF")" 104 | binary="${DERIVED_FILES_DIR}/${basename}.dSYM/Contents/Resources/DWARF/${binary_name}" 105 | 106 | # Strip invalid architectures from the dSYM. 107 | if [[ "$(file "$binary")" == *"Mach-O "*"dSYM companion"* ]]; then 108 | strip_invalid_archs "$binary" "$warn_missing_arch" 109 | fi 110 | if [[ $STRIP_BINARY_RETVAL == 0 ]]; then 111 | # Move the stripped file into its final destination. 112 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${DERIVED_FILES_DIR}/${basename}.framework.dSYM\" \"${DWARF_DSYM_FOLDER_PATH}\"" 113 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${DERIVED_FILES_DIR}/${basename}.dSYM" "${DWARF_DSYM_FOLDER_PATH}" 114 | else 115 | # The dSYM was not stripped at all, in this case touch a fake folder so the input/output paths from Xcode do not reexecute this script because the file is missing. 116 | mkdir -p "${DWARF_DSYM_FOLDER_PATH}" 117 | touch "${DWARF_DSYM_FOLDER_PATH}/${basename}.dSYM" 118 | fi 119 | fi 120 | } 121 | 122 | # Used as a return value for each invocation of `strip_invalid_archs` function. 123 | STRIP_BINARY_RETVAL=0 124 | 125 | # Strip invalid architectures 126 | strip_invalid_archs() { 127 | binary="$1" 128 | warn_missing_arch=${2:-true} 129 | # Get architectures for current target binary 130 | binary_archs="$(lipo -info "$binary" | rev | cut -d ':' -f1 | awk '{$1=$1;print}' | rev)" 131 | # Intersect them with the architectures we are building for 132 | intersected_archs="$(echo ${ARCHS[@]} ${binary_archs[@]} | tr ' ' '\n' | sort | uniq -d)" 133 | # If there are no archs supported by this binary then warn the user 134 | if [[ -z "$intersected_archs" ]]; then 135 | if [[ "$warn_missing_arch" == "true" ]]; then 136 | echo "warning: [CP] Vendored binary '$binary' contains architectures ($binary_archs) none of which match the current build architectures ($ARCHS)." 137 | fi 138 | STRIP_BINARY_RETVAL=1 139 | return 140 | fi 141 | stripped="" 142 | for arch in $binary_archs; do 143 | if ! [[ "${ARCHS}" == *"$arch"* ]]; then 144 | # Strip non-valid architectures in-place 145 | lipo -remove "$arch" -output "$binary" "$binary" 146 | stripped="$stripped $arch" 147 | fi 148 | done 149 | if [[ "$stripped" ]]; then 150 | echo "Stripped $binary of architectures:$stripped" 151 | fi 152 | STRIP_BINARY_RETVAL=0 153 | } 154 | 155 | # Copies the bcsymbolmap files of a vendored framework 156 | install_bcsymbolmap() { 157 | local bcsymbolmap_path="$1" 158 | local destination="${BUILT_PRODUCTS_DIR}" 159 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${bcsymbolmap_path}" "${destination}"" 160 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${bcsymbolmap_path}" "${destination}" 161 | } 162 | 163 | # Signs a framework with the provided identity 164 | code_sign_if_enabled() { 165 | if [ -n "${EXPANDED_CODE_SIGN_IDENTITY:-}" -a "${CODE_SIGNING_REQUIRED:-}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then 166 | # Use the current code_sign_identity 167 | echo "Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}" 168 | local code_sign_cmd="/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS:-} --preserve-metadata=identifier,entitlements '$1'" 169 | 170 | if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then 171 | code_sign_cmd="$code_sign_cmd &" 172 | fi 173 | echo "$code_sign_cmd" 174 | eval "$code_sign_cmd" 175 | fi 176 | } 177 | 178 | if [[ "$CONFIGURATION" == "Debug" ]]; then 179 | install_framework "${BUILT_PRODUCTS_DIR}/PPTextField/PPTextField.framework" 180 | fi 181 | if [[ "$CONFIGURATION" == "Release" ]]; then 182 | install_framework "${BUILT_PRODUCTS_DIR}/PPTextField/PPTextField.framework" 183 | fi 184 | if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then 185 | wait 186 | fi 187 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-PPTextfieldDemo/Pods-PPTextfieldDemo-umbrella.h: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | 14 | FOUNDATION_EXPORT double Pods_PPTextfieldDemoVersionNumber; 15 | FOUNDATION_EXPORT const unsigned char Pods_PPTextfieldDemoVersionString[]; 16 | 17 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-PPTextfieldDemo/Pods-PPTextfieldDemo.debug.xcconfig: -------------------------------------------------------------------------------- 1 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO 2 | FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/PPTextField" 3 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 4 | HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/PPTextField/PPTextField.framework/Headers" 5 | LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' 6 | OTHER_LDFLAGS = $(inherited) -framework "PPTextField" 7 | PODS_BUILD_DIR = ${BUILD_DIR} 8 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 9 | PODS_PODFILE_DIR_PATH = ${SRCROOT}/. 10 | PODS_ROOT = ${SRCROOT}/Pods 11 | PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates 12 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES 13 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-PPTextfieldDemo/Pods-PPTextfieldDemo.modulemap: -------------------------------------------------------------------------------- 1 | framework module Pods_PPTextfieldDemo { 2 | umbrella header "Pods-PPTextfieldDemo-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-PPTextfieldDemo/Pods-PPTextfieldDemo.release.xcconfig: -------------------------------------------------------------------------------- 1 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO 2 | FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/PPTextField" 3 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 4 | HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/PPTextField/PPTextField.framework/Headers" 5 | LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' 6 | OTHER_LDFLAGS = $(inherited) -framework "PPTextField" 7 | PODS_BUILD_DIR = ${BUILD_DIR} 8 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 9 | PODS_PODFILE_DIR_PATH = ${SRCROOT}/. 10 | PODS_ROOT = ${SRCROOT}/Pods 11 | PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates 12 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES 13 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ### PPTextField来由: 2 | > 做项目,经常遇到输入内容的各种限制,说来说去,无非都是UITextField的功能,但是各种限制,不同公司不同要求,不同功能不同要求等等,如果每一次都写一大堆的tf代理方法,配合各种限制、截取,未免有些太过于麻烦,可能自己比较懒不想每次都写(其实跟自己做的项目有关:比如整个界面就是添加商品:**商品名称**`(不能输入特殊字符)`、**商品编码**`(纯数字,必须13位)`、**商品价格**`(第一个字符不能为0,一个小数点,保留2位等)` **and so on** !),我就想着怎么用一个属性就可以做到,于是在去年10月份写了一个初步的,昨天(`2017-03-18`)刚好最近项目遇到的比较多,自己就又重新整理优化下,于是有了它的更好的成品。 3 | > >各种限制,可以灵活组合,如有问题,欢迎提issue! 4 | #### PPTextField属性S:`(个人觉得表格更好)` 5 | |    属性名   | 属性介绍 |   使用注意   | 6 | | :-------: | :--- |:----: | 7 | | **isClearWhileEditing** | 【1-001】是否当编辑的时候显示clearButton 默认为yes | `无` | 8 | | **isSpecialCharacter**     | 【1-002】是否可以输入特殊字符 (默认YES,即可以输入) |  `特殊字符:除数字、字母、汉字外的字符`|   9 | | **canInputCharacters** | 【1-003】可以输入的字符串数组 【控制不可以输入特殊字符,但是某个或者某些特殊字符又是可以输入的】 | `☠☠只有当isSpecialCharacter为NO时,有效☠☠ ` | 10 | | **canotInputCharacters** | 【1-004】不可以输入的字符串数组 | `全局限制,没有前提条件 ` | 11 | | **isOnlyNumber**     | 【1-005】是否只能输入数字,默认为NO |   `无 `     |   12 | | **maxNumberCount** | 【1-006】最多纯数字个数,比如手机11位,商品条码13位等 | `☠☠设置了maxNumberCount,就默认 isOnlyNumber = YES☠☠ ` | 13 | | **isPhoneNumber** | 【1-007】是否是手机号码 | ` ☠☠设置了isPhoneNumber,就默认 isOnlyNumber = YES && maxNumberCount == 11 ,此时maxTextLength和maxCharactersLength无效☠☠` | 14 | | **isPrice** | 【1-008】价格(只有一个".",小数点后保留2位小数) ◥◤首位输入0,第二位不是.,会自动补充.◥◤ | ` ☠☠如果isPrice==YES,则isOnlyNumber=No,即使isOnlyNumber设置为YES也没用,此时canotInputCharacters无效☠☠` | 15 | | **isPriceHeaderPoint** | 【1-009】价格是否允许以“.”开头,默认是不允许,如果允许,请设置为YES | ` ☠☠设置了isPriceHeaderPoint,则isPrice = YES,此时canotInputCharacters无效☠☠` | 16 | | **isPassword**     | 【1-010】是不是密码 (默认只能字母和数字) |   `无 `     |   17 | | **canInputPasswords** | 【1-011】密码可以输入的字符串数组 【控制不可以输入特殊字符,但是某个或者某些特殊字符又是可以输入的】 | `☠☠只有当isPassword为YES时,有效 ☠☠ ` | 18 | | **maxTextLength**     | 【1-012】tf.text最大长度(不考虑中英文) |   `无 `     |   19 | | **maxCharactersLength**     | 【1-013】字符串最大长度(一个中文2个字符,一个英文1个字符【中文输入法下的都算中文】) |   `无 `     |   20 | | **ppTextfieldTextChangedBlock**     | 【2-001】文本框字符变动,回调block【实时监测tf的文字】 |   ` block回调`     |   21 | | **ppTextFieldEndEditBlock** | 【2-002】结束编辑or失去第一响应,回调block | `block回调 ` | 22 | | **ppTextFieldReturnTypeBlock** | 【2-003】键盘右下角returnType点击 | `block回调 ` | 23 | 24 | > 稍后会更新demo示例!!! 25 | 26 | --------------------------------------------------------------------------------