ios移动滚动视图时,键盘结束文本字段
请,你能纠正我的代码,所以我有一个简单的应用程序与文本字段,当键盘结束时向上移动的例子吗?ios移动滚动视图时,键盘结束文本字段
来实现它,但我不知道他们所说的“有源现场被存储在一个自定义变量(在这个例子叫activeField)”和我可能还有其他错误。在viewWillAppear中使用registerForKeyboardNotifications是好的?
我知道这个问题有一些线索,但我是新手,很难为我理解它们。我不希望只是学习如何,但为什么,这就是为什么我不想用准备使用的解决方案从GitHub其他建议等
我的代码大气压:
.H:
#import <UIKit/UIKit.h>
@interface VNViewController : UIViewController<UIScrollViewDelegate, UITextFieldDelegate>
@property (weak, nonatomic) IBOutlet UITextField *texticek;
@property (strong, nonatomic) IBOutlet UIScrollView *scrollView;
@end
.M:
#import "VNViewController.h"
@interface VNViewController()
@end
@implementation VNViewController
@synthesize scrollView;
@synthesize texticek;
- (void) viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
[self registerForKeyboardNotifications];
}
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
// Call this method somewhere in your view controller setup code.
- (void)registerForKeyboardNotifications
{
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(keyboardWasShown:)
name:UIKeyboardDidShowNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(keyboardWillBeHidden:)
name:UIKeyboardWillHideNotification object:nil];
}
// Called when the UIKeyboardDidShowNotification is sent.
- (void)keyboardWasShown:(NSNotification*)aNotification
{
NSDictionary* info = [aNotification userInfo];
CGSize kbSize = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;
UIEdgeInsets contentInsets = UIEdgeInsetsMake(0.0, 0.0, kbSize.height, 0.0);
scrollView.contentInset = contentInsets;
scrollView.scrollIndicatorInsets = contentInsets;
// If active text field is hidden by keyboard, scroll it so it's visible
// Your app might not need or want this behavior.
CGRect aRect = self.view.frame;
aRect.size.height -= kbSize.height;
if (!CGRectContainsPoint(aRect, activeField.frame.origin)) {
[self.scrollView scrollRectToVisible:activeField.frame animated:YES];
}
}
// Called when the UIKeyboardWillHideNotification is sent
- (void)keyboardWillBeHidden:(NSNotification*)aNotification
{
UIEdgeInsets contentInsets = UIEdgeInsetsZero;
scrollView.contentInset = contentInsets;
scrollView.scrollIndicatorInsets = contentInsets;
}
- (void)textFieldDidBeginEditing:(UITextField *)textField
{
activeField = textField;
}
- (void)textFieldDidEndEditing:(UITextField *)textField
{
activeField = nil;
}
@end
向上移动文本框,同时单击它,使用下面的代码。它需要你的滚动的唯一出路
- (void)textFieldDidBeginEditing:(UITextField *)textField {
self.scroll.contentOffset = CGPointMake(0, textField.frame.origin.y);
}
你可以改变文本框的地方应减去y位置值(textfield.frame.origin.y - 一些值)出现的位置
如果你想动画,你可以做这样的滚动:
CGPoint newOffset = CGPointMake(0, textField.frame.origin.y-40);
[self.scroll setContentOffset: newOffset animated: YES];
BSKeyboardControl是一个很好的控制。您需要在视图中提供文本字段。一个实现它的一些委托方法。那么这么做太简单了。带有上一个和下一个按钮的工具栏可用于循环显示当前的文本字段。下面的链接会给你详细解释有关BSKeyboardControl
更改了一个功能:
- (void)keyboardWasShown:(NSNotification*)aNotification
{
NSDictionary* info = [aNotification userInfo];
CGSize kbSize = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;
UIEdgeInsets contentInsets = UIEdgeInsetsMake(0.0, 0.0, kbSize.height, 0.0);
scrollView.contentInset = contentInsets;
scrollView.scrollIndicatorInsets = contentInsets;
// If active text field is hidden by keyboard, scroll it so it's visible
// Your app might not need or want this behavior.
CGRect aRect = self.view.frame;
aRect.size.height -= kbSize.height;
if (!CGRectContainsPoint(aRect, activeField.frame.origin)) {
[scrollView setContentOffset:CGPointMake(0,aRect.size.height) animated:YES];
}}
-(void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
//添加键盘弹出通知
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(didChangeKeyBoardFrame:) name:UIKeyboardWillChangeFrameNotification object:nil];
}
-(void)viewDidAppear:(BOOL)animated
{
//设置原始contentSize;
[super viewDidAppear:animated];
originalSize = self.mscrollView.contentSize;
}
-(void)viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:animated];
//移除键盘弹出通知
[[NSNotificationCenter defaultCenter]removeObserver:self name:UIKeyboardWillChangeFrameNotification object:nil];
}
编译马克 - 私人
-(void)didChangeKeyBoardFrame:(NSNotification *)sender
{
CGRect endRect = [[sender.userInfo objectForKey:@"UIKeyboardFrameEndUserInfoKey"] CGRectValue];
CGPoint mf =[self.view convertPoint:CGPointMake(0,self.name_textfieldDown.frameBottom) fromView:self.mscrollView];
//does the keyboard cover my label
CGFloat distance = mf.y - endRect.origin.y;
// it mean that keyboard will hidden
if(endRect.origin.y == ScreenHeight)
{
// place scrollView back
[UIView animateWithDuration:0.25 animations:^{
self.mscrollView.contentOffset = CGPointMake(0, self.mscrollView.contentSize.height- self.mscrollView.height);
self.mscrollView.contentSize = originalSize;
}];
}
else if (distance>0)
{
//
[UIView animateWithDuration:0.25 animations:^{
CGSize contentSize = originalSize;
contentSize.height +=(endRect.size.height ) ;// I want users can drag scrollView to buttom when keyboard is showing
self.mscrollView.contentSize = contentSize;
self.mscrollView . contentOffset = CGPointMake(0, self.mscrollView.contentOffset.y + distance+20);
}];
}
}
下面是使用夫特溶液:
import UIKit
class ExampleViewController: UIViewController, UITextFieldDelegate {
@IBOutlet var scrollView: UIScrollView!
@IBOutlet var textField1: UITextField!
@IBOutlet var textField2: UITextField!
@IBOutlet var textField3: UITextField!
@IBOutlet var textField4: UITextField!
@IBOutlet var textField5: UITextField!
var activeTextField: UITextField!
// MARK: - View
override func viewDidLoad() {
super.viewDidLoad()
self.textField1.delegate = self
self.textField2.delegate = self
self.textField3.delegate = self
self.textField4.delegate = self
self.textField5.delegate = self
}
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
self.registerForKeyboardNotifications()
}
override func viewWillDisappear(animated: Bool) {
super.viewWillDisappear(animated)
self.unregisterFromKeyboardNotifications()
}
// MARK: - Keyboard
// Call this method somewhere in your view controller setup code.
func registerForKeyboardNotifications() {
let center: NSNotificationCenter = NSNotificationCenter.defaultCenter()
center.addObserver(self, selector: "keyboardWasShown:", name: UIKeyboardDidShowNotification, object: nil)
center.addObserver(self, selector: "keyboardWillBeHidden:", name: UIKeyboardWillHideNotification, object: nil)
}
func unregisterFromKeyboardNotifications() {
let center: NSNotificationCenter = NSNotificationCenter.defaultCenter()
center.removeObserver(self, name: UIKeyboardDidShowNotification, object: nil)
center.removeObserver(self, name: UIKeyboardWillHideNotification, object: nil)
}
// Called when the UIKeyboardDidShowNotification is sent.
func keyboardWasShown (notification: NSNotification) {
let info : NSDictionary = notification.userInfo!
let kbSize = (info.objectForKey(UIKeyboardFrameBeginUserInfoKey)?.CGRectValue() as CGRect!).size
let contentInsets: UIEdgeInsets = UIEdgeInsetsMake(0.0, 0.0, kbSize.height, 0.0);
scrollView.contentInset = contentInsets;
scrollView.scrollIndicatorInsets = contentInsets;
// If active text field is hidden by keyboard, scroll it so it's visible
// Your app might not need or want this behavior.
var aRect = self.view.frame
aRect.size.height -= kbSize.height;
if (!CGRectContainsPoint(aRect, self.activeTextField.frame.origin)) {
self.scrollView.scrollRectToVisible(self.activeTextField.frame, animated: true)
}
}
// Called when the UIKeyboardWillHideNotification is sent
func keyboardWillBeHidden (notification: NSNotification) {
let contentInsets = UIEdgeInsetsZero;
scrollView.contentInset = contentInsets;
scrollView.scrollIndicatorInsets = contentInsets;
}
// MARK: - Text Field
func textFieldDidBeginEditing(textField: UITextField) {
self.activeTextField = textField
}
func textFieldDidEndEditing(textField: UITextField) {
self.activeTextField = nil
}
}
的UITextField * activeField; 为activeField你在.m文件
在viewDidLoad中申报,登记通知:
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(keyboardWasShown:)
name:UIKeyboardDidShowNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(keyboardWillBeHidden:)
name:UIKeyboardWillHideNotification object:nil];
添加下面的观察者方法,它执行自动滚动键盘出现时。
- (void)keyboardWasShown:(NSNotification*)notification
{
NSDictionary *info = [notification userInfo];
CGRect keyboardRect = [[info objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue];
keyboardRect = [self.view convertRect:keyboardRect fromView:nil];
UIEdgeInsets contentInset = self.scrollView.contentInset;
contentInset.bottom = keyboardRect.size.height;
self.scrollView.contentInset = contentInset;
}
- (void)keyboardWillBeHidden:(NSNotification*)notification
{
UIEdgeInsets contentInsets = UIEdgeInsetsZero;
self.scrollView.contentInset = contentInsets;
}
#pragma mark TextField Delegates
- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
[textField resignFirstResponder];
return YES;
}
这正是大多数用户对基于scrollview的表单的期望。谢谢! – Mike
只是很好和完美的解决方案。 –
[键盘在活动文本字段上滚动 - 滚动到视图外?](http://stackoverflow.com/questions/7193787/keyboard-scroll-on-active-text-field-scrolling-to-out-of-view) –
我不明白为什么它应该是重复的。 –
请尝试https://github.com/simonbs/BSKeyboardControls – Vinodh