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로 드래그하십시오.
- 작업에서 한 줄만 ——
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
보기를 클릭하고보기를 스크롤하고 모든 경우에 키보드를 닫을 수있는 등보기 트리의 다양한 제스처가 서로 간섭하는 데 문제가있었습니다. 이 솔루션을 생각해 냈는데,이 솔루션 UIScrollView
은 UIViewController
.
이 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
'Programing' 카테고리의 다른 글
Google Maps V2-Android-현재 확대 / 축소 수준 얻기 (0) | 2020.12.06 |
---|---|
Java가 파일을 ArrayList로 읽는 중입니까? (0) | 2020.12.06 |
Haskell : 튜플을 매핑하는 방법? (0) | 2020.12.06 |
iOS 7 상태 표시 줄의 MFMailComposeViewController가 검은 색입니다. (0) | 2020.12.06 |
TypeError : 'str'개체는 호출 할 수 없습니다 (Python). (0) | 2020.12.06 |