├── CoreTFManagerVC ├── Cut │ ├── 1.png │ ├── 2.png │ └── 3.png ├── CoreTFManagerVC │ ├── Lib │ │ ├── CoreTFManagerVC.bundle │ │ │ ├── left.png │ │ │ └── right.png │ │ ├── CoreTFKeyBoardToolBarView.h │ │ ├── TFModel.h │ │ ├── TFModel.m │ │ ├── CoreTFKeyBoardToolBarView.m │ │ └── CoreTFKeyBoardToolBarView.xib │ ├── CoreTFManagerVC.h │ └── CoreTFManagerVC.m ├── HomeTVC.h ├── NormalViewVC.h ├── ScrollViewVC.h ├── AppDelegate.h ├── main.m ├── Images.xcassets │ └── AppIcon.appiconset │ │ └── Contents.json ├── Info.plist ├── HomeTVC.m ├── NormalViewVC.m ├── AppDelegate.m ├── ScrollViewVC.m ├── Base.lproj │ ├── Main.storyboard │ └── LaunchScreen.xib ├── NormalViewVC.xib └── ScrollViewVC.xib ├── CoreTFManagerVC.xcodeproj ├── xcuserdata │ ├── huaxi100.xcuserdatad │ │ ├── xcdebugger │ │ │ └── Breakpoints_v2.xcbkptlist │ │ └── xcschemes │ │ │ ├── xcschememanagement.plist │ │ │ └── CoreTFManagerVC.xcscheme │ ├── muxi.xcuserdatad │ │ └── xcschemes │ │ │ ├── xcschememanagement.plist │ │ │ └── CoreTFManagerVC.xcscheme │ └── weixiang.xcuserdatad │ │ └── xcschemes │ │ ├── xcschememanagement.plist │ │ └── CoreTFManagerVC.xcscheme ├── project.xcworkspace │ ├── contents.xcworkspacedata │ ├── xcuserdata │ │ ├── huaxi100.xcuserdatad │ │ │ └── UserInterfaceState.xcuserstate │ │ └── weixiang.xcuserdatad │ │ │ └── UserInterfaceState.xcuserstate │ └── xcshareddata │ │ └── CoreTFManagerVC.xccheckout └── project.pbxproj ├── CoreTFManagerVCTests ├── Info.plist └── CoreTFManagerVCTests.m └── README.md /CoreTFManagerVC/Cut/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CharlinFeng/CoreTFManagerVC/HEAD/CoreTFManagerVC/Cut/1.png -------------------------------------------------------------------------------- /CoreTFManagerVC/Cut/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CharlinFeng/CoreTFManagerVC/HEAD/CoreTFManagerVC/Cut/2.png -------------------------------------------------------------------------------- /CoreTFManagerVC/Cut/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CharlinFeng/CoreTFManagerVC/HEAD/CoreTFManagerVC/Cut/3.png -------------------------------------------------------------------------------- /CoreTFManagerVC/CoreTFManagerVC/Lib/CoreTFManagerVC.bundle/left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CharlinFeng/CoreTFManagerVC/HEAD/CoreTFManagerVC/CoreTFManagerVC/Lib/CoreTFManagerVC.bundle/left.png -------------------------------------------------------------------------------- /CoreTFManagerVC/CoreTFManagerVC/Lib/CoreTFManagerVC.bundle/right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CharlinFeng/CoreTFManagerVC/HEAD/CoreTFManagerVC/CoreTFManagerVC/Lib/CoreTFManagerVC.bundle/right.png -------------------------------------------------------------------------------- /CoreTFManagerVC.xcodeproj/xcuserdata/huaxi100.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | -------------------------------------------------------------------------------- /CoreTFManagerVC.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /CoreTFManagerVC.xcodeproj/project.xcworkspace/xcuserdata/huaxi100.xcuserdatad/UserInterfaceState.xcuserstate: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CharlinFeng/CoreTFManagerVC/HEAD/CoreTFManagerVC.xcodeproj/project.xcworkspace/xcuserdata/huaxi100.xcuserdatad/UserInterfaceState.xcuserstate -------------------------------------------------------------------------------- /CoreTFManagerVC.xcodeproj/project.xcworkspace/xcuserdata/weixiang.xcuserdatad/UserInterfaceState.xcuserstate: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CharlinFeng/CoreTFManagerVC/HEAD/CoreTFManagerVC.xcodeproj/project.xcworkspace/xcuserdata/weixiang.xcuserdatad/UserInterfaceState.xcuserstate -------------------------------------------------------------------------------- /CoreTFManagerVC/HomeTVC.h: -------------------------------------------------------------------------------- 1 | // 2 | // HomeTVC.h 3 | // CoreTFManagerVC 4 | // 5 | // Created by 沐汐 on 15-3-5. 6 | // Copyright (c) 2015年 沐汐. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface HomeTVC : UITableViewController 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /CoreTFManagerVC/NormalViewVC.h: -------------------------------------------------------------------------------- 1 | // 2 | // NormalViewVC.h 3 | // CoreTFManagerVC 4 | // 5 | // Created by 沐汐 on 15-3-5. 6 | // Copyright (c) 2015年 沐汐. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface NormalViewVC : UIViewController 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /CoreTFManagerVC/ScrollViewVC.h: -------------------------------------------------------------------------------- 1 | // 2 | // ScrollViewVC.h 3 | // CoreTFManagerVC 4 | // 5 | // Created by muxi on 15/3/6. 6 | // Copyright (c) 2015年 沐汐. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface ScrollViewVC : UIViewController 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /CoreTFManagerVC/AppDelegate.h: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.h 3 | // CoreTFManagerVC 4 | // 5 | // Created by 沐汐 on 15-3-5. 6 | // Copyright (c) 2015年 沐汐. 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 | -------------------------------------------------------------------------------- /CoreTFManagerVC/main.m: -------------------------------------------------------------------------------- 1 | // 2 | // main.m 3 | // CoreTFManagerVC 4 | // 5 | // Created by 沐汐 on 15-3-5. 6 | // Copyright (c) 2015年 沐汐. 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 | -------------------------------------------------------------------------------- /CoreTFManagerVC.xcodeproj/xcuserdata/muxi.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | CoreTFManagerVC.xcscheme 8 | 9 | orderHint 10 | 0 11 | 12 | 13 | SuppressBuildableAutocreation 14 | 15 | D6D239531AA89BDF003B999A 16 | 17 | primary 18 | 19 | 20 | D6D2396C1AA89BDF003B999A 21 | 22 | primary 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /CoreTFManagerVC.xcodeproj/xcuserdata/huaxi100.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | CoreTFManagerVC.xcscheme 8 | 9 | orderHint 10 | 0 11 | 12 | 13 | SuppressBuildableAutocreation 14 | 15 | D6D239531AA89BDF003B999A 16 | 17 | primary 18 | 19 | 20 | D6D2396C1AA89BDF003B999A 21 | 22 | primary 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /CoreTFManagerVC.xcodeproj/xcuserdata/weixiang.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | CoreTFManagerVC.xcscheme 8 | 9 | orderHint 10 | 0 11 | 12 | 13 | SuppressBuildableAutocreation 14 | 15 | D6D239531AA89BDF003B999A 16 | 17 | primary 18 | 19 | 20 | D6D2396C1AA89BDF003B999A 21 | 22 | primary 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /CoreTFManagerVC/Images.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 | } -------------------------------------------------------------------------------- /CoreTFManagerVCTests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | -.$(PRODUCT_NAME:rfc1034identifier) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | BNDL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | 24 | 25 | -------------------------------------------------------------------------------- /CoreTFManagerVC/CoreTFManagerVC/CoreTFManagerVC.h: -------------------------------------------------------------------------------- 1 | // 2 | // CoreTFManagerVC.h 3 | // CoreTFManagerVC 4 | // 5 | // Created by 沐汐 on 15-3-5. 6 | // Copyright (c) 2015年 沐汐. All rights reserved. 7 | // 8 | // 键盘管理者 9 | // 生命周期模仿百度地图,这样做很有好处。 10 | // 11 | 12 | 13 | #import 14 | #import "TFModel.h" 15 | 16 | @interface CoreTFManagerVC : UIViewController 17 | 18 | 19 | /** 20 | * 安装 21 | * 22 | * @param vc 需要安装的控制器 23 | * @param scrollView textField所在的scrollView 24 | * @param tfModels textField包装模型数组 25 | */ 26 | +(void)installManagerForVC:(UIViewController *)vc scrollView:(UIScrollView *)scrollView tfModels:(NSArray *(^)())tfModels; 27 | 28 | 29 | /** 30 | * 卸载 31 | */ 32 | +(void)uninstallManagerForVC:(UIViewController *)vc; 33 | 34 | 35 | /** 36 | * 空值校验 37 | * 38 | * @param tfModels textField包装模型数组 39 | * @return 如果没有textField存在空值,返回nil;如果有textField为空,则返回对应的TFModel模型 40 | */ 41 | +(TFModel *)checkNullValueInTFModels:(NSArray *)tfModels; 42 | 43 | 44 | @end 45 | -------------------------------------------------------------------------------- /CoreTFManagerVC/CoreTFManagerVC/Lib/CoreTFKeyBoardToolBarView.h: -------------------------------------------------------------------------------- 1 | // 2 | // CoreTFKeyBoardToolBarView.h 3 | // CoreTextFieldManager 4 | // 5 | // Created by muxi on 15/2/15. 6 | // Copyright (c) 2015年 muxi. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface CoreTFKeyBoardToolBarView : UIView 12 | 13 | @property (nonatomic,copy) void(^preClickBlock)(); //上一个 14 | 15 | @property (nonatomic,copy) void(^nextClickBlock)(); //下一个 16 | 17 | @property (nonatomic,copy) void(^doneClickBlock)(); //完成 18 | 19 | @property (nonatomic,assign) BOOL isFirst; //到达第一个按钮 20 | 21 | @property (nonatomic,assign) BOOL isLast; //到达最后一个按钮 22 | 23 | @property (nonatomic,copy) NSString *msg; 24 | 25 | @property (nonatomic,assign) BOOL hideToggleBtnsForSingleTF; 26 | 27 | +(instancetype)keyBoardToolBarView; 28 | 29 | 30 | 31 | @end 32 | -------------------------------------------------------------------------------- /CoreTFManagerVCTests/CoreTFManagerVCTests.m: -------------------------------------------------------------------------------- 1 | // 2 | // CoreTFManagerVCTests.m 3 | // CoreTFManagerVCTests 4 | // 5 | // Created by 沐汐 on 15-3-5. 6 | // Copyright (c) 2015年 沐汐. All rights reserved. 7 | // 8 | 9 | #import 10 | #import 11 | 12 | @interface CoreTFManagerVCTests : XCTestCase 13 | 14 | @end 15 | 16 | @implementation CoreTFManagerVCTests 17 | 18 | - (void)setUp { 19 | [super setUp]; 20 | // Put setup code here. This method is called before the invocation of each test method in the class. 21 | } 22 | 23 | - (void)tearDown { 24 | // Put teardown code here. This method is called after the invocation of each test method in the class. 25 | [super tearDown]; 26 | } 27 | 28 | - (void)testExample { 29 | // This is an example of a functional test case. 30 | XCTAssert(YES, @"Pass"); 31 | } 32 | 33 | - (void)testPerformanceExample { 34 | // This is an example of a performance test case. 35 | [self measureBlock:^{ 36 | // Put the code you want to measure the time of here. 37 | }]; 38 | } 39 | 40 | @end 41 | -------------------------------------------------------------------------------- /CoreTFManagerVC/CoreTFManagerVC/Lib/TFModel.h: -------------------------------------------------------------------------------- 1 | // 2 | // TFModel.h 3 | // CoreTFManagerVC 4 | // 5 | // Created by 沐汐 on 15-3-5. 6 | // Copyright (c) 2015年 沐汐. All rights reserved. 7 | // 8 | 9 | #import 10 | #import 11 | 12 | @interface TFModel : NSObject 13 | 14 | //textField 15 | @property (nonatomic,strong) UITextField *textField; 16 | 17 | //textField在window中的frame 18 | @property (nonatomic,assign) CGRect textFiledWindowFrame; 19 | 20 | //textField在scrollView中的frame 21 | @property (nonatomic,assign) CGRect textFieldScrollFrame; 22 | 23 | //底部需要增加的距离 24 | @property (nonatomic,assign) CGFloat insetBottom; 25 | 26 | //inputView 27 | @property (nonatomic,strong) UIView *inputView; 28 | 29 | 30 | /** 31 | * 包装textField 32 | * 33 | * @param textField textField 34 | * @param insetBottom textField底部需要增加的距离 35 | * 36 | * @return 实例 37 | */ 38 | +(instancetype)modelWithTextFiled:(UITextField *)textField inputView:(UIView *)inputView insetBottom:(CGFloat)insetBottom; 39 | 40 | 41 | /** 42 | * 从textField寻找对应的模型 43 | * 44 | * @param textField textField 45 | * @param tfModels 模型数组 46 | * 47 | * @return textField对应的模型 48 | */ 49 | +(TFModel *)findTextField:(UITextField *)textField fromTFModels:(NSArray *)tfModels; 50 | 51 | @end 52 | -------------------------------------------------------------------------------- /CoreTFManagerVC/CoreTFManagerVC/Lib/TFModel.m: -------------------------------------------------------------------------------- 1 | // 2 | // TFModel.m 3 | // CoreTFManagerVC 4 | // 5 | // Created by 沐汐 on 15-3-5. 6 | // Copyright (c) 2015年 沐汐. All rights reserved. 7 | // 8 | 9 | #import "TFModel.h" 10 | 11 | @implementation TFModel 12 | 13 | /** 14 | * 包装textField 15 | * 16 | * @param textField textField 17 | * @param insetBottom textField底部需要增加的距离 18 | * 19 | * @return 实例 20 | */ 21 | +(instancetype)modelWithTextFiled:(UITextField *)textField inputView:(UIView *)inputView insetBottom:(CGFloat)insetBottom{ 22 | 23 | TFModel *tfm=[[TFModel alloc] init]; 24 | 25 | tfm.textField=textField; 26 | 27 | tfm.inputView=inputView; 28 | 29 | tfm.insetBottom=insetBottom; 30 | 31 | return tfm; 32 | } 33 | 34 | /** 35 | * 从textField寻找对应的模型 36 | * 37 | * @param textField textField 38 | * @param tfModels 模型数组 39 | * 40 | * @return textField对应的模型 41 | */ 42 | +(TFModel *)findTextField:(UITextField *)textField fromTFModels:(NSArray *)tfModels{ 43 | 44 | if(tfModels==nil || tfModels.count==0) return nil; 45 | 46 | for (TFModel *tfModel in tfModels) { 47 | if(tfModel.textField != textField) continue; 48 | return tfModel; 49 | } 50 | 51 | return nil; 52 | } 53 | 54 | 55 | 56 | @end 57 | -------------------------------------------------------------------------------- /CoreTFManagerVC/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | -.$(PRODUCT_NAME:rfc1034identifier) 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 | UIInterfaceOrientationLandscapeLeft 37 | UIInterfaceOrientationLandscapeRight 38 | 39 | 40 | 41 | -------------------------------------------------------------------------------- /CoreTFManagerVC/HomeTVC.m: -------------------------------------------------------------------------------- 1 | // 2 | // HomeTVC.m 3 | // CoreTFManagerVC 4 | // 5 | // Created by 沐汐 on 15-3-5. 6 | // Copyright (c) 2015年 沐汐. All rights reserved. 7 | // 8 | 9 | #import "HomeTVC.h" 10 | #import "NormalViewVC.h" 11 | #import "ScrollViewVC.h" 12 | 13 | @interface HomeTVC () 14 | 15 | @property (nonatomic,strong) NSArray *dataList; 16 | 17 | @end 18 | 19 | @implementation HomeTVC 20 | 21 | - (void)viewDidLoad { 22 | [super viewDidLoad]; 23 | 24 | self.dataList=@[@"NormalView",@"ScrollView"]; 25 | 26 | 27 | } 28 | 29 | 30 | -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{ 31 | return self.dataList.count; 32 | } 33 | 34 | 35 | -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ 36 | 37 | static NSString *rid=@"rid"; 38 | 39 | UITableViewCell *cell=[tableView dequeueReusableCellWithIdentifier:rid]; 40 | 41 | if(cell==nil){ 42 | cell=[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:rid]; 43 | } 44 | 45 | cell.textLabel.text=self.dataList[indexPath.row]; 46 | 47 | return cell; 48 | } 49 | 50 | 51 | 52 | 53 | -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{ 54 | 55 | NSArray *vcs=@[@"NormalViewVC",@"ScrollViewVC"]; 56 | 57 | Class vcClass=NSClassFromString(vcs[indexPath.row]); 58 | 59 | UIViewController *vc=[[vcClass alloc] init]; 60 | 61 | vc.title=self.dataList[indexPath.row]; 62 | 63 | [self.navigationController pushViewController:vc animated:YES]; 64 | } 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | @end 74 | -------------------------------------------------------------------------------- /CoreTFManagerVC.xcodeproj/project.xcworkspace/xcshareddata/CoreTFManagerVC.xccheckout: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDESourceControlProjectFavoriteDictionaryKey 6 | 7 | IDESourceControlProjectIdentifier 8 | A904BFA2-FAA6-41D5-B449-FB376F8FC72E 9 | IDESourceControlProjectName 10 | CoreTFManagerVC 11 | IDESourceControlProjectOriginsDictionary 12 | 13 | 7F8820E80E2D08031E5B586324403A2CC25369C5 14 | https://github.com/nsdictionary/CoreTFManagerVC.git 15 | 16 | IDESourceControlProjectPath 17 | CoreTFManagerVC.xcodeproj 18 | IDESourceControlProjectRelativeInstallPathDictionary 19 | 20 | 7F8820E80E2D08031E5B586324403A2CC25369C5 21 | ../.. 22 | 23 | IDESourceControlProjectURL 24 | https://github.com/nsdictionary/CoreTFManagerVC.git 25 | IDESourceControlProjectVersion 26 | 111 27 | IDESourceControlProjectWCCIdentifier 28 | 7F8820E80E2D08031E5B586324403A2CC25369C5 29 | IDESourceControlProjectWCConfigurations 30 | 31 | 32 | IDESourceControlRepositoryExtensionIdentifierKey 33 | public.vcs.git 34 | IDESourceControlWCCIdentifierKey 35 | 7F8820E80E2D08031E5B586324403A2CC25369C5 36 | IDESourceControlWCCName 37 | CoreTFManagerVC 38 | 39 | 40 | 41 | 42 | -------------------------------------------------------------------------------- /CoreTFManagerVC/NormalViewVC.m: -------------------------------------------------------------------------------- 1 | // 2 | // NormalViewVC.m 3 | // CoreTFManagerVC 4 | // 5 | // Created by 沐汐 on 15-3-5. 6 | // Copyright (c) 2015年 沐汐. All rights reserved. 7 | // 8 | 9 | #import "NormalViewVC.h" 10 | #import "CoreTFManagerVC.h" 11 | 12 | @interface NormalViewVC () 13 | 14 | @property (strong, nonatomic) IBOutlet UITextField *tf1; 15 | @property (strong, nonatomic) IBOutlet UITextField *tf2; 16 | @property (strong, nonatomic) IBOutlet UITextField *tf3; 17 | @property (strong, nonatomic) IBOutlet UITextField *tf4; 18 | @property (strong, nonatomic) IBOutlet UITextField *tf5; 19 | 20 | 21 | @property (nonatomic,strong) UIView *inputView2; 22 | 23 | 24 | @end 25 | 26 | @implementation NormalViewVC 27 | 28 | - (void)viewDidLoad { 29 | [super viewDidLoad]; 30 | 31 | } 32 | 33 | -(void)viewDidAppear:(BOOL)animated{ 34 | 35 | [super viewDidAppear:animated]; 36 | 37 | [CoreTFManagerVC installManagerForVC:self scrollView:nil tfModels:^NSArray *{ 38 | 39 | UIDatePicker *picker=[[UIDatePicker alloc] initWithFrame:CGRectMake(0, 0, self.view.bounds.size.width, 200)]; 40 | 41 | TFModel *tfm1=[TFModel modelWithTextFiled:_tf1 inputView:nil insetBottom:0]; 42 | TFModel *tfm2=[TFModel modelWithTextFiled:_tf2 inputView:picker insetBottom:0]; 43 | TFModel *tfm3=[TFModel modelWithTextFiled:_tf3 inputView:nil insetBottom:0]; 44 | TFModel *tfm4=[TFModel modelWithTextFiled:_tf4 inputView:nil insetBottom:40]; 45 | TFModel *tfm5=[TFModel modelWithTextFiled:_tf5 inputView:nil insetBottom:0]; 46 | 47 | return @[tfm1,tfm2,tfm3,tfm4,tfm5]; 48 | 49 | }]; 50 | 51 | } 52 | 53 | -(void)viewDidDisappear:(BOOL)animated{ 54 | 55 | [super viewDidDisappear:animated]; 56 | 57 | [CoreTFManagerVC uninstallManagerForVC:self]; 58 | } 59 | 60 | 61 | @end 62 | -------------------------------------------------------------------------------- /CoreTFManagerVC/CoreTFManagerVC/Lib/CoreTFKeyBoardToolBarView.m: -------------------------------------------------------------------------------- 1 | // 2 | // CoreTFKeyBoardToolBarView.m 3 | // CoreTextFieldManager 4 | // 5 | // Created by muxi on 15/2/15. 6 | // Copyright (c) 2015年 muxi. All rights reserved. 7 | // 8 | 9 | #import "CoreTFKeyBoardToolBarView.h" 10 | 11 | @interface CoreTFKeyBoardToolBarView () 12 | 13 | @property (strong, nonatomic) IBOutlet UIButton *preBtn; 14 | 15 | @property (strong, nonatomic) IBOutlet UIButton *nextBtn; 16 | 17 | @property (weak, nonatomic) IBOutlet UILabel *msgLabel; 18 | 19 | 20 | 21 | @end 22 | 23 | 24 | 25 | 26 | @implementation CoreTFKeyBoardToolBarView 27 | 28 | -(void)awakeFromNib{ 29 | 30 | [super awakeFromNib]; 31 | 32 | self.preBtn.imageView.contentMode = UIViewContentModeScaleAspectFit; 33 | self.nextBtn.imageView.contentMode = UIViewContentModeScaleAspectFit; 34 | } 35 | 36 | 37 | +(instancetype)keyBoardToolBarView{ 38 | return [[[NSBundle mainBundle] loadNibNamed:NSStringFromClass(self) owner:nil options:nil] firstObject]; 39 | } 40 | 41 | 42 | #pragma mark 上一个 43 | - (IBAction)preBtnClick:(id)sender { 44 | if(self.preClickBlock != nil) self.preClickBlock(); 45 | } 46 | 47 | #pragma mark 下一个 48 | - (IBAction)nextBtnClick:(id)sender { 49 | if(self.nextClickBlock != nil) self.nextClickBlock(); 50 | } 51 | 52 | #pragma mark 完成 53 | - (IBAction)doneBtnClick:(id)sender { 54 | if(self.doneClickBlock != nil) self.doneClickBlock(); 55 | } 56 | 57 | -(void)setIsFirst:(BOOL)isFirst{ 58 | 59 | //记录 60 | _isFirst=isFirst; 61 | 62 | _preBtn.enabled=!isFirst; 63 | 64 | } 65 | 66 | -(void)setIsLast:(BOOL)isLast{ 67 | 68 | //记录 69 | _isLast=isLast; 70 | 71 | _nextBtn.enabled=!isLast; 72 | } 73 | 74 | -(void)setMsg:(NSString *)msg{_msg=msg; self.msgLabel.text = msg;} 75 | 76 | -(void)setHideToggleBtnsForSingleTF:(BOOL)hideToggleBtnsForSingleTF{ 77 | _hideToggleBtnsForSingleTF = hideToggleBtnsForSingleTF; 78 | if(!hideToggleBtnsForSingleTF) return; 79 | self.preBtn.hidden = YES; self.nextBtn.hidden=YES; 80 | } 81 | 82 | @end 83 | -------------------------------------------------------------------------------- /CoreTFManagerVC/AppDelegate.m: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.m 3 | // CoreTFManagerVC 4 | // 5 | // Created by 沐汐 on 15-3-5. 6 | // Copyright (c) 2015年 沐汐. All rights reserved. 7 | // 8 | 9 | #import "AppDelegate.h" 10 | 11 | @interface AppDelegate () 12 | 13 | @end 14 | 15 | @implementation AppDelegate 16 | 17 | 18 | - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 19 | // Override point for customization after application launch. 20 | return YES; 21 | } 22 | 23 | - (void)applicationWillResignActive:(UIApplication *)application { 24 | // 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. 25 | // 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. 26 | } 27 | 28 | - (void)applicationDidEnterBackground:(UIApplication *)application { 29 | // 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. 30 | // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. 31 | } 32 | 33 | - (void)applicationWillEnterForeground:(UIApplication *)application { 34 | // 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. 35 | } 36 | 37 | - (void)applicationDidBecomeActive:(UIApplication *)application { 38 | // 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. 39 | } 40 | 41 | - (void)applicationWillTerminate:(UIApplication *)application { 42 | // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. 43 | } 44 | 45 | @end 46 | -------------------------------------------------------------------------------- /CoreTFManagerVC/ScrollViewVC.m: -------------------------------------------------------------------------------- 1 | // 2 | // ScrollViewVC.m 3 | // CoreTFManagerVC 4 | // 5 | // Created by muxi on 15/3/6. 6 | // Copyright (c) 2015年 沐汐. All rights reserved. 7 | // 8 | 9 | #import "ScrollViewVC.h" 10 | #import "CoreTFManagerVC.h" 11 | 12 | @interface ScrollViewVC () 13 | 14 | @property (strong, nonatomic) IBOutlet UIScrollView *scrollView; 15 | 16 | 17 | @property (strong, nonatomic) IBOutlet UITextField *tf1; 18 | @property (strong, nonatomic) IBOutlet UITextField *tf2; 19 | @property (strong, nonatomic) IBOutlet UITextField *tf3; 20 | @property (strong, nonatomic) IBOutlet UITextField *tf4; 21 | @property (strong, nonatomic) IBOutlet UITextField *tf5; 22 | @property (strong, nonatomic) IBOutlet UITextField *tf6; 23 | 24 | 25 | 26 | 27 | 28 | 29 | @end 30 | 31 | 32 | 33 | @implementation ScrollViewVC 34 | 35 | -(void)viewDidLoad{ 36 | 37 | [super viewDidLoad]; 38 | 39 | self.scrollView.layer.borderColor=[UIColor brownColor].CGColor; 40 | self.scrollView.layer.borderWidth=2.0f; 41 | 42 | self.scrollView.contentInset=UIEdgeInsetsMake(40, 60, 80, 100); 43 | } 44 | 45 | 46 | 47 | -(void)viewDidAppear:(BOOL)animated{ 48 | 49 | [super viewDidAppear:animated]; 50 | 51 | [CoreTFManagerVC installManagerForVC:self scrollView:self.scrollView tfModels:^NSArray *{ 52 | UIDatePicker *picker=[[UIDatePicker alloc] initWithFrame:CGRectMake(0, 0, self.view.bounds.size.width, 200)]; 53 | 54 | 55 | TFModel *tfm1=[TFModel modelWithTextFiled:_tf1 inputView:nil insetBottom:0]; 56 | TFModel *tfm2=[TFModel modelWithTextFiled:_tf2 inputView:picker insetBottom:0]; 57 | TFModel *tfm3=[TFModel modelWithTextFiled:_tf3 inputView:nil insetBottom:30]; 58 | TFModel *tfm4=[TFModel modelWithTextFiled:_tf4 inputView:nil insetBottom:0]; 59 | TFModel *tfm5=[TFModel modelWithTextFiled:_tf5 inputView:nil insetBottom:0]; 60 | TFModel *tfm6=[TFModel modelWithTextFiled:_tf6 inputView:nil insetBottom:0]; 61 | 62 | return @[tfm6]; 63 | 64 | }]; 65 | } 66 | 67 | -(void)viewDidDisappear:(BOOL)animated{ 68 | 69 | [super viewDidDisappear:animated]; 70 | 71 | [CoreTFManagerVC uninstallManagerForVC:self]; 72 | } 73 | 74 | 75 | @end 76 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | Charlin出框架的目标:简单、易用、实用、高度封装、绝对解耦! 3 | 4 | # CoreTFManagerVC 5 | 强大的键盘躲避管理器,完全解耦版本,支持ScrollView!
6 | 7 | 注:本框架是大修改版本,之前的版本已经被无情的淘汰,请使用的朋友注意更新。觉得不错的请给星星。 8 | 9 | 10 | 11 |

12 | 13 | 14 | ##框架特性:
15 | >.向下兼容到ios 6.0.
16 | >.完全解耦,不需要继承,不需要定义成员属性,类方法直接搞定一切。
17 | >.自动管理生命周期,你只需要使用即可,不需要管理控制器的生命周期。本框架效仿百度地图的生命周期管理方案,后面使用会详细说明,此方案最合理。
18 | >.支持普通视图,新版本主要是解耦以及增加scrollView的支持。
19 | >.支持自定义键盘。自动placeHolder处理。
20 | >block封装,不需要任何代理,甚至你连键盘躲避管理器的对象实例都看不到。
21 | >.scrollView支持contentInset。
22 | >.支持所有设备,包括横竖屏。
23 | >.封装了强大的键盘工具条,不需要再担心屏幕小不好切换或者退下键盘了。
24 | >.做了比较多的性能优化,最大必的提高性能。
25 | >.完善的错误处理机制。
26 | >.完善的动画效果及不同键盘切换动画效果,动画曲线效果。
27 | >.insetsBottom表示这个文本输入框是否需要向下多留一点空白,一般是文本框下面有提示类文字或者提交类按钮可以设置此值。 28 | >.完善的内存管理。


29 | 30 | 31 | 示例中有一个pickerView,你会觉得选了没值?那是因为没有处理,因为这个处理是和本框架无关的操作 32 | 33 | 34 | ##Charlin想说:
35 | a.本次框架的制作真可谓历经千辛万苦,本来最开始做了一个版本,没有解耦,需要你去继承,然后一个朋友essue我说明了这个情况我当时就 36 | 在想怎么解耦。,然后现在的项目(还比较大)直接使用了这个框架,用起来几乎完美,我的几个同事直接使用了也没有问题。 37 | 38 | b.所以当时感觉功能还比较完善就没有想过要去改这个框架。后来在做一个注册页面的时候,页面比较长,里面有很多输入框,所有的textField直接 39 | 放在了一个大的scrollView里面,问题就来了,整个框架就乱了。这才感觉必须要重新改写框架。 40 | 41 | c.整个框架这次基本写了30个小时左右,其中遇到很多的问题,最麻烦的问题就是scrollView在躲避键盘移动的时候,在依次的点【下一个】的时候需要先吃掉contentSize, 42 | 吃完自己的contentSize再去修改transform,然后到了最底部,再依次的点【上一个】的时候,需要反过来,先精确计算退还transform, 43 | 退完了再把contentSize释放,同时在点击上一个或者下一个的时候,用户是可以再拖动scrollView改变当前的contentOffset,导致整个计算异常 44 | 复杂,我总共写了5个版本,前4个版本异常复杂,代码量达到1000行以上。 45 | 46 | d.最终精疲力尽的时候,查看了github上10来个类似的国外写的东西,转换了思路,用最简单的方式完成了整体框架,完成后感觉非常开心。在这里 47 | 分享给大家。 48 | 49 | 50 | 51 |

52 | 53 | ##使用示例 54 | //安装:请在viewDidAppear中完成 55 | -(void)viewDidAppear:(BOOL)animated{ 56 | 57 | [super viewDidAppear:animated]; 58 | 59 | [CoreTFManagerVC installManagerForVC:self scrollView:self.scrollView tfModels:^NSArray *{ 60 | UIDatePicker *picker=[[UIDatePicker alloc] initWithFrame:CGRectMake(0, 0, self.view.bounds.size.width, 200)]; 61 | 62 | 63 | TFModel *tfm1=[TFModel modelWithTextFiled:_tf1 inputView:nil name:@"tf1" insetBottom:0]; 64 | TFModel *tfm2=[TFModel modelWithTextFiled:_tf2 inputView:picker name:@"tf2" insetBottom:0]; 65 | TFModel *tfm3=[TFModel modelWithTextFiled:_tf3 inputView:nil name:@"tf3" insetBottom:30]; 66 | TFModel *tfm4=[TFModel modelWithTextFiled:_tf4 inputView:nil name:@"tf4" insetBottom:0]; 67 | TFModel *tfm5=[TFModel modelWithTextFiled:_tf5 inputView:nil name:@"tf5" insetBottom:0]; 68 | TFModel *tfm6=[TFModel modelWithTextFiled:_tf6 inputView:nil name:@"tf6" insetBottom:0]; 69 | 70 | return @[tfm1,tfm2,tfm3,tfm4,tfm5,tfm6]; 71 | 72 | }]; 73 | } 74 | 75 | //卸载:请在viewDidDisappear中完成 76 | -(void)viewDidDisappear:(BOOL)animated{ 77 | 78 | [super viewDidDisappear:animated]; 79 | 80 | [CoreTFManagerVC uninstallManagerForVC:self]; 81 | } 82 | 83 |

84 | ##示例截图 85 | ![image](./CoreTFManagerVC/Cut/1.png)
86 | ![image](./CoreTFManagerVC/Cut/2.png)
87 | ![image](./CoreTFManagerVC/Cut/3.png)
88 |

89 | 90 | 91 | 92 |


93 | 我的事业 94 | =============== 95 | 西成的事业,渺小而艰难的求生存。前期我们专做全国的移动app外包。如果您能在信息上援助我们,我们万分感谢您的帮助!
96 | 西成:[http://ios-android.cn](http://ios-android.cn)
97 | 我的个人微博:[http://weibo.com/charlin2015/](http://weibo.com/charlin2015/)
98 |

99 | 三群: 474377358
100 | 四群: 347446259
101 | 西部省市朋友加群号: 473185026(实名)
102 | swift群: 467237044
103 | -------------------------------------------------------------------------------- /CoreTFManagerVC/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 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | -------------------------------------------------------------------------------- /CoreTFManagerVC/Base.lproj/LaunchScreen.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 20 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | -------------------------------------------------------------------------------- /CoreTFManagerVC.xcodeproj/xcuserdata/weixiang.xcuserdatad/xcschemes/CoreTFManagerVC.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 33 | 39 | 40 | 41 | 42 | 43 | 49 | 50 | 51 | 52 | 53 | 54 | 64 | 66 | 72 | 73 | 74 | 75 | 76 | 77 | 83 | 85 | 91 | 92 | 93 | 94 | 96 | 97 | 100 | 101 | 102 | -------------------------------------------------------------------------------- /CoreTFManagerVC.xcodeproj/xcuserdata/huaxi100.xcuserdatad/xcschemes/CoreTFManagerVC.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 29 | 35 | 36 | 37 | 38 | 39 | 44 | 45 | 47 | 53 | 54 | 55 | 56 | 57 | 63 | 64 | 65 | 66 | 75 | 76 | 82 | 83 | 84 | 85 | 86 | 87 | 93 | 94 | 100 | 101 | 102 | 103 | 105 | 106 | 109 | 110 | 111 | -------------------------------------------------------------------------------- /CoreTFManagerVC.xcodeproj/xcuserdata/muxi.xcuserdatad/xcschemes/CoreTFManagerVC.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 29 | 35 | 36 | 37 | 38 | 39 | 44 | 45 | 47 | 53 | 54 | 55 | 56 | 57 | 63 | 64 | 65 | 66 | 75 | 76 | 82 | 83 | 84 | 85 | 86 | 87 | 93 | 94 | 100 | 101 | 102 | 103 | 105 | 106 | 109 | 110 | 111 | -------------------------------------------------------------------------------- /CoreTFManagerVC/NormalViewVC.xib: -------------------------------------------------------------------------------- 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 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | -------------------------------------------------------------------------------- /CoreTFManagerVC/CoreTFManagerVC/Lib/CoreTFKeyBoardToolBarView.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 42 | 60 | 75 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | -------------------------------------------------------------------------------- /CoreTFManagerVC/ScrollViewVC.xib: -------------------------------------------------------------------------------- 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 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | -------------------------------------------------------------------------------- /CoreTFManagerVC/CoreTFManagerVC/CoreTFManagerVC.m: -------------------------------------------------------------------------------- 1 | // 2 | // CoreTFManagerVC.m 3 | // CoreTFManagerVC 4 | // 5 | // Created by 沐汐 on 15-3-5. 6 | // Copyright (c) 2015年 沐汐. All rights reserved. 7 | // 8 | 9 | #import "CoreTFManagerVC.h" 10 | #import "CoreTFKeyBoardToolBarView.h" 11 | #define ios6x [[[UIDevice currentDevice] systemVersion] floatValue] < 7.0f 12 | 13 | @interface CoreTFManagerVC () 14 | 15 | //控制器 16 | @property (nonatomic,strong) UIViewController *superVC; 17 | 18 | //输入框的父级控件 19 | @property (nonatomic,strong) UIScrollView *scrollView; 20 | 21 | //输入框模型数组 22 | @property (nonatomic,strong) NSArray *tfModels; 23 | 24 | //键盘工具条 25 | @property (nonatomic,strong) CoreTFKeyBoardToolBarView *keyBoardToolBarView; 26 | 27 | //当前的输入框对象 28 | @property (nonatomic,strong) TFModel *currentTFModel; 29 | 30 | //动画曲线 31 | @property (nonatomic,assign) NSInteger keyBoardCurve; 32 | 33 | //动画时长 34 | @property (nonatomic,assign) CGFloat keyBoardDuration; 35 | 36 | //键盘高度 37 | @property (nonatomic,assign) CGFloat keyBoardHeight; 38 | 39 | //scrollView转换到window中的frame 40 | @property (nonatomic,assign) CGFloat scrollWindowFrameY; 41 | 42 | //keyBoardToolBarView的高度 43 | @property (nonatomic,assign) CGFloat keyBoardToolBarViewH; 44 | 45 | //屏幕高度:性能优化 46 | @property (nonatomic,assign) CGFloat screenH; 47 | 48 | //window 49 | @property (nonatomic,strong) UIWindow *window; 50 | 51 | 52 | @end 53 | 54 | @implementation CoreTFManagerVC 55 | 56 | 57 | 58 | /** 59 | * 安装 60 | * 61 | * @param vc 需要安装的控制器 62 | * @param scrollView textField所在的scrollView 63 | * @param tfModels textField包装模型数组 64 | */ 65 | +(void)installManagerForVC:(UIViewController *)vc scrollView:(UIScrollView *)scrollView tfModels:(NSArray *(^)())tfModels{ 66 | 67 | if(vc==nil){ 68 | NSLog(@"CoreTFManagerVC:安装失败,您传入的控制器不合法,不能为nil"); 69 | return; 70 | } 71 | 72 | NSArray *tfModelsArray=nil; 73 | 74 | if(tfModels!=nil) tfModelsArray=tfModels(); 75 | 76 | BOOL res=[self checkTFModels:tfModelsArray]; 77 | 78 | if(!res) return; 79 | 80 | CoreTFManagerVC *tfManagerVC=[[CoreTFManagerVC alloc] init]; 81 | 82 | //记录自己,保命 83 | [vc addChildViewController:tfManagerVC]; 84 | 85 | //记录 86 | tfManagerVC.superVC=vc; 87 | 88 | //scrollView 89 | tfManagerVC.scrollView=scrollView; 90 | 91 | //输入框模型数组 92 | if(tfModels!=nil) tfManagerVC.tfModels=tfModels(); 93 | 94 | //注册键盘监听 95 | [tfManagerVC keyboardObserver]; 96 | } 97 | 98 | /** 99 | * 数据合法性校验 100 | */ 101 | +(BOOL)checkTFModels:(NSArray *)tfModels{ 102 | 103 | if(tfModels==nil || tfModels.count==0){ 104 | 105 | NSLog(@"CoreTFManagerVC:安装失败,您传入的textField数组不合法,没有数据"); 106 | 107 | return NO; 108 | } 109 | 110 | for (id obj in tfModels) { 111 | 112 | if([obj isKindOfClass:[TFModel class]]) continue; 113 | 114 | NSLog(@"CoreTFManagerVC:安装失败,tfModels数组内部的对象不是TFModel模型对象"); 115 | 116 | return NO; 117 | } 118 | 119 | return YES; 120 | } 121 | 122 | 123 | /** 124 | * 注册键盘监听 125 | */ 126 | -(void)keyboardObserver{ 127 | 128 | //添加键盘弹出通知 129 | [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyBoardWillShow:) name:UIKeyboardWillShowNotification object:nil]; 130 | 131 | //添加键盘弹出通知 132 | [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyBoardWillHide:) name:UIKeyboardWillHideNotification object:nil]; 133 | } 134 | 135 | 136 | 137 | 138 | #pragma mark - 键盘弹出通知 139 | -(void)keyBoardWillShow:(NSNotification *)noti{ 140 | 141 | //此方法调用时机: 142 | //1.弹出不同键盘 143 | //2.键盘初次中文输入 144 | //3.屏幕旋转 145 | 146 | //键盘即将弹出,更新以下值 147 | //如果是相同的键盘,此方法不会重复调用,我们应该在此处记录重要数据 148 | NSDictionary *userInfo=noti.userInfo; 149 | 150 | //记录动画曲线 151 | self.keyBoardCurve=[userInfo[UIKeyboardAnimationCurveUserInfoKey] integerValue]; 152 | 153 | //时间时长 154 | self.keyBoardDuration=[userInfo[UIKeyboardAnimationDurationUserInfoKey] floatValue]; 155 | 156 | //键盘高度 157 | self.keyBoardHeight=[userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue].size.height; 158 | [self adjustFrame]; 159 | } 160 | 161 | -(void)keyBoardWillHide:(NSNotification *)noti{ 162 | //视图恢复原位 163 | [UIView animateWithDuration:_keyBoardDuration animations:^{ 164 | //动画曲线 165 | [UIView setAnimationCurve:_keyBoardCurve]; 166 | self.superVC.view.transform=CGAffineTransformIdentity; 167 | }]; 168 | } 169 | 170 | -(BOOL)textFieldShouldReturn:(UITextField *)textField{ 171 | 172 | [self.currentTFModel.textField resignFirstResponder]; 173 | 174 | //如果有scrollView,需要考虑恢复scrollView的状态 175 | if(self.scrollView!=nil) self.keyBoardToolBarView.doneClickBlock(); 176 | 177 | return YES; 178 | } 179 | 180 | 181 | 182 | #pragma mark -代理方法区 183 | #pragma mark 即将开始编辑 184 | -(BOOL)textFieldShouldBeginEditing:(UITextField *)textField{ 185 | 186 | //记录 187 | self.currentTFModel=[TFModel findTextField:textField fromTFModels:self.tfModels]; 188 | CoreTFKeyBoardToolBarView *toolBarView = (CoreTFKeyBoardToolBarView *)textField.inputAccessoryView; 189 | toolBarView.msg = textField.placeholder; 190 | dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(.1f * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ 191 | [self adjustFrame]; 192 | }); 193 | 194 | return YES; 195 | } 196 | 197 | 198 | 199 | 200 | 201 | 202 | #pragma mark - 调整当前视图的frame 203 | -(void)adjustFrame{ 204 | 205 | //控件获取最大的y值 206 | CGFloat tfMaxY=CGRectGetMaxY(self.currentTFModel.textFiledWindowFrame); 207 | CGFloat insetBottom=self.currentTFModel.insetBottom; 208 | 209 | 210 | //计算得到最大的y值:主要是避开一些按钮 211 | CGFloat totalMaxY=tfMaxY + insetBottom; 212 | 213 | //计算键盘最小的Y值 214 | CGFloat keyBoardMinY=self.screenH - _keyBoardHeight; 215 | 216 | CGFloat deltaY= keyBoardMinY - totalMaxY; 217 | 218 | CGAffineTransform transform=deltaY>0?CGAffineTransformIdentity:CGAffineTransformMakeTranslation(0,deltaY); 219 | 220 | if(self.scrollView==nil){//NormalView 221 | 222 | dispatch_async(dispatch_get_main_queue(), ^{ 223 | //视图上移 224 | [UIView animateWithDuration:_keyBoardDuration animations:^{ 225 | //动画曲线 226 | [UIView setAnimationCurve:_keyBoardCurve]; 227 | self.superVC.view.transform=transform; 228 | }]; 229 | }); 230 | }else{//ScrollView 231 | 232 | //我们不需要windowFrame 233 | //1.将文本框直接置顶 234 | CGFloat testFieldX = self.scrollView.contentOffset.x; 235 | //下移动: 236 | CGFloat textFieldY =CGRectGetMaxY(self.currentTFModel.textFieldScrollFrame) -(self.screenH - self.scrollWindowFrameY - self.keyBoardHeight - insetBottom); 237 | 238 | if(ios6x) textFieldY+=20.0f; 239 | 240 | CGFloat minY=-self.scrollView.contentInset.top; 241 | 242 | if(textFieldY<= minY) textFieldY=minY; 243 | 244 | CGPoint contentOffset=CGPointMake(testFieldX,textFieldY); 245 | 246 | dispatch_async(dispatch_get_main_queue(), ^{ 247 | 248 | [UIView animateWithDuration:_keyBoardDuration animations:^{ 249 | 250 | //动画曲线 251 | [UIView setAnimationCurve:_keyBoardCurve]; 252 | 253 | [self.scrollView scrollRectToVisible:self.currentTFModel.textFieldScrollFrame animated:NO]; 254 | 255 | self.scrollView.contentOffset=contentOffset; 256 | }]; 257 | }); 258 | } 259 | 260 | dispatch_async(dispatch_get_main_queue(), ^{ 261 | //更新键盘工具条的状态 262 | [self updateStatusForKeyboardTool]; 263 | }); 264 | } 265 | 266 | 267 | 268 | 269 | 270 | -(void)setTfModels:(NSArray *)tfModels{ 271 | 272 | if(tfModels.count == 1){self.keyBoardToolBarView.hideToggleBtnsForSingleTF=YES;} 273 | 274 | //遍历所有文本框 275 | [tfModels enumerateObjectsUsingBlock:^(TFModel *tfm, NSUInteger idx, BOOL *stop) { 276 | 277 | //取出文本框 278 | UITextField *textField=tfm.textField; 279 | 280 | //设置代理 281 | textField.delegate=self; 282 | 283 | //设置键盘 284 | if(tfm.inputView!=nil) textField.inputView=tfm.inputView; 285 | 286 | //设置键盘工具条 287 | textField.inputAccessoryView=self.keyBoardToolBarView; 288 | 289 | //返回键样式 290 | textField.returnKeyType=UIReturnKeyDefault; 291 | 292 | //window 293 | if(self.window==nil) self.window=self.superVC.view.window; 294 | 295 | //textField在window中的frame 296 | tfm.textFiledWindowFrame = [self.window convertRect:textField.frame fromView:textField.superview]; 297 | 298 | //textField在scrollView中的frame 299 | if(self.scrollView!=nil) tfm.textFieldScrollFrame=[self.scrollView convertRect:textField.frame fromView:textField.superview]; 300 | 301 | //scrollView在window中的frame 302 | if(self.scrollView!=nil && self.scrollWindowFrameY==0) self.scrollWindowFrameY = [self.window convertRect:self.scrollView.frame fromView:self.scrollView.superview].origin.y; 303 | 304 | }]; 305 | 306 | //数组重新排序 307 | tfModels = [tfModels sortedArrayUsingComparator:^NSComparisonResult(TFModel *tfm1,TFModel *tfm2) { 308 | 309 | if(tfm1.textFiledWindowFrame.origin.ytfm2.textFiledWindowFrame.origin.y) return NSOrderedDescending; 312 | 313 | return NSOrderedSame; 314 | 315 | }]; 316 | 317 | //记录 318 | _tfModels=tfModels; 319 | 320 | } 321 | 322 | 323 | 324 | -(CoreTFKeyBoardToolBarView *)keyBoardToolBarView{ 325 | 326 | __weak typeof(self) weakSelf=self; 327 | 328 | if(!_keyBoardToolBarView){ 329 | 330 | _keyBoardToolBarView=[CoreTFKeyBoardToolBarView keyBoardToolBarView]; 331 | 332 | //上一个 333 | _keyBoardToolBarView.preClickBlock=^{ 334 | 335 | [weakSelf toggleTFIsPre:YES]; 336 | }; 337 | 338 | //下一个 339 | _keyBoardToolBarView.nextClickBlock=^{ 340 | 341 | [weakSelf toggleTFIsPre:NO]; 342 | }; 343 | 344 | //完成 345 | _keyBoardToolBarView.doneClickBlock=^{ 346 | 347 | if(weakSelf.scrollView!=nil){ 348 | 349 | //如果当前的scrollView的offset值超出正常值,应该调整到最大值 350 | CGFloat maxOffsetY=weakSelf.scrollView.contentSize.height - weakSelf.scrollView.bounds.size.height + weakSelf.scrollView.contentInset.bottom; 351 | if(maxOffsetY<=0) maxOffsetY=0; 352 | CGFloat currentOffsetY=weakSelf.scrollView.contentOffset.y; 353 | 354 | CGPoint offset=CGPointMake(weakSelf.scrollView.contentOffset.x, maxOffsetY); 355 | 356 | if(currentOffsetY>maxOffsetY){ 357 | [UIView animateWithDuration:weakSelf.keyBoardDuration animations:^{ 358 | //动画曲线 359 | [UIView setAnimationCurve:weakSelf.keyBoardCurve]; 360 | [weakSelf.scrollView scrollRectToVisible:weakSelf.currentTFModel.textFieldScrollFrame animated:NO]; 361 | 362 | weakSelf.scrollView.contentOffset=offset; 363 | }]; 364 | } 365 | } 366 | 367 | [weakSelf.currentTFModel.textField resignFirstResponder]; 368 | }; 369 | 370 | } 371 | 372 | return _keyBoardToolBarView; 373 | } 374 | 375 | 376 | 377 | -(void)toggleTFIsPre:(BOOL)isPre{ 378 | 379 | //获取当前的index 380 | NSUInteger index=[self.tfModels indexOfObject:self.currentTFModel]; 381 | NSUInteger count=self.tfModels.count; 382 | if(index>count) index=0; 383 | 384 | NSInteger i=isPre?-1:1; 385 | NSInteger nextIndex=index + i; 386 | if(nextIndex<0)nextIndex=0; 387 | if(nextIndex>=count) nextIndex=count-1; 388 | 389 | 390 | //下一个输入框获取焦点 391 | TFModel *tfModel=self.tfModels[nextIndex]; 392 | 393 | //优化不同键盘的动画 394 | if(self.currentTFModel.inputView!=tfModel.inputView){ 395 | [self.currentTFModel.textField resignFirstResponder]; 396 | dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(.1f * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ 397 | [tfModel.textField becomeFirstResponder]; 398 | }); 399 | 400 | }else{ 401 | 402 | [tfModel.textField becomeFirstResponder]; 403 | } 404 | 405 | dispatch_async(dispatch_get_main_queue(), ^{ 406 | //更新键盘工具条的状态 407 | [self updateStatusForKeyboardTool]; 408 | }); 409 | } 410 | 411 | 412 | #pragma mark 更新键盘工具条的状态 413 | -(void)updateStatusForKeyboardTool{ 414 | //获取当前的index 415 | NSUInteger nowIndex=[self.tfModels indexOfObject:self.currentTFModel]; 416 | 417 | _keyBoardToolBarView.isFirst=nowIndex==0; 418 | _keyBoardToolBarView.isLast=nowIndex==(self.tfModels.count - 1); 419 | } 420 | 421 | 422 | -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ 423 | [self.currentTFModel.textField resignFirstResponder]; 424 | } 425 | 426 | 427 | -(CGFloat)screenH{ 428 | 429 | if(_screenH==0.){ 430 | _screenH=self.window.bounds.size.height; 431 | } 432 | 433 | return _screenH; 434 | } 435 | 436 | 437 | 438 | 439 | /** 440 | * 卸载 441 | */ 442 | +(void)uninstallManagerForVC:(UIViewController *)vc{ 443 | 444 | //键盘退下 445 | 446 | if(vc==nil) return; 447 | 448 | NSArray *childVCs=vc.childViewControllers; 449 | 450 | if(childVCs==nil || childVCs.count==0) return; 451 | 452 | for (UIViewController *vc in childVCs) { 453 | 454 | if(![vc isKindOfClass:[self class]]) continue; 455 | 456 | //移除 457 | [vc removeFromParentViewController]; 458 | break; 459 | } 460 | 461 | } 462 | 463 | 464 | 465 | /** 466 | * 空值校验 467 | * 468 | * @param tfModels textField包装模型数组 469 | * @return 如果没有textField存在空值,返回nil;如果有textField为空,则返回对应的TFModel模型 470 | */ 471 | +(TFModel *)checkNullValueInTFModels:(NSArray *)tfModels{ 472 | 473 | //数据合法性校验 474 | BOOL res=[self checkTFModels:tfModels]; 475 | 476 | if(!res) return [[TFModel alloc] init]; 477 | 478 | //遍历 479 | for (TFModel *tfModel in tfModels) { 480 | if([tfModel.textField.text isEqualToString:@""]) return tfModel; 481 | } 482 | 483 | return nil; 484 | } 485 | 486 | 487 | 488 | 489 | -(void)dealloc{ 490 | 491 | //移除通知 492 | [[NSNotificationCenter defaultCenter] removeObserver:self]; 493 | 494 | //键盘退下 495 | [self.currentTFModel.textField resignFirstResponder]; 496 | 497 | //清空数据 498 | self.window=nil; 499 | 500 | self.superVC=nil; 501 | 502 | self.scrollView=nil; 503 | 504 | self.tfModels=nil; 505 | } 506 | 507 | 508 | 509 | @end 510 | -------------------------------------------------------------------------------- /CoreTFManagerVC.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | CEBEE5FF1C10681600BAA16B /* CoreTFManagerVC.bundle in Resources */ = {isa = PBXBuildFile; fileRef = CEBEE5FE1C10681600BAA16B /* CoreTFManagerVC.bundle */; }; 11 | D6D2395A1AA89BDF003B999A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = D6D239591AA89BDF003B999A /* main.m */; }; 12 | D6D2395D1AA89BDF003B999A /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = D6D2395C1AA89BDF003B999A /* AppDelegate.m */; }; 13 | D6D239631AA89BDF003B999A /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = D6D239611AA89BDF003B999A /* Main.storyboard */; }; 14 | D6D239651AA89BDF003B999A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = D6D239641AA89BDF003B999A /* Images.xcassets */; }; 15 | D6D239681AA89BDF003B999A /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = D6D239661AA89BDF003B999A /* LaunchScreen.xib */; }; 16 | D6D239741AA89BDF003B999A /* CoreTFManagerVCTests.m in Sources */ = {isa = PBXBuildFile; fileRef = D6D239731AA89BDF003B999A /* CoreTFManagerVCTests.m */; }; 17 | D6D2397F1AA89CB8003B999A /* HomeTVC.m in Sources */ = {isa = PBXBuildFile; fileRef = D6D2397E1AA89CB8003B999A /* HomeTVC.m */; }; 18 | D6D239831AA89DFA003B999A /* NormalViewVC.m in Sources */ = {isa = PBXBuildFile; fileRef = D6D239811AA89DFA003B999A /* NormalViewVC.m */; }; 19 | D6D239841AA89DFA003B999A /* NormalViewVC.xib in Resources */ = {isa = PBXBuildFile; fileRef = D6D239821AA89DFA003B999A /* NormalViewVC.xib */; }; 20 | EE5A8A5B1AA989C8000BA4AE /* 1.png in Resources */ = {isa = PBXBuildFile; fileRef = EE5A8A581AA989C8000BA4AE /* 1.png */; }; 21 | EE5A8A5C1AA989C8000BA4AE /* 2.png in Resources */ = {isa = PBXBuildFile; fileRef = EE5A8A591AA989C8000BA4AE /* 2.png */; }; 22 | EE5A8A5D1AA989C8000BA4AE /* 3.png in Resources */ = {isa = PBXBuildFile; fileRef = EE5A8A5A1AA989C8000BA4AE /* 3.png */; }; 23 | EE63201E1AA943DF007BE4FB /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EE63201D1AA943DF007BE4FB /* UIKit.framework */; }; 24 | EE6320291AA954AA007BE4FB /* ScrollViewVC.m in Sources */ = {isa = PBXBuildFile; fileRef = EE6320281AA954AA007BE4FB /* ScrollViewVC.m */; }; 25 | EE63202B1AA954B9007BE4FB /* ScrollViewVC.xib in Resources */ = {isa = PBXBuildFile; fileRef = EE63202A1AA954B9007BE4FB /* ScrollViewVC.xib */; }; 26 | EE8228E51AC17026004049D7 /* CoreTFManagerVC.m in Sources */ = {isa = PBXBuildFile; fileRef = EE8228DE1AC17026004049D7 /* CoreTFManagerVC.m */; }; 27 | EE8228E61AC17026004049D7 /* CoreTFKeyBoardToolBarView.m in Sources */ = {isa = PBXBuildFile; fileRef = EE8228E11AC17026004049D7 /* CoreTFKeyBoardToolBarView.m */; }; 28 | EE8228E71AC17026004049D7 /* CoreTFKeyBoardToolBarView.xib in Resources */ = {isa = PBXBuildFile; fileRef = EE8228E21AC17026004049D7 /* CoreTFKeyBoardToolBarView.xib */; }; 29 | EE8228E81AC17026004049D7 /* TFModel.m in Sources */ = {isa = PBXBuildFile; fileRef = EE8228E41AC17026004049D7 /* TFModel.m */; }; 30 | /* End PBXBuildFile section */ 31 | 32 | /* Begin PBXContainerItemProxy section */ 33 | D6D2396E1AA89BDF003B999A /* PBXContainerItemProxy */ = { 34 | isa = PBXContainerItemProxy; 35 | containerPortal = D6D2394C1AA89BDF003B999A /* Project object */; 36 | proxyType = 1; 37 | remoteGlobalIDString = D6D239531AA89BDF003B999A; 38 | remoteInfo = CoreTFManagerVC; 39 | }; 40 | /* End PBXContainerItemProxy section */ 41 | 42 | /* Begin PBXFileReference section */ 43 | CEBEE5FE1C10681600BAA16B /* CoreTFManagerVC.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; path = CoreTFManagerVC.bundle; sourceTree = ""; }; 44 | D6D239541AA89BDF003B999A /* CoreTFManagerVC.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = CoreTFManagerVC.app; sourceTree = BUILT_PRODUCTS_DIR; }; 45 | D6D239581AA89BDF003B999A /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 46 | D6D239591AA89BDF003B999A /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 47 | D6D2395B1AA89BDF003B999A /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; 48 | D6D2395C1AA89BDF003B999A /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; 49 | D6D239621AA89BDF003B999A /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 50 | D6D239641AA89BDF003B999A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; 51 | D6D239671AA89BDF003B999A /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = ""; }; 52 | D6D2396D1AA89BDF003B999A /* CoreTFManagerVCTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = CoreTFManagerVCTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 53 | D6D239721AA89BDF003B999A /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 54 | D6D239731AA89BDF003B999A /* CoreTFManagerVCTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = CoreTFManagerVCTests.m; sourceTree = ""; }; 55 | D6D2397D1AA89CB8003B999A /* HomeTVC.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HomeTVC.h; sourceTree = ""; }; 56 | D6D2397E1AA89CB8003B999A /* HomeTVC.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HomeTVC.m; sourceTree = ""; }; 57 | D6D239801AA89DFA003B999A /* NormalViewVC.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NormalViewVC.h; sourceTree = ""; }; 58 | D6D239811AA89DFA003B999A /* NormalViewVC.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NormalViewVC.m; sourceTree = ""; }; 59 | D6D239821AA89DFA003B999A /* NormalViewVC.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = NormalViewVC.xib; sourceTree = ""; }; 60 | EE5A8A581AA989C8000BA4AE /* 1.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = 1.png; sourceTree = ""; }; 61 | EE5A8A591AA989C8000BA4AE /* 2.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = 2.png; sourceTree = ""; }; 62 | EE5A8A5A1AA989C8000BA4AE /* 3.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = 3.png; sourceTree = ""; }; 63 | EE63201D1AA943DF007BE4FB /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; 64 | EE6320271AA954AA007BE4FB /* ScrollViewVC.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ScrollViewVC.h; sourceTree = ""; }; 65 | EE6320281AA954AA007BE4FB /* ScrollViewVC.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ScrollViewVC.m; sourceTree = ""; }; 66 | EE63202A1AA954B9007BE4FB /* ScrollViewVC.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = ScrollViewVC.xib; sourceTree = ""; }; 67 | EE8228DD1AC17026004049D7 /* CoreTFManagerVC.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CoreTFManagerVC.h; sourceTree = ""; }; 68 | EE8228DE1AC17026004049D7 /* CoreTFManagerVC.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CoreTFManagerVC.m; sourceTree = ""; }; 69 | EE8228E01AC17026004049D7 /* CoreTFKeyBoardToolBarView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CoreTFKeyBoardToolBarView.h; sourceTree = ""; }; 70 | EE8228E11AC17026004049D7 /* CoreTFKeyBoardToolBarView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CoreTFKeyBoardToolBarView.m; sourceTree = ""; }; 71 | EE8228E21AC17026004049D7 /* CoreTFKeyBoardToolBarView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = CoreTFKeyBoardToolBarView.xib; sourceTree = ""; }; 72 | EE8228E31AC17026004049D7 /* TFModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TFModel.h; sourceTree = ""; }; 73 | EE8228E41AC17026004049D7 /* TFModel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TFModel.m; sourceTree = ""; }; 74 | /* End PBXFileReference section */ 75 | 76 | /* Begin PBXFrameworksBuildPhase section */ 77 | D6D239511AA89BDF003B999A /* Frameworks */ = { 78 | isa = PBXFrameworksBuildPhase; 79 | buildActionMask = 2147483647; 80 | files = ( 81 | EE63201E1AA943DF007BE4FB /* UIKit.framework in Frameworks */, 82 | ); 83 | runOnlyForDeploymentPostprocessing = 0; 84 | }; 85 | D6D2396A1AA89BDF003B999A /* Frameworks */ = { 86 | isa = PBXFrameworksBuildPhase; 87 | buildActionMask = 2147483647; 88 | files = ( 89 | ); 90 | runOnlyForDeploymentPostprocessing = 0; 91 | }; 92 | /* End PBXFrameworksBuildPhase section */ 93 | 94 | /* Begin PBXGroup section */ 95 | D6D2394B1AA89BDF003B999A = { 96 | isa = PBXGroup; 97 | children = ( 98 | D6D239561AA89BDF003B999A /* CoreTFManagerVC */, 99 | D6D239701AA89BDF003B999A /* CoreTFManagerVCTests */, 100 | D6D239551AA89BDF003B999A /* Products */, 101 | ); 102 | sourceTree = ""; 103 | }; 104 | D6D239551AA89BDF003B999A /* Products */ = { 105 | isa = PBXGroup; 106 | children = ( 107 | D6D239541AA89BDF003B999A /* CoreTFManagerVC.app */, 108 | D6D2396D1AA89BDF003B999A /* CoreTFManagerVCTests.xctest */, 109 | ); 110 | name = Products; 111 | sourceTree = ""; 112 | }; 113 | D6D239561AA89BDF003B999A /* CoreTFManagerVC */ = { 114 | isa = PBXGroup; 115 | children = ( 116 | EE8228DC1AC17026004049D7 /* CoreTFManagerVC */, 117 | D6D2395B1AA89BDF003B999A /* AppDelegate.h */, 118 | D6D2395C1AA89BDF003B999A /* AppDelegate.m */, 119 | D6D239611AA89BDF003B999A /* Main.storyboard */, 120 | D6D2397D1AA89CB8003B999A /* HomeTVC.h */, 121 | D6D2397E1AA89CB8003B999A /* HomeTVC.m */, 122 | D6D239801AA89DFA003B999A /* NormalViewVC.h */, 123 | D6D239811AA89DFA003B999A /* NormalViewVC.m */, 124 | D6D239821AA89DFA003B999A /* NormalViewVC.xib */, 125 | EE6320271AA954AA007BE4FB /* ScrollViewVC.h */, 126 | EE6320281AA954AA007BE4FB /* ScrollViewVC.m */, 127 | EE63202A1AA954B9007BE4FB /* ScrollViewVC.xib */, 128 | D6D239641AA89BDF003B999A /* Images.xcassets */, 129 | D6D239661AA89BDF003B999A /* LaunchScreen.xib */, 130 | D6D239571AA89BDF003B999A /* Supporting Files */, 131 | ); 132 | path = CoreTFManagerVC; 133 | sourceTree = ""; 134 | }; 135 | D6D239571AA89BDF003B999A /* Supporting Files */ = { 136 | isa = PBXGroup; 137 | children = ( 138 | EE5A8A571AA988F1000BA4AE /* Cut */, 139 | EE63201D1AA943DF007BE4FB /* UIKit.framework */, 140 | D6D239581AA89BDF003B999A /* Info.plist */, 141 | D6D239591AA89BDF003B999A /* main.m */, 142 | ); 143 | name = "Supporting Files"; 144 | sourceTree = ""; 145 | }; 146 | D6D239701AA89BDF003B999A /* CoreTFManagerVCTests */ = { 147 | isa = PBXGroup; 148 | children = ( 149 | D6D239731AA89BDF003B999A /* CoreTFManagerVCTests.m */, 150 | D6D239711AA89BDF003B999A /* Supporting Files */, 151 | ); 152 | path = CoreTFManagerVCTests; 153 | sourceTree = ""; 154 | }; 155 | D6D239711AA89BDF003B999A /* Supporting Files */ = { 156 | isa = PBXGroup; 157 | children = ( 158 | D6D239721AA89BDF003B999A /* Info.plist */, 159 | ); 160 | name = "Supporting Files"; 161 | sourceTree = ""; 162 | }; 163 | EE5A8A571AA988F1000BA4AE /* Cut */ = { 164 | isa = PBXGroup; 165 | children = ( 166 | EE5A8A581AA989C8000BA4AE /* 1.png */, 167 | EE5A8A591AA989C8000BA4AE /* 2.png */, 168 | EE5A8A5A1AA989C8000BA4AE /* 3.png */, 169 | ); 170 | path = Cut; 171 | sourceTree = ""; 172 | }; 173 | EE8228DC1AC17026004049D7 /* CoreTFManagerVC */ = { 174 | isa = PBXGroup; 175 | children = ( 176 | EE8228DD1AC17026004049D7 /* CoreTFManagerVC.h */, 177 | EE8228DE1AC17026004049D7 /* CoreTFManagerVC.m */, 178 | EE8228DF1AC17026004049D7 /* Lib */, 179 | ); 180 | path = CoreTFManagerVC; 181 | sourceTree = ""; 182 | }; 183 | EE8228DF1AC17026004049D7 /* Lib */ = { 184 | isa = PBXGroup; 185 | children = ( 186 | CEBEE5FE1C10681600BAA16B /* CoreTFManagerVC.bundle */, 187 | EE8228E01AC17026004049D7 /* CoreTFKeyBoardToolBarView.h */, 188 | EE8228E11AC17026004049D7 /* CoreTFKeyBoardToolBarView.m */, 189 | EE8228E21AC17026004049D7 /* CoreTFKeyBoardToolBarView.xib */, 190 | EE8228E31AC17026004049D7 /* TFModel.h */, 191 | EE8228E41AC17026004049D7 /* TFModel.m */, 192 | ); 193 | path = Lib; 194 | sourceTree = ""; 195 | }; 196 | /* End PBXGroup section */ 197 | 198 | /* Begin PBXNativeTarget section */ 199 | D6D239531AA89BDF003B999A /* CoreTFManagerVC */ = { 200 | isa = PBXNativeTarget; 201 | buildConfigurationList = D6D239771AA89BDF003B999A /* Build configuration list for PBXNativeTarget "CoreTFManagerVC" */; 202 | buildPhases = ( 203 | D6D239501AA89BDF003B999A /* Sources */, 204 | D6D239511AA89BDF003B999A /* Frameworks */, 205 | D6D239521AA89BDF003B999A /* Resources */, 206 | ); 207 | buildRules = ( 208 | ); 209 | dependencies = ( 210 | ); 211 | name = CoreTFManagerVC; 212 | productName = CoreTFManagerVC; 213 | productReference = D6D239541AA89BDF003B999A /* CoreTFManagerVC.app */; 214 | productType = "com.apple.product-type.application"; 215 | }; 216 | D6D2396C1AA89BDF003B999A /* CoreTFManagerVCTests */ = { 217 | isa = PBXNativeTarget; 218 | buildConfigurationList = D6D2397A1AA89BDF003B999A /* Build configuration list for PBXNativeTarget "CoreTFManagerVCTests" */; 219 | buildPhases = ( 220 | D6D239691AA89BDF003B999A /* Sources */, 221 | D6D2396A1AA89BDF003B999A /* Frameworks */, 222 | D6D2396B1AA89BDF003B999A /* Resources */, 223 | ); 224 | buildRules = ( 225 | ); 226 | dependencies = ( 227 | D6D2396F1AA89BDF003B999A /* PBXTargetDependency */, 228 | ); 229 | name = CoreTFManagerVCTests; 230 | productName = CoreTFManagerVCTests; 231 | productReference = D6D2396D1AA89BDF003B999A /* CoreTFManagerVCTests.xctest */; 232 | productType = "com.apple.product-type.bundle.unit-test"; 233 | }; 234 | /* End PBXNativeTarget section */ 235 | 236 | /* Begin PBXProject section */ 237 | D6D2394C1AA89BDF003B999A /* Project object */ = { 238 | isa = PBXProject; 239 | attributes = { 240 | LastUpgradeCheck = 0610; 241 | ORGANIZATIONNAME = "沐汐"; 242 | TargetAttributes = { 243 | D6D239531AA89BDF003B999A = { 244 | CreatedOnToolsVersion = 6.1; 245 | }; 246 | D6D2396C1AA89BDF003B999A = { 247 | CreatedOnToolsVersion = 6.1; 248 | TestTargetID = D6D239531AA89BDF003B999A; 249 | }; 250 | }; 251 | }; 252 | buildConfigurationList = D6D2394F1AA89BDF003B999A /* Build configuration list for PBXProject "CoreTFManagerVC" */; 253 | compatibilityVersion = "Xcode 3.2"; 254 | developmentRegion = English; 255 | hasScannedForEncodings = 0; 256 | knownRegions = ( 257 | en, 258 | Base, 259 | ); 260 | mainGroup = D6D2394B1AA89BDF003B999A; 261 | productRefGroup = D6D239551AA89BDF003B999A /* Products */; 262 | projectDirPath = ""; 263 | projectRoot = ""; 264 | targets = ( 265 | D6D239531AA89BDF003B999A /* CoreTFManagerVC */, 266 | D6D2396C1AA89BDF003B999A /* CoreTFManagerVCTests */, 267 | ); 268 | }; 269 | /* End PBXProject section */ 270 | 271 | /* Begin PBXResourcesBuildPhase section */ 272 | D6D239521AA89BDF003B999A /* Resources */ = { 273 | isa = PBXResourcesBuildPhase; 274 | buildActionMask = 2147483647; 275 | files = ( 276 | D6D239631AA89BDF003B999A /* Main.storyboard in Resources */, 277 | EE5A8A5C1AA989C8000BA4AE /* 2.png in Resources */, 278 | EE5A8A5D1AA989C8000BA4AE /* 3.png in Resources */, 279 | EE8228E71AC17026004049D7 /* CoreTFKeyBoardToolBarView.xib in Resources */, 280 | D6D239681AA89BDF003B999A /* LaunchScreen.xib in Resources */, 281 | D6D239841AA89DFA003B999A /* NormalViewVC.xib in Resources */, 282 | EE63202B1AA954B9007BE4FB /* ScrollViewVC.xib in Resources */, 283 | D6D239651AA89BDF003B999A /* Images.xcassets in Resources */, 284 | EE5A8A5B1AA989C8000BA4AE /* 1.png in Resources */, 285 | CEBEE5FF1C10681600BAA16B /* CoreTFManagerVC.bundle in Resources */, 286 | ); 287 | runOnlyForDeploymentPostprocessing = 0; 288 | }; 289 | D6D2396B1AA89BDF003B999A /* Resources */ = { 290 | isa = PBXResourcesBuildPhase; 291 | buildActionMask = 2147483647; 292 | files = ( 293 | ); 294 | runOnlyForDeploymentPostprocessing = 0; 295 | }; 296 | /* End PBXResourcesBuildPhase section */ 297 | 298 | /* Begin PBXSourcesBuildPhase section */ 299 | D6D239501AA89BDF003B999A /* Sources */ = { 300 | isa = PBXSourcesBuildPhase; 301 | buildActionMask = 2147483647; 302 | files = ( 303 | D6D2395D1AA89BDF003B999A /* AppDelegate.m in Sources */, 304 | EE8228E51AC17026004049D7 /* CoreTFManagerVC.m in Sources */, 305 | EE8228E61AC17026004049D7 /* CoreTFKeyBoardToolBarView.m in Sources */, 306 | EE6320291AA954AA007BE4FB /* ScrollViewVC.m in Sources */, 307 | D6D2395A1AA89BDF003B999A /* main.m in Sources */, 308 | D6D239831AA89DFA003B999A /* NormalViewVC.m in Sources */, 309 | D6D2397F1AA89CB8003B999A /* HomeTVC.m in Sources */, 310 | EE8228E81AC17026004049D7 /* TFModel.m in Sources */, 311 | ); 312 | runOnlyForDeploymentPostprocessing = 0; 313 | }; 314 | D6D239691AA89BDF003B999A /* Sources */ = { 315 | isa = PBXSourcesBuildPhase; 316 | buildActionMask = 2147483647; 317 | files = ( 318 | D6D239741AA89BDF003B999A /* CoreTFManagerVCTests.m in Sources */, 319 | ); 320 | runOnlyForDeploymentPostprocessing = 0; 321 | }; 322 | /* End PBXSourcesBuildPhase section */ 323 | 324 | /* Begin PBXTargetDependency section */ 325 | D6D2396F1AA89BDF003B999A /* PBXTargetDependency */ = { 326 | isa = PBXTargetDependency; 327 | target = D6D239531AA89BDF003B999A /* CoreTFManagerVC */; 328 | targetProxy = D6D2396E1AA89BDF003B999A /* PBXContainerItemProxy */; 329 | }; 330 | /* End PBXTargetDependency section */ 331 | 332 | /* Begin PBXVariantGroup section */ 333 | D6D239611AA89BDF003B999A /* Main.storyboard */ = { 334 | isa = PBXVariantGroup; 335 | children = ( 336 | D6D239621AA89BDF003B999A /* Base */, 337 | ); 338 | name = Main.storyboard; 339 | sourceTree = ""; 340 | }; 341 | D6D239661AA89BDF003B999A /* LaunchScreen.xib */ = { 342 | isa = PBXVariantGroup; 343 | children = ( 344 | D6D239671AA89BDF003B999A /* Base */, 345 | ); 346 | name = LaunchScreen.xib; 347 | sourceTree = ""; 348 | }; 349 | /* End PBXVariantGroup section */ 350 | 351 | /* Begin XCBuildConfiguration section */ 352 | D6D239751AA89BDF003B999A /* Debug */ = { 353 | isa = XCBuildConfiguration; 354 | buildSettings = { 355 | ALWAYS_SEARCH_USER_PATHS = NO; 356 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 357 | CLANG_CXX_LIBRARY = "libc++"; 358 | CLANG_ENABLE_MODULES = YES; 359 | CLANG_ENABLE_OBJC_ARC = YES; 360 | CLANG_WARN_BOOL_CONVERSION = YES; 361 | CLANG_WARN_CONSTANT_CONVERSION = YES; 362 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 363 | CLANG_WARN_EMPTY_BODY = YES; 364 | CLANG_WARN_ENUM_CONVERSION = YES; 365 | CLANG_WARN_INT_CONVERSION = YES; 366 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 367 | CLANG_WARN_UNREACHABLE_CODE = YES; 368 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 369 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 370 | COPY_PHASE_STRIP = NO; 371 | ENABLE_STRICT_OBJC_MSGSEND = YES; 372 | GCC_C_LANGUAGE_STANDARD = gnu99; 373 | GCC_DYNAMIC_NO_PIC = NO; 374 | GCC_OPTIMIZATION_LEVEL = 0; 375 | GCC_PREPROCESSOR_DEFINITIONS = ( 376 | "DEBUG=1", 377 | "$(inherited)", 378 | ); 379 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 380 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 381 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 382 | GCC_WARN_UNDECLARED_SELECTOR = YES; 383 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 384 | GCC_WARN_UNUSED_FUNCTION = YES; 385 | GCC_WARN_UNUSED_VARIABLE = YES; 386 | IPHONEOS_DEPLOYMENT_TARGET = 8.1; 387 | MTL_ENABLE_DEBUG_INFO = YES; 388 | ONLY_ACTIVE_ARCH = YES; 389 | SDKROOT = iphoneos; 390 | }; 391 | name = Debug; 392 | }; 393 | D6D239761AA89BDF003B999A /* Release */ = { 394 | isa = XCBuildConfiguration; 395 | buildSettings = { 396 | ALWAYS_SEARCH_USER_PATHS = NO; 397 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 398 | CLANG_CXX_LIBRARY = "libc++"; 399 | CLANG_ENABLE_MODULES = YES; 400 | CLANG_ENABLE_OBJC_ARC = YES; 401 | CLANG_WARN_BOOL_CONVERSION = YES; 402 | CLANG_WARN_CONSTANT_CONVERSION = YES; 403 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 404 | CLANG_WARN_EMPTY_BODY = YES; 405 | CLANG_WARN_ENUM_CONVERSION = YES; 406 | CLANG_WARN_INT_CONVERSION = YES; 407 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 408 | CLANG_WARN_UNREACHABLE_CODE = YES; 409 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 410 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 411 | COPY_PHASE_STRIP = YES; 412 | ENABLE_NS_ASSERTIONS = NO; 413 | ENABLE_STRICT_OBJC_MSGSEND = YES; 414 | GCC_C_LANGUAGE_STANDARD = gnu99; 415 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 416 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 417 | GCC_WARN_UNDECLARED_SELECTOR = YES; 418 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 419 | GCC_WARN_UNUSED_FUNCTION = YES; 420 | GCC_WARN_UNUSED_VARIABLE = YES; 421 | IPHONEOS_DEPLOYMENT_TARGET = 8.1; 422 | MTL_ENABLE_DEBUG_INFO = NO; 423 | SDKROOT = iphoneos; 424 | VALIDATE_PRODUCT = YES; 425 | }; 426 | name = Release; 427 | }; 428 | D6D239781AA89BDF003B999A /* Debug */ = { 429 | isa = XCBuildConfiguration; 430 | buildSettings = { 431 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 432 | INFOPLIST_FILE = CoreTFManagerVC/Info.plist; 433 | IPHONEOS_DEPLOYMENT_TARGET = 6.0; 434 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 435 | PRODUCT_NAME = "$(TARGET_NAME)"; 436 | }; 437 | name = Debug; 438 | }; 439 | D6D239791AA89BDF003B999A /* Release */ = { 440 | isa = XCBuildConfiguration; 441 | buildSettings = { 442 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 443 | INFOPLIST_FILE = CoreTFManagerVC/Info.plist; 444 | IPHONEOS_DEPLOYMENT_TARGET = 6.0; 445 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 446 | PRODUCT_NAME = "$(TARGET_NAME)"; 447 | }; 448 | name = Release; 449 | }; 450 | D6D2397B1AA89BDF003B999A /* Debug */ = { 451 | isa = XCBuildConfiguration; 452 | buildSettings = { 453 | BUNDLE_LOADER = "$(TEST_HOST)"; 454 | FRAMEWORK_SEARCH_PATHS = ( 455 | "$(SDKROOT)/Developer/Library/Frameworks", 456 | "$(inherited)", 457 | ); 458 | GCC_PREPROCESSOR_DEFINITIONS = ( 459 | "DEBUG=1", 460 | "$(inherited)", 461 | ); 462 | INFOPLIST_FILE = CoreTFManagerVCTests/Info.plist; 463 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 464 | PRODUCT_NAME = "$(TARGET_NAME)"; 465 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/CoreTFManagerVC.app/CoreTFManagerVC"; 466 | }; 467 | name = Debug; 468 | }; 469 | D6D2397C1AA89BDF003B999A /* Release */ = { 470 | isa = XCBuildConfiguration; 471 | buildSettings = { 472 | BUNDLE_LOADER = "$(TEST_HOST)"; 473 | FRAMEWORK_SEARCH_PATHS = ( 474 | "$(SDKROOT)/Developer/Library/Frameworks", 475 | "$(inherited)", 476 | ); 477 | INFOPLIST_FILE = CoreTFManagerVCTests/Info.plist; 478 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 479 | PRODUCT_NAME = "$(TARGET_NAME)"; 480 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/CoreTFManagerVC.app/CoreTFManagerVC"; 481 | }; 482 | name = Release; 483 | }; 484 | /* End XCBuildConfiguration section */ 485 | 486 | /* Begin XCConfigurationList section */ 487 | D6D2394F1AA89BDF003B999A /* Build configuration list for PBXProject "CoreTFManagerVC" */ = { 488 | isa = XCConfigurationList; 489 | buildConfigurations = ( 490 | D6D239751AA89BDF003B999A /* Debug */, 491 | D6D239761AA89BDF003B999A /* Release */, 492 | ); 493 | defaultConfigurationIsVisible = 0; 494 | defaultConfigurationName = Release; 495 | }; 496 | D6D239771AA89BDF003B999A /* Build configuration list for PBXNativeTarget "CoreTFManagerVC" */ = { 497 | isa = XCConfigurationList; 498 | buildConfigurations = ( 499 | D6D239781AA89BDF003B999A /* Debug */, 500 | D6D239791AA89BDF003B999A /* Release */, 501 | ); 502 | defaultConfigurationIsVisible = 0; 503 | defaultConfigurationName = Release; 504 | }; 505 | D6D2397A1AA89BDF003B999A /* Build configuration list for PBXNativeTarget "CoreTFManagerVCTests" */ = { 506 | isa = XCConfigurationList; 507 | buildConfigurations = ( 508 | D6D2397B1AA89BDF003B999A /* Debug */, 509 | D6D2397C1AA89BDF003B999A /* Release */, 510 | ); 511 | defaultConfigurationIsVisible = 0; 512 | defaultConfigurationName = Release; 513 | }; 514 | /* End XCConfigurationList section */ 515 | }; 516 | rootObject = D6D2394C1AA89BDF003B999A /* Project object */; 517 | } 518 | --------------------------------------------------------------------------------