Skip to content

Commit f2a29f3

Browse files
committed
Enhanced UIScrollView support
1 parent 00a9d71 commit f2a29f3

File tree

15 files changed

+1929
-502
lines changed

15 files changed

+1929
-502
lines changed

KeyboardTextFieldDemo/IQKeyBoardManager/IQKeyboardManager.m

Lines changed: 47 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -353,22 +353,22 @@ -(void)adjustFrame
353353
// Getting it's superScrollView.
354354
UIScrollView *superScrollView = [IQKeyboardManager superScrollView:textFieldView];
355355

356-
while (superScrollView)
357-
{
358-
//Getting textFieldViewRect
359-
CGRect textFieldViewRect = [[textFieldView superview] convertRect:textFieldView.frame toView:superScrollView];
360-
361-
//If scrollView is scrollable to show TextField.
362-
if (textFieldViewRect.origin.y>move)
363-
{
364-
break;
365-
}
366-
//Getting it's superScrollView.
367-
else
368-
{
369-
superScrollView = [IQKeyboardManager superScrollView:superScrollView];
370-
}
371-
}
356+
// while (superScrollView)
357+
// {
358+
// //Getting textFieldViewRect
359+
// CGRect textFieldViewRect = [[textFieldView superview] convertRect:textFieldView.frame toView:superScrollView];
360+
//
361+
// //If scrollView is scrollable to show TextField.
362+
// if (textFieldViewRect.origin.y>move)
363+
// {
364+
// break;
365+
// }
366+
// //Getting it's superScrollView.
367+
// else
368+
// {
369+
// superScrollView = [IQKeyboardManager superScrollView:superScrollView];
370+
// }
371+
// }
372372

373373
//If there was a lastScrollView.
374374
if (lastScrollView)
@@ -399,13 +399,30 @@ -(void)adjustFrame
399399
// If we found lastScrollView then setting it's contentOffset to show textField.
400400
if (lastScrollView)
401401
{
402-
[lastScrollView setContentOffset:CGPointMake(lastScrollView.contentOffset.x, lastScrollView.contentOffset.y - MIN(lastScrollView.contentOffset.y,-move)) animated:YES];
402+
UIView *lastView = textFieldView;
403+
UIScrollView *superScrollView = lastScrollView;
404+
405+
while (move>0 && superScrollView)
406+
{
407+
CGRect lastViewRect = [[lastView superview] convertRect:lastView.frame toView:superScrollView];
408+
409+
CGFloat shouldOffsetY = superScrollView.contentOffset.y - MIN(superScrollView.contentOffset.y,-move);
410+
shouldOffsetY = MIN(shouldOffsetY, lastViewRect.origin.y-5); //-5 is for good UI.
411+
412+
move -= (shouldOffsetY-superScrollView.contentOffset.y);
413+
[superScrollView setContentOffset:CGPointMake(superScrollView.contentOffset.x, shouldOffsetY) animated:YES];
414+
415+
// Getting it's superScrollView.
416+
lastView = superScrollView;
417+
superScrollView = [IQKeyboardManager superScrollView:lastView];
418+
419+
}
403420
}
404421
// New code end.
405422

406423

407424
// Special case for iPad modalPresentationStyle.
408-
else if ([[IQKeyboardManager topMostController] modalPresentationStyle] == UIModalPresentationFormSheet ||
425+
if ([[IQKeyboardManager topMostController] modalPresentationStyle] == UIModalPresentationFormSheet ||
409426
[[IQKeyboardManager topMostController] modalPresentationStyle] == UIModalPresentationPageSheet)
410427
{
411428
// Positive or zero.
@@ -614,7 +631,7 @@ -(NSArray*)responderViews
614631
NSMutableArray *textFields = [[NSMutableArray alloc] init];
615632

616633
for (UITextField *textField in siblings)
617-
if ([textField isKindOfClass:[UITextField class]] || [textField isKindOfClass:[UITextView class]])
634+
if (([textField isKindOfClass:[UITextField class]] || [textField isKindOfClass:[UITextView class]]) && textField.userInteractionEnabled && textField.enabled)
618635
[textFields addObject:textField];
619636

620637
//If autoToolbar behaviour is bySubviews, then returning it.
@@ -659,17 +676,17 @@ -(void)addToolbarIfRequired
659676
if (![textField inputAccessoryView])
660677
{
661678
[textField addPreviousNextDoneOnKeyboardWithTarget:self previousAction:@selector(previousAction:) nextAction:@selector(nextAction:) doneAction:@selector(doneAction:)];
662-
}
663-
664-
// If firstTextField, then previous should not be enabled.
665-
if ([siblings objectAtIndex:0] == textField)
666-
{
667-
[textField setEnablePrevious:NO next:YES];
668-
}
669-
// If lastTextField then next should not be enaled.
670-
else if ([siblings lastObject] == textField)
671-
{
672-
[textField setEnablePrevious:YES next:NO];
679+
680+
// If firstTextField, then previous should not be enabled.
681+
if ([siblings objectAtIndex:0] == textField)
682+
{
683+
[textField setEnablePrevious:NO next:YES];
684+
}
685+
// If lastTextField then next should not be enaled.
686+
else if ([siblings lastObject] == textField)
687+
{
688+
[textField setEnablePrevious:YES next:NO];
689+
}
673690
}
674691
}
675692
}

KeyboardTextFieldDemo/KeyboardTextFieldDemo.xcodeproj/project.pbxproj

Lines changed: 14 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,12 @@
1111
AFF236C117CA224400760F6C /* IQKeyboardManager.m in Sources */ = {isa = PBXBuildFile; fileRef = AFF236BE17CA224400760F6C /* IQKeyboardManager.m */; };
1212
C00EAA6F1858D5A500968DE2 /* ScrollViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = C00EAA6D1858D5A500968DE2 /* ScrollViewController.xib */; };
1313
C07E20B51858FF54001699A8 /* ScrollViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = C07E20B41858FF54001699A8 /* ScrollViewController.m */; };
14-
C07E20BC18590085001699A8 /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = C07E20B718590085001699A8 /* ViewController.m */; };
15-
C07E20BD18590085001699A8 /* ViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = C07E20B818590085001699A8 /* ViewController.xib */; };
1614
C07E20BE18590085001699A8 /* WebViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = C07E20BA18590085001699A8 /* WebViewController.m */; };
17-
C07E20BF18590085001699A8 /* WebViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = C07E20BB18590085001699A8 /* WebViewController.xib */; };
1815
C07E20C3185900BD001699A8 /* TextFieldViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = C07E20C1185900BD001699A8 /* TextFieldViewController.m */; };
1916
C07E20C4185900BD001699A8 /* TextFieldViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = C07E20C2185900BD001699A8 /* TextFieldViewController.xib */; };
17+
C0827BAD185A24C90012EE91 /* ViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = C0827BAC185A24C90012EE91 /* ViewController.xib */; };
18+
C0827BBE185A2A360012EE91 /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = C0827BBD185A2A360012EE91 /* ViewController.m */; };
19+
C0827BC1185A2B540012EE91 /* WebViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = C0827BC0185A2B540012EE91 /* WebViewController.xib */; };
2020
C0917F291858821500B9FD31 /* IQButtonBarArrowLeft@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = C0917F271858821500B9FD31 /* IQButtonBarArrowLeft@2x.png */; };
2121
C0917F2A1858821500B9FD31 /* IQButtonBarArrowRight@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = C0917F281858821500B9FD31 /* IQButtonBarArrowRight@2x.png */; };
2222
C0B63BA01781FAB1008D3B64 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C0B63B9F1781FAB1008D3B64 /* UIKit.framework */; };
@@ -28,21 +28,21 @@
2828
/* End PBXBuildFile section */
2929

3030
/* Begin PBXFileReference section */
31-
AF4301B9179E92C400FADAC6 /* Default-568h@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default-568h@2x.png"; sourceTree = "<group>"; };
31+
AF4301B9179E92C400FADAC6 /* Default-568h@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Default-568h@2x.png"; path = "../Default-568h@2x.png"; sourceTree = "<group>"; };
3232
AFF236BD17CA224400760F6C /* IQKeyboardManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IQKeyboardManager.h; sourceTree = "<group>"; };
3333
AFF236BE17CA224400760F6C /* IQKeyboardManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IQKeyboardManager.m; sourceTree = "<group>"; };
3434
C00EAA6B1858D5A500968DE2 /* ScrollViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ScrollViewController.h; sourceTree = "<group>"; };
3535
C00EAA6D1858D5A500968DE2 /* ScrollViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = ScrollViewController.xib; sourceTree = "<group>"; };
3636
C07E20B41858FF54001699A8 /* ScrollViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ScrollViewController.m; sourceTree = "<group>"; };
3737
C07E20B618590085001699A8 /* ViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ViewController.h; sourceTree = "<group>"; };
38-
C07E20B718590085001699A8 /* ViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ViewController.m; sourceTree = "<group>"; };
39-
C07E20B818590085001699A8 /* ViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = ViewController.xib; sourceTree = "<group>"; };
4038
C07E20B918590085001699A8 /* WebViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebViewController.h; sourceTree = "<group>"; };
4139
C07E20BA18590085001699A8 /* WebViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WebViewController.m; sourceTree = "<group>"; };
42-
C07E20BB18590085001699A8 /* WebViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = WebViewController.xib; sourceTree = "<group>"; };
4340
C07E20C0185900BD001699A8 /* TextFieldViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TextFieldViewController.h; sourceTree = "<group>"; };
4441
C07E20C1185900BD001699A8 /* TextFieldViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TextFieldViewController.m; sourceTree = "<group>"; };
4542
C07E20C2185900BD001699A8 /* TextFieldViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = TextFieldViewController.xib; sourceTree = "<group>"; };
43+
C0827BAC185A24C90012EE91 /* ViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = ViewController.xib; sourceTree = "<group>"; };
44+
C0827BBD185A2A360012EE91 /* ViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ViewController.m; sourceTree = "<group>"; };
45+
C0827BC0185A2B540012EE91 /* WebViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = WebViewController.xib; sourceTree = "<group>"; };
4646
C0917F271858821500B9FD31 /* IQButtonBarArrowLeft@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "IQButtonBarArrowLeft@2x.png"; sourceTree = "<group>"; };
4747
C0917F281858821500B9FD31 /* IQButtonBarArrowRight@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "IQButtonBarArrowRight@2x.png"; sourceTree = "<group>"; };
4848
C0B63B9B1781FAB1008D3B64 /* KeyboardTextFieldDemo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = KeyboardTextFieldDemo.app; sourceTree = BUILT_PRODUCTS_DIR; };
@@ -82,18 +82,9 @@
8282
path = IQKeyBoardManager;
8383
sourceTree = "<group>";
8484
};
85-
C0917EEC18586BF100B9FD31 /* Images */ = {
86-
isa = PBXGroup;
87-
children = (
88-
);
89-
name = Images;
90-
sourceTree = "<group>";
91-
};
9285
C0B63B901781FAB0008D3B64 = {
9386
isa = PBXGroup;
9487
children = (
95-
C0917EEC18586BF100B9FD31 /* Images */,
96-
AF4301B9179E92C400FADAC6 /* Default-568h@2x.png */,
9788
AFF236BC17CA224400760F6C /* IQKeyBoardManager */,
9889
C0B63BA51781FAB1008D3B64 /* KeyboardTextFieldDemo */,
9990
C0B63B9E1781FAB1008D3B64 /* Frameworks */,
@@ -125,8 +116,8 @@
125116
C0B63BAE1781FAB1008D3B64 /* AppDelegate.h */,
126117
C0B63BAF1781FAB1008D3B64 /* AppDelegate.m */,
127118
C07E20B618590085001699A8 /* ViewController.h */,
128-
C07E20B718590085001699A8 /* ViewController.m */,
129-
C07E20B818590085001699A8 /* ViewController.xib */,
119+
C0827BBD185A2A360012EE91 /* ViewController.m */,
120+
C0827BAC185A24C90012EE91 /* ViewController.xib */,
130121
C07E20C0185900BD001699A8 /* TextFieldViewController.h */,
131122
C07E20C1185900BD001699A8 /* TextFieldViewController.m */,
132123
C07E20C2185900BD001699A8 /* TextFieldViewController.xib */,
@@ -135,7 +126,7 @@
135126
C00EAA6D1858D5A500968DE2 /* ScrollViewController.xib */,
136127
C07E20B918590085001699A8 /* WebViewController.h */,
137128
C07E20BA18590085001699A8 /* WebViewController.m */,
138-
C07E20BB18590085001699A8 /* WebViewController.xib */,
129+
C0827BC0185A2B540012EE91 /* WebViewController.xib */,
139130
C0B63BA61781FAB1008D3B64 /* Supporting Files */,
140131
);
141132
path = KeyboardTextFieldDemo;
@@ -144,6 +135,7 @@
144135
C0B63BA61781FAB1008D3B64 /* Supporting Files */ = {
145136
isa = PBXGroup;
146137
children = (
138+
AF4301B9179E92C400FADAC6 /* Default-568h@2x.png */,
147139
C0B63BA71781FAB1008D3B64 /* KeyboardTextFieldDemo-Info.plist */,
148140
C0B63BA81781FAB1008D3B64 /* InfoPlist.strings */,
149141
C0B63BAB1781FAB1008D3B64 /* main.m */,
@@ -208,9 +200,9 @@
208200
AF4301BA179E92C400FADAC6 /* Default-568h@2x.png in Resources */,
209201
C0917F291858821500B9FD31 /* IQButtonBarArrowLeft@2x.png in Resources */,
210202
C00EAA6F1858D5A500968DE2 /* ScrollViewController.xib in Resources */,
211-
C07E20BD18590085001699A8 /* ViewController.xib in Resources */,
212-
C07E20BF18590085001699A8 /* WebViewController.xib in Resources */,
213203
C07E20C4185900BD001699A8 /* TextFieldViewController.xib in Resources */,
204+
C0827BAD185A24C90012EE91 /* ViewController.xib in Resources */,
205+
C0827BC1185A2B540012EE91 /* WebViewController.xib in Resources */,
214206
);
215207
runOnlyForDeploymentPostprocessing = 0;
216208
};
@@ -225,9 +217,9 @@
225217
C0B63BB01781FAB1008D3B64 /* AppDelegate.m in Sources */,
226218
AFF236C117CA224400760F6C /* IQKeyboardManager.m in Sources */,
227219
C07E20B51858FF54001699A8 /* ScrollViewController.m in Sources */,
228-
C07E20BC18590085001699A8 /* ViewController.m in Sources */,
229220
C07E20BE18590085001699A8 /* WebViewController.m in Sources */,
230221
C07E20C3185900BD001699A8 /* TextFieldViewController.m in Sources */,
222+
C0827BBE185A2A360012EE91 /* ViewController.m in Sources */,
231223
);
232224
runOnlyForDeploymentPostprocessing = 0;
233225
};

KeyboardTextFieldDemo/KeyboardTextFieldDemo/AppDelegate.m

Lines changed: 6 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(
1919
{
2020
//Enabling keyboard manager
2121
[[IQKeyboardManager sharedManager] setEnable:YES];
22-
22+
[[IQKeyboardManager sharedManager] setKeyboardDistanceFromTextField:15];
2323
//Enabling autoToolbar behaviour. If It is set to NO. You have to manually create UIToolbar for keyboard.
2424
[[IQKeyboardManager sharedManager] setEnableAutoToolbar:YES];
2525

@@ -31,22 +31,12 @@ - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(
3131

3232
// Uncomment-Comment this line to test on WebView.
3333
self.viewController = [[ViewController alloc] init];
34-
// self.viewController = [[WebViewController alloc] init];
35-
// self.viewController = [[ScrollViewController alloc] init];
36-
// Case 1. UIViewController as rootViewController.
37-
if (true)
38-
{
39-
self.window.rootViewController = self.viewController;
40-
}
41-
// Case 2. UINavigationController as rootViewController.
42-
else
43-
{
44-
UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:self.viewController];
45-
[navController.navigationBar setTranslucent:NO];
46-
[navController.navigationBar setBarStyle:UIBarStyleBlackOpaque];
47-
self.window.rootViewController = navController;
48-
}
4934

35+
UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:self.viewController];
36+
[navController.navigationBar setTranslucent:NO];
37+
[navController.navigationBar setBarStyle:UIBarStyleBlackOpaque];
38+
self.window.rootViewController = navController;
39+
5040
[self.window makeKeyAndVisible];
5141
return YES;
5242
}

KeyboardTextFieldDemo/KeyboardTextFieldDemo/ScrollViewController.h

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,19 @@
88

99
#import <UIKit/UIKit.h>
1010

11-
@interface ScrollViewController : UIViewController<UITableViewDataSource,UITableViewDelegate>
11+
@interface ScrollViewController : UIViewController<UITableViewDataSource,UITableViewDelegate,UITextFieldDelegate,UITextViewDelegate>
1212
{
1313
IBOutlet UIScrollView *scrollViewDemo;
14+
IBOutlet UITableView *simpleTableView;
15+
IBOutlet UIScrollView *scrollViewOfTableViews;
16+
IBOutlet UITableView *tableViewInsideScrollView;
17+
IBOutlet UIScrollView *scrollViewInsideScrollView;
18+
19+
20+
IBOutlet UITextField *topTextField;
21+
IBOutlet UITextField *bottomTextField;
22+
23+
IBOutlet UITextView *topTextView;
24+
IBOutlet UITextView *bottomTextView;
1425
}
1526
@end

0 commit comments

Comments
 (0)