ios移动滚动视图时,键盘结束文本字段

问题描述:

请,你能纠正我的代码,所以我有一个简单的应用程序与文本字段,当键盘结束时向上移动的例子吗?ios移动滚动视图时,键盘结束文本字段

我尝试使用代码从iOS开发者库https://developer.apple.com/library/ios/documentation/StringsTextFonts/Conceptual/TextAndWebiPhoneOS/KeyboardManagement/KeyboardManagement.html

来实现它,但我不知道他们所说的“有源现场被存储在一个自定义变量(在这个例子叫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 
+1

[键盘在活动文本字段上滚动 - 滚动到视图外?](http://*.com/questions/7193787/keyboard-scroll-on-active-text-field-scrolling-to-out-of-view) –

+0

我不明白为什么它应该是重复的。 –

+0

请尝试https://github.com/simonbs/BSKeyboardControls – Vinodh

向上移动文本框,同时单击它,使用下面的代码。它需要你的滚动的唯一出路

- (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

https://github.com/simonbs/BSKeyboardControls#usage

更改了一个功能:

- (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 
    } 

} 
+1

嗯这不适合我... –

+0

@VincentvanLeeuwen它应该工作。你是否在界面构建器中连接了ScrollView和所有TextField IBOutlet? – Homam

+0

完美的作品,谢谢你! – Wilson

的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; 
    } 
+0

这正是大多数用户对基于scrollview的表单的期望。谢谢! – Mike

+0

只是很好和完美的解决方案。 –