programing

UI 텍스트 필드를 커버하는 iPhone 키보드

megabox 2023. 6. 3. 08:21
반응형

UI 텍스트 필드를 커버하는 iPhone 키보드

는 인터페이스 빌더에서 다음을 설정하는 앱이 있습니다.UIView보기 하단 근처에 텍스트 필드가 있습니다.앱을 실행하고 해당 필드에 텍스트를 입력하려고 하면 키보드가 필드 위로 미끄러져 올라가 키보드를 다시 숨길 때까지 입력하는 내용을 볼 수 없습니다.

부모 보기를 스크롤 가능하게 하거나 텍스트 필드를 화면 위로 이동하지 않고 이 문제를 해결할 수 있는 좋은 방법을 찾은 사람이 있습니까?

일반적인 해결 방법은 애니메이션을 사용하여 필드(및 필드 위의 모든 항목)를 위로 이동한 다음 완료되면 뒤로 이동하는 것입니다.텍스트 필드와 일부 다른 항목을 다른 보기에 넣고 보기를 하나의 단위로 슬라이드해야 할 수도 있습니다.(저는 이러한 것들을 "구조판"에서와 같이 "판"이라고 부르지만, 그것은 저뿐입니다.)하지만 여러분이 멋을 부릴 필요가 없다면 여기에 일반적인 생각이 있습니다.

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

이것은 내가 텍스트 필드를 슬라이딩하는 데 놀라운 효과를 주었습니다.

특히 텍스트 필드의 위치에 따라 슬라이드 애니메이션 거리를 계산할 수 있는 장점이 있습니다.

IQKeyboard Manager는 코드 라인 없이 프로젝트에 관련 소스 파일을 드래그 앤 드롭하기만 하면 됩니다.또한 IQ 키보드 관리자는 장치 방향, 자동 UI 도구 모음 관리, 키보드 DistanceFromTextField 등을 지원합니다.

여기에 이미지 설명 입력

Chart입니다.제어 흐름도

1단계:- 글로벌 알림 추가UITextField,UITextView,그리고.UIKeyboard싱글톤 클래스로저는 그것을 IQ키보드 매니저라고 불렀습니다.

2단계:- 발견된 경우UIKeyboardWillShowNotification,UITextFieldTextDidBeginEditingNotification또는UITextViewTextDidBeginEditingNotification알림, 그리고 나서 받아보세요.topMostViewController 들어를의 .UIWindow.rootViewController계층 구조정확하게 밝혀내기 위해서는UITextField/UITextView그 위에,topMostViewController.view의 프레임을 조정해야 합니다.

3단계:- 계산된 예상 이동 거리topMostViewController.view 번째 응답을 초최회답관하여에여관.UITextField/UITextView.

4단계: - 이동됨topMostViewController.view.frame예상 이동 거리에 따라 위/아래로 이동합니다.

5단계:- 발견된 경우UIKeyboardWillHideNotification,UITextFieldTextDidEndEditingNotification또는UITextViewTextDidEndEditingNotification 한 번 알림, 시시합니다도다다▁to를 .topMostViewController 들어를의 .UIWindow.rootViewController계층 구조

6단계:- 계산된 방해 거리topMostViewController.view원래 위치로 복구해야 합니다.

7단계:- 복원topMostViewController.view.frame방해된 거리에 따라 아래로

8단계:- 앱 로드 시 싱글톤 IQKeyboardManager 클래스 인스턴스를 인스턴스화함으로써 모든UITextField/UITextView앱에서 예상 이동 거리에 따라 자동으로 조정됩니다.

이상입니다

Amgrammer 답변을 확장하기 위해 다음은 샘플 클래스입니다.

LoginViewController.h

@interface LoginViewController : UIViewController <UITextFieldDelegate> {

}

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

"UITextField 딜러"를 구현하고 있습니다.

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];
}

공식적인 해결책은?키보드 아래에 있는 콘텐츠 이동

내용을 조정하려면 일반적으로 하나 이상의 보기 크기를 일시적으로 조정하고 텍스트 개체가 표시되도록 보기를 배치해야 합니다.키보드를 사용하여 텍스트 개체를 관리하는 가장 간단한 방법은 텍스트 개체를 UIScrollView 개체(또는 UITableView와 같은 하위 클래스 중 하나) 안에 포함시키는 것입니다.키보드가 표시되면 스크롤 보기의 콘텐츠 영역을 재설정하고 원하는 텍스트 개체를 제 위치로 스크롤하기만 하면 됩니다.따라서 UIKeyboardDidShowNotification에 대한 응답으로 핸들러 메소드는 다음을 수행합니다.

  1. 키보드 크기를 가져옵니다.
  2. 키보드 높이에 따라 스크롤 보기의 하단 내용을 조정합니다.
  3. 대상 텍스트 필드를 보기로 스크롤합니다.
// 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;
}

는 저는같은직있습다니해에서 같은 .UITableViewtextField 셀.저는 키보드 알림을 듣는 다음 방법을 구현하여 이 문제를 해결합니다.

여기서 알림 관찰자:

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

다음 기능을 사용하여 이러한 알림을 처리합니다.

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

이것 좀 보세요.번거롭게 하지 않으셔도 됩니다.

이 솔루션은 매우 깔끔합니다. 할 에 텍스트 입니다.UIScrollView을 클스를로변니다합경래로 변경합니다.TPKeyboardAvoidingScollView스토리보드를 사용하는 경우.스크롤 보기는 키보드가 표시되는 시기를 감지하고 적절한 거리에서 키보드 위로 이동하도록 확장됩니다.이 솔루션은 귀사와 독립적이기 때문에 완벽한 솔루션입니다.UIViewController위에서 언급한 클래스 내에서 필요한 모든 작업이 수행됩니다.Michael Tyson 등 모두에게 감사합니다.

TP 키보드 회피

아래는 Amagrammer의 빠른 답변 버전입니다.또한 보기를 이동하기 전에 키보드 크기를 알아야 했기 때문에 UIKeyboard를 사용한 변형은 알림을 표시합니다.

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

텍스트 필드를 모호하게 하지 않고 편집할 수 있는 좋은 방법이 있었습니다(링크가 비활성화되었습니다. 여기 웨이백 링크가 있습니다. https://web.archive.org/web/20091123074029/http ://acts-as-geek.blogspot.com/2009/11/editing-textfields-without-obscuring.html) ).기존 시스템을 이동하는 방법을 보여줍니다.UIView.UIScrollView키보드가 나타나면 자동으로 스크롤합니다.

정확한 높이를 계산하기 위해 약간 업데이트했습니다.UIScrollView: 컨트예있때을이롤)이 때UITabBar의▁the UIScrollBar업데이트UI 보기를 참조하십시오.

다음은 Xcode5, iOS7을 사용하는 솔루션입니다.

UIT 텍스트 필드 딜러 및 애니메이션 블록을 사용합니다.

이 코드는 View Controller의 거의 모든 코드이지만 저와 같이 여전히 대리자 패턴에 익숙하지 않은 사람들을 위한 대리자 코드를 포함하고 싶었습니다.텍스트 보기에서 탭할 때 키보드를 숨기기 위한 코드도 포함했습니다.

보기(버튼, 텍스트 필드 등)를 원하는 높이로 이동하여 다시 제자리에 배치할 수 있습니다(+100 이후 -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];
}

한 가지 방법은 전체 보기 위치를 (x,y)에서 (x,y-keybaard)로 이동하는 것입니다.높이) 텍스트 필드를 클릭한 후 키보드가 해제될 때 다시 놓으면 보기가 방금 나타나므로 약간 이상하게 보일 수 있습니다(애니메이션을 사용하면 나쁘지 않을 수 있습니다).

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

Amagrammer의 솔루션 외에도 cocos2d를 세로 모드로 사용하는 경우 다음 행을 변경합니다.

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

대상:

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

하고 "" "" "" cocos2d" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" ""up값을 합니다.textFieldDidBeginEditing:그리고.textFieldDidEndEditing:

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

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

저도 같은 문제가 있었고 GT키보드를 찾았습니다.쉬운 탈출구가 될 도우미.

프로젝트에서 프레임워크를 드래그 앤 드롭한 후 헤더 파일을 포함합니다.예제 프로젝트를 다운로드하여 연 다음 "키보드 도우미" 개체를 xib의 개체 섹션에서 프로젝트의 인터페이스 작성기에 있는 개체 섹션으로 끕니다.

모든 보기를 끌어다 놓으면 "키보드 도우미"의 하위 항목이 됩니다.

프로젝트에서 사용하는 프레임워크를 드래그 앤 드롭합니다.첫 번째 응답기 외부를 누르거나 스크롤할 때 자동 해제를 지원합니다.

GT 키보드도우미

필요에 따라 보기를 위아래로 이동합니다.

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

설정하는 것을 잊지 마십시오.selfUITextFieldDelegate실제 textField로 표시됩니다.delegate.

(Ammagrammer 덕분에, 이것은 애니메이션에 블록을 사용하는 더 짧은 답변일 뿐입니다.)

당신이 원한다면 저는 다른 것이 있습니다.여기서 중요한 것은 편집 중인 텍스트 필드에서 UI 보기의 중심을 설정하려는 것입니다.

그 전에 self.view.center에서 INITIAL_ENTERCGPoint로 저장하고 const 속성의 self.view.frame에서 INITIAL_VIEWCGRect로 저장해야 합니다.

다음과 같은 메서드를 만들 수 있습니다.

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

그런 다음 UITextFieldDelegate에서 다음 방법으로 centerOn:(CGRect)을 호출해야 합니다.

textFieldDidBeginEditing:(UITextField*) 매개 변수로 중심을 맞출 텍스트 필드의 프레임을 사용합니다.

그리고 당신은 그것을 당신의 이벤트 핸들러에서 불러야 합니다, 당신은 당신의 키보드를 닫고,

textFieldDidEndEditing:(UItextField*)는 INITIAL_VIEW를 centerOn:(CGRect) 매개 변수로 지정하는 방법 중 하나입니다.

저는 iOS의 최신 버전(6.1+, 아마도 더 이전 버전)을 믿고 있습니다. 적어도 UITableView의 경우 키보드가 뜨면 기본 보기가 자동으로 축소됩니다.따라서 텍스트 필드를 해당 보기에 표시하기만 하면 됩니다.init:

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

그러면:

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

https://github.com/ZulwiyozaPutra/Shift-Keyboard-Example 솔루션이 도움이 되었기를 바랍니다.그것들은 모두 스위프트 3로 작성되었습니다.

//
//  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)
    }
    
}

언급URL : https://stackoverflow.com/questions/1247113/iphone-keyboard-covers-uitextfield

반응형