Programing

UIScrollView에서 키보드 닫기

lottogame 2020. 12. 6. 20:52
반응형

UIScrollView에서 키보드 닫기


좋아, 나는 몇이 UITextFields하고 UITextViews, 안쪽을 UIScrollView, 그리고 나는이 때마다 사라 키보드 설정하고 싶습니다 scrollview(당신은 물론, 텍스트 필드 / 뷰 내부에 터치 다운하는 경우를 제외하고) 터치 나 스크롤된다.

이 작업을 수행하려는 현재 시도는을 UIScrollView하위 클래스로 바꾸고 touchesBegan 메서드 내에서 removeKeyboard 함수 (메인 뷰 컨트롤러 내부에 정의 됨)를 호출하도록 설정하는 것 입니다. 그러나 이것은보기가 단순히 스크롤 될 때가 아니라 일반적인 터치의 경우에만 키보드를 제거합니다. 그렇다면 내부의 키보드를 제거하는 가장 좋은 방법은 UIScrollView무엇입니까?

도움을 주셔서 미리 감사드립니다.


iOS 7.0 이상에서이를 달성하는 가장 깨끗한 방법은 다음과 같습니다.

scrollView.keyboardDismissMode = UIScrollViewKeyboardDismissModeOnDrag;

또는

scrollView.keyboardDismissMode = UIScrollViewKeyboardDismissModeInteractive;

빠른:

scrollView.keyboardDismissMode = .onDrag

또는

scrollView.keyboardDismissMode = .interactive

조금 늦었지만 다른 사람 이이 문제에 대한 답을 찾고 있다면 이것이 해결 방법입니다.

1) 모든 필드에서 resignFirstResponder를 사용하여 키보드를 해제하는 대상 콜백 메서드로 탭 제스처 인식기를 만듭니다.

2) 스크롤 뷰에 탭 제스처를 추가합니다.

예를 들면 다음과 같습니다.

UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(hideKeyboard)];

// prevents the scroll view from swallowing up the touch event of child buttons
tapGesture.cancelsTouchesInView = NO;    

[pageScrollView addGestureRecognizer:tapGesture];

[tapGesture release];

...

// method to hide keyboard when user taps on a scrollview
-(void)hideKeyboard
{
    [myTextFieldInScrollView resignFirstResponder];
}

본질은 같지만 코드를 적게 선호합니다.

Attributes inspector에서 scrollView가 스크롤 될 때 키보드가 사라지도록 설정 :

scrollView가 스크롤 될 때 키보드가 사라지도록합니다.

그런 다음 scrollView를 탭하면 키보드가 사라집니다.

  1. 탭 제스처 인식기를 scrollView로 드래그하십시오.
  2. Ctrl- 드래그
  3. 행동하기
  4. 작업에서 한 줄만 —— scrollView.endEditing(true). Objective-C를 사용하는 경우[self.scrollView endEditing: YES];

에서 스위프트 :

조금 늦었지만 다른 사람 이이 문제에 대한 답을 찾고 있다면 이것이 해결 방법입니다.

1) 모든 필드에서 resignFirstResponder를 사용하여 키보드를 해제하는 대상 콜백 메서드로 탭 제스처 인식기를 만듭니다.

2) 스크롤 뷰에 탭 제스처를 추가합니다.

예를 들면 다음과 같습니다.

import UIKit

class ViewController: UIViewController {

    @IBOutlet var t1: UITextField!
    @IBOutlet var t2: UITextField!
    @IBOutlet var t3: UITextField!
    @IBOutlet var t4: UITextField!

    @IBOutlet var srcScrollView: UIScrollView!

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        let tapGesture: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: "hideKeyboard")

        // prevents the scroll view from swallowing up the touch event of child buttons
        tapGesture.cancelsTouchesInView = false

        srcScrollView.addGestureRecognizer(tapGesture)
    }

    func hideKeyboard() {
        t1.resignFirstResponder()
        t2.resignFirstResponder()
        t3.resignFirstResponder()
        t4.resignFirstResponder()
    }
}

UIScrollView의 keyboardDismissMode 속성을 살펴보십시오 .

// will hide keyboard when your text field is about to go beyond the keyboard.
vwScrollView.keyboardDismissMode = UIScrollViewKeyboardDismissModeInteractive;

// will hide keyboard instantly once the scroll view started scrolling by user.
vwScrollView.keyboardDismissMode = UIScrollViewKeyboardDismissOnDrag;

// If you need to hide keyboard on tap of scroll view,consider adding a tap gesture or sub class and override touchesbegan: method.

스위프트 버전

vwScrollView.keyboardDismissMode = .interactive
vwScrollView.keyboardDismissMode = .onDrag

조금 늦었지만 다른 사람이 Swift 3 에서이 문제에 대한 답을 찾고 있다면 :

func scrollViewDidScroll(_ scrollView: UIScrollView) {
    view.endEditing(true)
}

이 시도

[self.selectedViewController.view endEditing:YES];


스크롤보기 /보기를 터치 할 때 키보드를 숨기는 확장 클래스 생성

extension UIViewController {
func hideKeyboardWhenTappedAround() {
    let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(UIViewController.dismissKeyboard))
    tap.cancelsTouchesInView = false
    view.addGestureRecognizer(tap)
}

@objc func dismissKeyboard() {
    view.endEditing(true)
}

}

그리고 viewDidLoad에서이 메서드를 다음과 같이 호출합니다.

 override func viewDidLoad() {
    super.viewDidLoad()

    self.hideKeyboardWhenTappedAround()

}

의 하위 클래스에 제스처를 추가 할 때 하위 UIScrollView보기를 클릭하고보기를 스크롤하고 모든 경우에 키보드를 닫을 수있는 등보기 트리의 다양한 제스처가 서로 간섭하는 데 문제가있었습니다. 이 솔루션을 생각해 냈는데,이 솔루션 UIScrollViewUIViewController.

DismissKeyboardTapGesture클래스는 ARC를 사용하고보기 아래의 모든 텍스트 필드에서 작동하며 버튼과 같은 하위보기에서 클릭을 가져 오지 않습니다. 또한 iOS7 스크롤 효과를 활용하여 키보드를 닫습니다.

UISScrollView 수퍼 클래스에서 설정 :

    _dismissKeyboard = [[DismissKeyboardTapGesture alloc] initWithView:self];

또는 UIViewController에서 :

    _dismissKeyboard = [[DismissKeyboardTapGesture alloc] initWithView:self.view];

수업은 다음과 같습니다.

@interface DismissKeyboardTapGesture : NSObject <UIGestureRecognizerDelegate>

@end

@implementation DismissKeyboardTapGesture

- (id)initWithView:(UIView *)view
{
    self = [super init];
    if (self) {
        UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(singleTap:)];
        singleTap.cancelsTouchesInView = NO;
        singleTap.delegate = self;
        [view addGestureRecognizer:singleTap];

        if ([view respondsToSelector:@selector(setKeyboardDismissMode:)]) {
            // Bonus effect to dismiss keyboard by scrolling
            ((UIScrollView *)view).keyboardDismissMode = UIScrollViewKeyboardDismissModeInteractive;
        }
    }
    return self;
}

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
    // Don't stop any existing gestures in our view from working
    if (otherGestureRecognizer.view == gestureRecognizer.view) {
        return YES;
    }
    return NO;
}

- (void)singleTap:(UIGestureRecognizer*)gestureRecognizer
{
    // Close keyboard for any text edit views that are children of the main view
    [gestureRecognizer.view endEditing:YES];
}

@end

이 스크롤 뷰 대리자 메서드를 사용해보십시오-

IB에서 델리게이트를 링크하여보기를 스크롤 한 다음이 코드를 복사합니다 (필요에 따라 수정).

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
{         
//sample code    
    [challengeABallotComponent.voterNameTextField resignFirstResponder];
    [challengeABallotComponent.ballotNumberTextField resignFirstResponder];
    [locationInformation.pollingLocation resignFirstResponder];
}

작동합니다. 다른 위임 방법도 시도해 볼 수 있습니다.

   -(void)scrollViewDidScroll: (UIScrollView *)scrollView 
{
//do your stuff
}

scrollView.keyboardDismissMode = UIScrollViewKeyboardDismissModeOnDrag;

    extension UIView{
    //Set tag via storyboard 
    func keyboardDissmissInteractiveMode(_ tag:Int){
        if let scrollView = self.viewWithTag(tag) as? UIScrollView{
            scrollView.keyboardDismissMode = .interactive
        }
        if let tableview = self.viewWithTag(tag) as? UITableView{
            tableview.keyboardDismissMode = .interactive
        }
    }

    func keyboardDissmissOnDragMode(_ tag:Int){
        if let scrollView = self.viewWithTag(tag) as? UIScrollView{
            scrollView.keyboardDismissMode = .onDrag
        }
        if let tableview = self.viewWithTag(tag) as? UITableView{
            tableview.keyboardDismissMode = .onDrag
        }
    }


    func keyboardDissmissInteractiveMode(_ view:UIView){
        if let scrollView = view as? UIScrollView{
            scrollView.keyboardDismissMode = .interactive
        }
        if let tableview = view as? UITableView{
            tableview.keyboardDismissMode = .interactive
        }
    }

    func keyboardDissmissOnDragMode(_ view:UIView){
        if let scrollView = view as? UIScrollView{
            scrollView.keyboardDismissMode = .onDrag
        }
        if let tableview = view as? UITableView{
            tableview.keyboardDismissMode = .onDrag
        }
    }
}

참고 URL : https://stackoverflow.com/questions/5143873/dismissing-the-keyboard-in-a-uiscrollview

반응형