Bao phủ bàn phím iPhone UITextField


120

Tôi có một ứng dụng trong đó, trong Trình tạo giao diện , tôi đã thiết lập một ứng dụng UIViewcó trường văn bản gần cuối chế độ xem. Khi tôi chạy ứng dụng và cố gắng nhập văn bản vào trường đó, bàn phím trượt lên phía trên của trường nên tôi không thể nhìn thấy nội dung mình đang nhập cho đến khi ẩn bàn phím lại.

Có ai khác gặp phải vấn đề này và tìm ra cách giải quyết hay mà không làm cho chế độ xem chính có thể cuộn hoặc di chuyển trường văn bản ra xa màn hình không?


Câu trả lời:


290

Giải pháp thông thường là trượt trường (và mọi thứ phía trên nó) lên bằng hoạt ảnh, rồi lùi xuống khi bạn hoàn thành. Bạn có thể cần đặt trường văn bản và một số mục khác vào dạng xem khác và trượt dạng xem dưới dạng một đơn vị. (Tôi gọi những thứ này là "mảng" như trong "mảng kiến ​​tạo", nhưng đó chỉ là tôi). Nhưng đây là ý tưởng chung nếu bạn không cần quá cầu kỳ.

- (void)textFieldDidBeginEditing:(UITextField *)textField
{
    [self animateTextField: textField up: YES];
}


- (void)textFieldDidEndEditing:(UITextField *)textField
{
    [self animateTextField: textField up: NO];
}

- (void) animateTextField: (UITextField*) textField up: (BOOL) up
{
    const int movementDistance = 80; // tweak as needed
    const float movementDuration = 0.3f; // tweak as needed

    int movement = (up ? -movementDistance : movementDistance);

    [UIView beginAnimations: @"anim" context: nil];
    [UIView setAnimationBeginsFromCurrentState: YES];
    [UIView setAnimationDuration: movementDuration];
    self.view.frame = CGRectOffset(self.view.frame, 0, movement);
    [UIView commitAnimations];
}

12
Thích vì bạn không đăng liên kết đến mã, mà là chính mã.
Ben Coffman

2
Một đoạn mã tuyệt vời. Không phải chỉnh sửa nó để nó hoạt động hay bất cứ thứ gì. Cảm ơn ~
James

5
Sẽ rất hữu ích nếu bạn che toàn bộ màn hình như sau: const int movementDistance = textField.frame.origin.y / 2; // tinh chỉnh khi cần thiết
conecon

3
Tôi phải đề cập rằng "Nếu bạn đang viết một ứng dụng cho iOS 4 trở lên, bạn nên sử dụng các phương pháp dựa trên khối để tạo hoạt ảnh cho nội dung của bạn." Được tham chiếu từ: developer.apple.com/library/ios/#documentation/windowsviews/…
Mathieu

1
Tìm thấy điều này và nó thảo luận về cùng một vấn đề developer.apple.com/Library/ios/documentation/StringsTextFonts/…
unom

38

Điều này làm nên điều kỳ diệu cho tôi khi trượt uitextfields

Đặc biệt nó có lợi ích là tính toán khoảng cách hoạt ảnh slide tùy thuộc vào vị trí của trường văn bản.


Điều đó thật tuyệt. Bạn không phải chọn hằng số 'khoảng cách di chuyển' cho mỗi trường văn bản - nó được tính toán cho bạn.
jlstrecker

Giải pháp tốt nhất cho đến nay. Cơ chế hiện tượng!
Marchy

1
Hoạt động tuyệt vời trên iPad. Tôi vừa cập nhật PORTRAIT_KEYBOARD_HEIGHT = 264 và LANDSCAPE_KEYBOARD_HEIGHT = 352. Liên kết tuyệt vời. Cảm ơn.
Khôn Liễu

Liên kết trên chỉ làm cho ngày của tôi! Rất đơn giản để thực hiện, hoạt động hoàn hảo cho đến nay!
JimmyJammed

1
Đây là lời giải thích tốt nhất về chủ đề này. Các hướng dẫn khác sử dụng Chế độ xem bảng, Chế độ xem cuộn, v.v. Điều này thực sự hoạt động mà không cần đi vào bất kỳ sự phức tạp nào khác, đơn giản và dễ hiểu. Cảm ơn vì đã chia sẻ nguồn này.
Renexandro

28

IQKeyboardManager làm điều này cho bạn mà KHÔNG CÓ DÒNG MÃ , chỉ cần kéo và thả tệp nguồn liên quan đến dự án. IQKeyboardManager cũng hỗ trợ Định hướng thiết bị , Quản lý UIToolbar Tự động , keyboardDistanceFromTextField và hơn thế nữa bạn nghĩ.

nhập mô tả hình ảnh ở đây

Đây là Sơ đồ luồng kiểm soát: Lưu đồ kiểm soát

Bước 1: - Thêm thông báo toàn cầu về UITextField, UITextViewUIKeyboardtrong một lớp singleton. Tôi gọi nó là IQKeyboardManager .

Bước 2: - Nếu tìm thấy UIKeyboardWillShowNotification, UITextFieldTextDidBeginEditingNotificationhoặc UITextViewTextDidBeginEditingNotificationthông báo, sau đó cố gắng để có được topMostViewControllerdụ từ UIWindow.rootViewControllerhệ thống cấp bậc. Để khám phá đúng UITextField/ UITextViewtrên đó, topMostViewController.viewkhung của cần được điều chỉnh.

Bước 3: - Tính toán khoảng cách di chuyển dự kiến topMostViewController.viewđối với phản hồi đầu tiên UITextField/ UITextView.

Bước 4: - Di chuyển topMostViewController.view.framelên / xuống theo khoảng cách di chuyển dự kiến.

Bước 5: - Nếu tìm thấy UIKeyboardWillHideNotification, UITextFieldTextDidEndEditingNotificationhoặc UITextViewTextDidEndEditingNotificationthông báo, sau đó một lần nữa cố gắng để có được topMostViewControllerdụ từ UIWindow.rootViewControllerhệ thống cấp bậc.

Bước 6: - Khoảng cách bị xáo trộn được tính toán topMostViewController.viewcần được khôi phục về vị trí ban đầu.

Bước 7: - Khôi phục topMostViewController.view.frametheo khoảng cách bị xáo trộn.

Bước 8 : - Phiên bản lớp IQKeyboardManager singleton được khởi tạo ngay khi tải ứng dụng, vì vậy mọi UITextField/ UITextViewtrong ứng dụng sẽ tự động điều chỉnh theo khoảng cách di chuyển dự kiến.

Đó là tất cả


Câu trả lời được chấp nhận không phù hợp với tôi. Nhưng cái này thì có.
người học

@ZaEeMZaFaR IQKeyboardManager cũng được tối ưu hóa cho iPad. Bạn có thể vui lòng mở sự cố trên repo github của thư viện và tải lên một dự án demo minh họa sự cố với iPad không?
Mohd Iftekhar Qurashi

Cảm ơn đã trả lời. Tôi sẽ làm điều đó nếu sự cố vẫn tiếp diễn, trước khi bạn nhận xét, tôi đã nghĩ rằng IQKeyboardManager không dành cho thiết bị phổ thông.
ZaEeM ZaFaR

Bằng cách điều tra thêm, nó hoạt động tốt với iPad trên trình mô phỏng nhưng không hoạt động trên thiết bị iPad thực tế. Hoạt động hoàn toàn tốt trên iPhone (Thiết bị + Trình mô phỏng). Điều gì có thể là vấn đề ?
ZaEeM ZaFaR

Như tôi đã nói trước đây, bạn nên nêu vấn đề trên github repo với dự án demo với thông tin chi tiết về phiên bản thiết bị và iOS của bạn, để chúng tôi có thể xem xét vấn đề.
Mohd Iftekhar Qurashi

7

Để mở rộng câu trả lời của Amagrammer, đây là một lớp mẫu:

LoginViewController.h

@interface LoginViewController : UIViewController <UITextFieldDelegate> {

}

@property (nonatomic, retain) IBOutlet UITextField    *emailTextField;
@property (nonatomic, retain) IBOutlet UITextField    *passwordTextField;

Lưu ý rằng chúng tôi đang triển khai "UITextFieldDelegate"

LoginViewController.m

@implementation LoginViewController
@synthesize emailTextField=_emailTextField;
@synthesize passwordTextField=_passwordTextField;

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        //Register to receive an update when the app goes into the backround
        //It will call our "appEnteredBackground method
        [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(appEnteredBackground)
                                                 name:UIApplicationDidEnterBackgroundNotification
                                               object:nil];
    }
    return self;
}


- (void) animateTextField: (UITextField*) textField up: (BOOL) up
{
    const int movementDistance = 80; // tweak as needed
    const float movementDuration = 0.3f; // tweak as needed

    int movement = (up ? -movementDistance : movementDistance);

    [UIView beginAnimations: @"anim" context: nil];
    [UIView setAnimationBeginsFromCurrentState: YES];
    [UIView setAnimationDuration: movementDuration];
    self.view.frame = CGRectOffset(self.view.frame, 0, movement);
    [UIView commitAnimations];
}

- (void)textFieldDidBeginEditing:(UITextField *)textField
{
    [self animateTextField: textField up: YES];
}


- (void)textFieldDidEndEditing:(UITextField *)textField
{
    [self animateTextField: textField up: NO];
}

- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
    [textField resignFirstResponder];
    return YES;
}
//This is called when the app goes into the background.
//We must reset the responder because animations will not be saved
- (void)appEnteredBackground{
    [self.emailTextField resignFirstResponder];
    [self.passwordTextField resignFirstResponder];
}

+1 để đề cập UIApplicationDidEnterBackgroundNotification, nếu không, nó sẽ di chuyển xuống nhiều hơn nếu một người nhấn nút Home và quay lại ứng dụng, khiến nó trở nên xấu xí và lỗi.
Adil Soomro

7

Làm thế nào về giải pháp chính thức: Di chuyển nội dung nằm dưới bàn phím

Điều chỉnh nội dung của bạn thường bao gồm việc tạm thời thay đổi kích thước một hoặc nhiều chế độ xem và định vị chúng sao cho đối tượng văn bản vẫn hiển thị. Cách đơn giản nhất để quản lý các đối tượng văn bản bằng bàn phím là nhúng chúng vào bên trong một đối tượng UIScrollView (hoặc một trong các lớp con của nó như UITableView). Khi bàn phím được hiển thị, tất cả những gì bạn phải làm là đặt lại vùng nội dung của dạng xem cuộn và cuộn đối tượng văn bản mong muốn vào vị trí. Do đó, để phản hồi lại UIKeyboardDidShowNotification, phương thức xử lý của bạn sẽ thực hiện như sau:

  1. Nhận kích thước của bàn phím.
  2. Điều chỉnh nội dung dưới cùng của chế độ xem cuộn của bạn bằng chiều cao bàn phím.
  3. Cuộn trường văn bản đích vào chế độ xem.
// 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;
}

Giải pháp chính thức này hiện được bao bọc trong một điều khiển, xem tại đây: - stackoverflow.com/a/17707094/1582217
Mohd Iftekhar Qurashi

Ý tưởng là tốt, nhưng bất động sản 'contentInset' không giúp đây, coz contentInset sẽ chỉ cung cấp cho bạn các hiệu ứng padding: stackoverflow.com/a/10049782/260665
Raj Pawan Gumdal

@Raj, Đó có thể là trường hợp tôi có thể xem xét trên IQKeyboardManager, nhưng vẫn không ai mở bất kỳ vấn đề nào trên kho lưu trữ github IQKeyboardManager chính thức liên quan đến vấn đề thuộc tính contentInset, vì vậy tôi cho rằng nó đang hoạt động.
Mohd Iftekhar Qurashi

7

Tôi gặp phải vấn đề tương tự trong UITableView các ô textField. Tôi giải quyết vấn đề này bằng cách triển khai phương pháp sau để nghe thông báo bàn phím.

Người quan sát để biết các thông báo tại đây:

[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(keyboardWasShown:) name:UIKeyboardWillShowNotification object:nil];
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(keyboardWillBeHidden:) name:UIKeyboardWillHideNotification object:nil];

Xử lý những thông báo đó bằng cách sử dụng chức năng dưới đây:

(void)keyboardWasShown:(NSNotification*)aNotification 
(void)keyboardWillBeHidden:(NSNotification*)aNotification 

1
Liên kết bị hỏng. Vui lòng xem xét bao gồm một giải pháp độc lập trong tương lai!
miek

5

Kiểm tra điều này. Không có rắc rối cho bạn.

Giải pháp này rất gọn gàng. Tất cả những gì bạn phải làm là thêm các trường văn bản của mình vào a UIScrollViewvà thay đổi lớp của nó thành TPKeyboardAvoidingScollView, nếu bạn đang sử dụng bảng phân cảnh. Chế độ xem cuộn được mở rộng theo cách mà nó sẽ phát hiện khi bàn phím được nhìn thấy và sẽ tự di chuyển phía trên bàn phím ở một khoảng cách hợp lý. Nó là giải pháp hoàn hảo vì nó không phụ thuộc vào bạn UIViewController. Mọi thứ cần thiết được thực hiện trong lớp đã đề cập ở trên. Cảm ơn Michael Tyson và tất cả.

TPKeyboardTránh


@NANNAV - Vui lòng cung cấp nhận xét khi bạn đưa ra đề xuất sửa đổi câu trả lời.
Security Hound

5

Dưới đây là một phiên bản nhanh chóng của câu trả lời của Amagrammer. Ngoài ra, một biến thể sử dụng sự kiện UIKeyboardWillShowNotification vì tôi cần biết kích thước bàn phím trước khi di chuyển chế độ xem ra ngoài.

var keyboardHeight:CGFloat = 0

override func viewDidLoad() {
    super.viewDidLoad()
    NSNotificationCenter.defaultCenter().addObserver(self, selector: "keyboardWillChange:", name: UIKeyboardWillShowNotification, object: nil)
}

func textFieldDidBeginEditing(textField: UITextField) {
    //keyboardWillChange (below) is used instead of textFieldDidBeginEditing because textFieldDidBeginEditing
    //is called before the UIKeyboardWillShowNotification necessary to determine the keyboard height.
}

func textFieldDidEndEditing(textField: UITextField) {
    animateTextField(false)
}

func animateTextField(textFieldUp:Bool) {
    let movementDistance:CGFloat = keyboardHeight
    let movementDuration = 0.3

    let movement:CGFloat = (textFieldUp ? -movementDistance : movementDistance)

    UIView.beginAnimations("anim", context: nil)
    UIView.setAnimationBeginsFromCurrentState(true)
    UIView.setAnimationDuration(movementDuration)
    self.view.frame = CGRectOffset(self.view.frame, 0, movement)
    UIView.commitAnimations()
}

func keyboardWillChange(notification:NSNotification) {
    let keyboardRect:CGRect = ((notification.userInfo![UIKeyboardFrameEndUserInfoKey])?.CGRectValue)!
    keyboardHeight = keyboardRect.height
    animateTextField(true)
}

4

Có một hướng dẫn tuyệt vời trong việc chỉnh sửa các trường văn bản mà không bị che khuất (liên kết đã chết, đây là liên kết Wayback: https://web.archive.org/web/20091123074029/http://acts-as-geek.blogspot.com/2009/ 11 / edit-textfields-without-obscuring.html ). Nó chỉ ra cách di chuyển một cái hiện có UIViewvào một UIScrollViewvà để cuộn nó tự động khi bàn phím xuất hiện.

Tôi đã cập nhật nó một chút để tính toán chiều cao chính xác cho thời UIScrollViewđiểm có các điều khiển (chẳng hạn như a UITabBar) bên dưới UIScrollBar. Xem bài cập nhật uiview .


2

Đây là giải pháp sử dụng Xcode5, iOS7:

Sử dụng UITextfieldDelegate và các khối hoạt hình.

Đây gần như là tất cả mã cho ViewController nhưng tôi muốn bao gồm mã ủy quyền cho những người vẫn còn hơi xa lạ với mẫu ủy quyền (như tôi). Tôi cũng bao gồm mã để ẩn bàn phím khi bạn chạm ra khỏi chế độ xem văn bản.

Bạn có thể di chuyển các chế độ xem (nút, trường văn bản, v.v.) đến mức bạn muốn chỉ cần đảm bảo đặt chúng trở lại vị trí cũ (+100 rồi sau đó -100).

@interface ViewController () <UITextFieldDelegate>
@property (strong, nonatomic) IBOutlet UITextField *MyTextField;

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.MyTextField.delegate = self;

}

- (void)textFieldDidBeginEditing:(UITextField *)textField
{
      NSLog(@"text began editing");

      CGPoint MyPoint = self.MyTextField.center;

      [UIView animateWithDuration:0.3
                    animations:^{

                    self.MyTextField.center = CGPointMake(MyPoint.x, MyPoint.y - 100);
                                }];
}

- (void)textFieldDidEndEditing:(UITextField *)textField
{
     NSLog(@"text ENDED editing");

     CGPoint MyPoint = self.MyTextField.center;

     [UIView animateWithDuration:0.3
                 animations:^{

     self.MyTextField.center = CGPointMake(MyPoint.x, MyPoint.y + 100);
                             }];
}

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
     [self.view endEditing:YES];
}

1

Tôi đoán một cách sẽ là di chuyển toàn bộ vị trí chế độ xem của bạn từ (x, y) sang (x, y-keybaardHeight) khi trường văn bản được nhấp và đặt nó trở lại khi bàn phím bị loại bỏ, có thể trông hơi kỳ lạ khi chế độ xem chỉ xuất hiện (có thể sẽ không tệ nếu bạn làm động nó).

- (void)textFieldDidBeginEditing:(UITextField *)textField
{
    CGRect frame=self.view.frame;
    frame.origin=CGPointMake(x...//set point here
    self.view.frame=frame;
}

Không, không phải. Nếu người dùng nhấn vào trường văn bản đầu tiên, nó sẽ ở trên vùng hiển thị.
lolol

0

Ngoài giải pháp của Amagrammer, nếu bạn đang sử dụng cocos2d ở chế độ dọc, hãy thay đổi dòng này:

self.view.frame = CGRectOffset(self.view.frame, 0, movement);

đến điều này:

[CCDirector sharedDirector].openGLView.frame = CGRectOffset([CCDirector sharedDirector].openGLView.frame, movement, 0);

Nếu bạn đang sử dụng cocos2d ở chế độ ngang, hãy thực hiện thay đổi ở trên và chuyển các upgiá trị trong textFieldDidBeginEditing:textFieldDidEndEditing:

- (void)textFieldDidBeginEditing:(UITextField *)textField {
    [self animateTextField:textField up:NO];
}

- (void)textFieldDidEndEditing:(UITextField *)textField {
    [self animateTextField:textField up:YES];
}

0

Tôi đã gặp vấn đề tương tự và thấy GTKeyboardHelper là một cách dễ dàng để giải quyết.

Sau khi kéo và thả khung công tác trong dự án của bạn, hãy bao gồm tệp tiêu đề. Tải xuống và mở dự án mẫu, sau đó kéo đối tượng "Trình trợ giúp bàn phím" từ phần đối tượng trong xib đến phần đối tượng trong trình tạo giao diện dự án của bạn.

Kéo và thả tất cả các chế độ xem của bạn để trở thành con của "Trình trợ giúp bàn phím".


0

Kéo và thả khuôn khổ mà tôi sử dụng trong các dự án của mình. Hỗ trợ tự động loại bỏ khi bạn nhấn vào bên ngoài người trả lời đầu tiên hoặc khi bạn cuộn.

GTKeyboardHelper


0

Chỉ cần trượt chế độ xem lên và xuống khi cần:

- (void)textFieldDidEndEditing:(UITextField *)textField {
    self.currentTextField = nil;
    [self animateTextField: textField up: NO];
}

- (BOOL)textFieldShouldReturn:(UITextField *)textField {
    [self.currentTextField resignFirstResponder];
    return YES;
}

- (void) animateTextField:(UITextField*) textField up:(BOOL)up {
    const int movementDistance = 80; // tweak as needed
    const float movementDuration = 0.3f; // tweak as needed

    int movement = (up ? -movementDistance : movementDistance);

    [UIView animateWithDuration:movementDuration animations:^{
        self.view.frame = CGRectOffset(self.view.frame, 0, movement);
    }];
}

Đừng quên đặt selflàm UITextFieldDelegatetextField thực tế delegate.

(Cảm ơn Ammagrammer, đây chỉ là một câu trả lời ngắn hơn bằng cách sử dụng các khối cho hoạt ảnh)


0

Tôi có thứ khác nếu bạn muốn. Vấn đề ở đây là bạn muốn đặt UIView ở giữa cho trường văn bản mà bạn đang chỉnh sửa.

Trước đó, bạn phải lưu INITIAL_CENTER , dưới dạng CGPoint , từ self.view.center và INITIAL_VIEW của bạn dưới dạng CGRect từ self.view.frame trong thuộc tính const.

Bạn có thể tạo một phương thức như sau:

- (void) centerOn: (CGRect) fieldFrame {

    // Set up the center by taking the original view center
    CGPoint center = CGPointMake(INITIAL_CENTER.x,
                             INITIAL_CENTER.y - ((fieldFrame.origin.y + fieldFrame.size.height/2) - INITIAL_CENTER.y));


    [UIView beginAnimations:@"centerViewOnField" context:nil];
    [UIView setAnimationDuration:0.50];

    if (CGRectEqualToRect(fieldFrame,INITIAL_VIEW)) {
        self.view.frame = INITIAL_VIEW;
        [self.view setCenter:INITIAL_CENTER];
    } else {
        [self.view setCenter:center];
    }


    [UIView commitAnimations];
}

Sau đó, trên UITextFieldDelegate của bạn , bạn phải gọi centerOn: (CGRect) theo các phương thức sau:

textFieldDidBeginE Chỉnh sửa: (UITextField *) với, như một tham số, khung của trường văn bản bạn muốn căn giữa.

Và bạn phải gọi nó trong trình xử lý sự kiện của mình, nơi bạn đóng bàn phím,

textFieldDidEndE Chỉnh sửa: (UITextField *) có thể là một trong những cách để thực hiện, đặt INITIAL_VIEW làm tham số của centerOn: (CGRect) .


0

Tôi tin rằng trên các phiên bản iOS mới hơn (6.1+, thậm chí có thể sớm hơn), chế độ xem cơ bản, ít nhất là đối với UITableView, sẽ tự động thu nhỏ khi bàn phím bật lên. Vì vậy, bạn chỉ cần làm cho trường văn bản hiển thị trong dạng xem đó. Trong init:

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(keyboardWasShown:)
                                             name:UIKeyboardDidShowNotification
                                           object:nil];

sau đó:

- (void)keyboardWasShown:(NSNotification*)notification
{
    // Scroll the text field into view so it's not under the keyboard.
    CGRect rect = [self.tableView convertRect:inputView.bounds fromView:inputView];
    [self.tableView scrollRectToVisible:rect animated:YES];
}

0

https://github.com/ZulwiyozaPutra/Shift-Keyboard-Example Tôi hy vọng giải pháp này hữu ích. Tất cả đều là Swift 3 được viết.

//
//  ViewController.swift
//  Shift Keyboard Example
//
//  Created by Zulwiyoza Putra on 11/23/16.
//  Copyright © 2016 Zulwiyoza Putra. All rights reserved.
//

import UIKit

class ViewController: UIViewController, UITextFieldDelegate {
    
    
    //connecting textfield from storyboard
    @IBOutlet weak var textField: UITextField!
    
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        subscribeToKeyboardNotifications()
    }
    
    override func viewDidAppear(_ animated: Bool) {
        self.textField.delegate = self
    }
    
    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        unsubscribeFromKeyboardNotifications()
    }
    
    //Hide keyboard after finished editing
    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        textField.resignFirstResponder()
        return true
    }
    
    //Setup view before keyboard appeared
    func keyboardWillAppear(_ notification:Notification) {
        view.frame.origin.y = 0 - getKeyboardHeight(notification)
    }
    
    //Setup view before keyboard disappeared
    func keyboardWillDisappear(_ notification: Notification) {
        view.frame.origin.y = 0
    }
    
    //Getting keyboard height
    func getKeyboardHeight(_ notification:Notification) -> CGFloat {
        let userInfo = notification.userInfo
        let keyboardSize = userInfo![UIKeyboardFrameEndUserInfoKey] as! NSValue // of CGRect
        return keyboardSize.cgRectValue.height
    }
    
    //Subscribing to notifications to execute functions
    func subscribeToKeyboardNotifications() {
        NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillAppear(_:)), name: .UIKeyboardWillShow, object: nil)
        NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillDisappear(_:)), name: .UIKeyboardWillHide, object: nil)
    }
    
    //Unsubscribing from notifications
    func unsubscribeFromKeyboardNotifications() {
        NotificationCenter.default.removeObserver(self, name: .UIKeyboardWillShow, object: nil)
        NotificationCenter.default.removeObserver(self, name: .UIKeyboardWillHide, object: nil)
    }
    
}

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.