当键盘出现时视图仅大于屏幕时,如何在 iOS 中滚动?
Posted
技术标签:
【中文标题】当键盘出现时视图仅大于屏幕时,如何在 iOS 中滚动?【英文标题】:How do I scroll in iOS when view is only bigger than screen when keyboard appears? 【发布时间】:2013-11-01 09:38:36 【问题描述】:我是一个相当新的 iPhone 开发人员,我正在开发一个 iPhone 应用程序,该应用程序具有用户需要在多个 UITextView 中输入输入的视图。总共有 6 个 UITextView,当视图出现时,所有文本视图都是可见的,无需滚动。但是当用户单击第一个文本视图输入文本时,最后两个文本视图被键盘隐藏,我不知道如何添加滚动功能,以便用户在键盘可见时能够滚动.我正在使用 UIScrollView 但目前没有代码可以使它工作,因为我已经尝试了多种我在网上找到的不同的东西,但没有一个有效。这可能是一个简单的解决方案,但我只是没有想法并且已经卡了一段时间。任何意见是极大的赞赏。谢谢
更多信息:我正在使用最新版本的 Xcode,为 iPhone 6.1 及更高版本进行开发。我使用 Interface Builder 设置了 ScrollView 并选中了 AutoLayout 框。
【问题讨论】:
试试这个链接***.com/questions/1126726/… 感谢您的链接,但我已经看到了那个链接,但没有运气。 【参考方案1】:在您看来确实加载了以下几行
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardDidShow) name:UIKeyboardWillShowNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardDidHide) name:UIKeyboardWillHideNotification object:nil];
制作以下方法。
-(void)keyboardDidHide
scrollview.frame = YOUR_ORIGINAL_FRAME;//You should set frame when keyboard is not there
scrollview.contentSize=scrollview.frame.size;
-(void)keyboardDidShow
CGRect r = scrollview.frame;
scrollview.contentSize=scrollview.frame.size;
r.size.height - = 216;//216 is keyboard height for iPhone.
scrollview.frame = r;
【讨论】:
欢迎提出其他问题 就像我之前提到的,我是 ios 开发的新手,所以我希望这不是一个愚蠢的问题,但是当 iPhone 变为横向时,我如何获得相同的滚动行为?它在纵向上效果很好,但在横向上效果不佳。 其实我只是问了这个问题,这里是链接:***.com/questions/19876716/… 我应该开始更频繁地检查这个,因为这个答案是完美的,再次感谢! 既然你已经回答了我所有的问题,如果有机会你可以看看这个:***.com/questions/21490012/…【参考方案2】:-(BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
/* this returns the keyboard when user click on return button which is reside on keyboard */
if([text isEqualToString:@"\n"])
[textView resignFirstResponder];
[yourscrollview setContentOffset:CGPointMake(0,0)animated:YES];
return YES;
-(void)textViewDidEndEditing:(UITextView *)textView
/* it used for hide keyboard and set all control on their original position */
-(void)textViewDidBeginEditing:(UITextView *)textView
/* depending upon condition it will scroll the textview so textview can't reside behind the keyboard */
[yourscrollview setContentOffset:CGPointMake(0,textView.center.y-80)animated:YES];
i 被定义为 80 以上是因为我的要求是在键盘出现时将 textview 提升这么多,您可以输入一个适合您要求的值
【讨论】:
【参考方案3】:按照以下 2 个简单步骤进行操作
从 storyboard/xib 调整滚动视图的框架并保持 高度作为屏幕尺寸。
在您的视图控制器中为您的视图应用 contentsize,例如,
<scrollview>.contentSize=CGSizeMake(320, 700);
您将能够在滚动时看到整个滚动视图。
【讨论】:
【参考方案4】:当键盘出现时,使用以下链接自动上下移动 textview 或 textfield
https://github.com/michaeltyson/TPKeyboardAvoiding
此链接包含演示项目。您可以根据需要使用它
希望对你有帮助。
【讨论】:
【参考方案5】:你可以这样做:
// In View First add keyboard appearance and disappearance Notifications
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow) name:UIKeyboardWillShowNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide) name:UIKeyboardWillHideNotification object:nil];
// Now inside this selector method
-(void)keyboardWillShow:(NSNotification *)notify
if (!notify)
return;
NSDictionary *userInfo = [notify userInfo];
NSValue *keyboardEndFrame = ([userInfo objectForKey:UIKeyboardFrameEndUserInfoKey]);
CGRect endFrame = keyboardEndFrame.CGRectValue;
// Change the frame of the view to its parent
CGRect loginViewFrame = [loginView.superview convertRect:loginView.frame fromView:loginView];
// Check the keyboard covers the view
if (CGRectGetMinY(endFrame) < CGRectGetMaxY(loginViewFrame))
// If YES calculate Distance. Save this difference to animate back the view
difference = CGRectGetMaxY(loginViewFrame)- CGRectGetMinY(endFrame);
// animate that View
[self animateViewUp:YES withMovementDistance:difference];
// inside Will Hide
-(void)keyboardWillHide
// Animate back the view with the calculated distance
[self animateViewUp:NO withMovementDistance:difference];
- (void)animateViewUp:(BOOL)up withMovementDistance:(int)movementDistance
const float movementDuration = 0.3f;
int movement = (up ? -movementDistance : movementDistance);
[UIView animateWithDuration:movementDuration animations:^
loginView.frame = CGRectOffset(loginView.frame, 0, movement);
];
【讨论】:
以上是关于当键盘出现时视图仅大于屏幕时,如何在 iOS 中滚动?的主要内容,如果未能解决你的问题,请参考以下文章
iOS - 当文本字段在子视图内时,键盘上的 UIScroll 弹出到文本字段