2013-11-27 76 views
6

請,你能糾正我的代碼,所以我有一個簡單的應用程序與文本字段,當鍵盤結束時向上移動的例子嗎?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://stackoverflow.com/questions/7193787/keyboard-scroll-on-active-text-field-scrolling-to-out-of-view) –

+0

我不明白爲什麼它應該是重複的。 –

+0

請嘗試https://github.com/simonbs/BSKeyboardControls – Vinodh

回答

31

向上移動文本框,同時單擊它,使用下面的代碼。它需要你的滾動的唯一出路

- (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]; 
1

更改了一個功能:

- (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]; 
}} 
0
-(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); 
     }]; 
    } 
} 
6

下面是使用夫特溶液:

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

0

的UITextField * activeField; 爲activeField你在.m文件

9

在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

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

相關問題