├── 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 | 
86 | 
87 | 
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 |
--------------------------------------------------------------------------------