iOS - UITextField 외부에서 터치할 때 키보드 해제
사용자가 외부를 터치할 때 키보드가 사라지도록 하는 방법이 궁금합니다.UITextField
.
UITapGestureRecogniser
한 다음, 합니다.UITextField
선택기에 있습니다.
코드:
뷰에서 DidLoad
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(dismissKeyboard)];
[self.view addGestureRecognizer:tap];
키보드 해제 시:
-(void)dismissKeyboard
{
[aTextField resignFirstResponder];
}
서)aTextField
키보드를 담당하는 텍스트 필드입니다.
스위프트 3 버전은 그렇게 보입니다.
let tapGesture = UITapGestureRecognizer(target: self, action: #selector(self.dismissKeyboard (_:)))
self.view.addGestureRecognizer(tapGesture)
키보드 해제용
@objc func dismissKeyboard (_ sender: UITapGestureRecognizer) {
aTextField.resignFirstResponder()
}
나는 몇 가지 대답을 해냈습니다.
할 때 초기화되는 합니다.viewDidLoad:
UIGestureRecognizer *tapper;
- (void)viewDidLoad
{
[super viewDidLoad];
tapper = [[UITapGestureRecognizer alloc]
initWithTarget:self action:@selector(handleSingleTap:)];
tapper.cancelsTouchesInView = NO;
[self.view addGestureRecognizer:tapper];
}
현재 편집 중인 항목을 모두 삭제합니다.
- (void)handleSingleTap:(UITapGestureRecognizer *) sender
{
[self.view endEditing:YES];
}
이걸 확인해 보세요, 이렇게 하는 게 가장 쉬운 방법일 겁니다.
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
[self.view endEditing:YES];// this will do the trick
}
또는
이 라이브러리는 스크롤 막대 자동 스크롤, 키보드 숨기기 공간 탭 등을 처리합니다.
https://github.com/michaeltyson/TPKeyboardAvoiding
일부 사람들이 사용하는 데 문제가 있다는 것을 알 수 있습니다.UITapGestureRecognizer
ㅠㅠ. 탭 둔 이 은 @한 입니다.기존 버튼의 탭 동작을 그대로 유지하면서 이 기능을 수행한 가장 쉬운 방법은 @Jensen2k의 대답에 한 줄만 추가하는 것입니다.
[tap setCancelsTouchesInView:NO];
이를 통해 @Dmitry Sitnikov의 방법을 사용하지 않고도 기존 버튼이 여전히 작동할 수 있었습니다.
그것에 대해 읽어보세요.property
(여검기(색검))를 검색합니다.CancelsTouchesInView
): UIGesture 인식기 클래스 참조
스크롤 막대에서 어떤 방식으로 작동할지 잘 모르겠습니다. 일부 문제가 있었지만 다른 사람이 저와 같은 시나리오에 부딪혔으면 합니다.
당신의 것을 만드는 것이 더 좋습니다.UIView
예UIControl
in in in in in in in in in in in in in in in in in interface builder합니다.TouchUpInside
에게의 사건.dismissKeyboard
방법.이것.IBAction
방법은 다음과 같습니다.
- (IBAction)dismissKeyboard:(id)sender {
[aTextBox resignFirstResponder];
}
스위프트 4
를 합니다.UIViewController
이 확장 방법으로 예를 들어 한 번viewDidLoad
:
override func viewDidLoad() {
super.viewDidLoad()
self.setupHideKeyboardOnTap()
}
그리고 키보드는 탭을 눌러도 제거됩니다.NavigationBar
.
import UIKit
extension UIViewController {
/// Call this once to dismiss open keyboards by tapping anywhere in the view controller
func setupHideKeyboardOnTap() {
self.view.addGestureRecognizer(self.endEditingRecognizer())
self.navigationController?.navigationBar.addGestureRecognizer(self.endEditingRecognizer())
}
/// Dismisses the keyboard from self.view
private func endEditingRecognizer() -> UIGestureRecognizer {
let tap = UITapGestureRecognizer(target: self.view, action: #selector(self.view.endEditing(_:)))
tap.cancelsTouchesInView = false
return tap
}
}
빠른 버전, 이것은 다른 요소들과 함께 작동합니다 (예:UIButton
다른 이저러쿵러.UITextField
):
override func viewDidLoad() {
super.viewDidLoad()
let tapper = UITapGestureRecognizer(target: self, action:#selector(endEditing))
tapper.cancelsTouchesInView = false
view.addGestureRecognizer(tapper)
}
이것은 좋은 일반적인 솔루션입니다.
목표-C:
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
[self.view endEditing:YES];
}
스위프트:
override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
self.view.endEditing(true)
}
@icodebuster 솔루션 기반: https://stackoverflow.com/a/18756253/417652
이거 어때:저는 이것이 오래된 게시물이라는 것을 압니다.누군가에게 도움이 될 수도 있습니다 :)
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
NSArray *subviews = [self.view subviews];
for (id objects in subviews) {
if ([objects isKindOfClass:[UITextField class]]) {
UITextField *theTextField = objects;
if ([objects isFirstResponder]) {
[theTextField resignFirstResponder];
}
}
}
}
스위프트 4 원라이너
view.addGestureRecognizer(UITapGestureRecognizer(target: view, action: #selector(UIView.endEditing(_:))))
이를 위한 가장 쉬운(그리고 가장 좋은) 방법은 글로벌 뷰를 세분화하고 사용하는 것이라고 생각합니다.hitTest:withEvent
모든 터치를 들을 수 있는 방법.키보드 터치가 등록되지 않았으므로 Test:withEvent를 누르면 터치/스크롤/스위프/핀치를 할 때만 호출됩니다...다른 곳에서, 그리고 나서 전화하세요.[self endEditing:YES]
.
이것은 사용하는 것보다 더 좋습니다.touchesBegan
touchesBegan
보기 맨 위에 있는 단추를 클릭하면 호출되지 않습니다.은 그은보보다 더 .UITapGestureRecognizer
예를 들어 스크롤하는 제스처를 인식할 수 없습니다.또한 복잡하고 동적인 사용자 인터페이스에서는 모든 곳에 어두운 화면을 배치할 수 없기 때문에 어두운 화면을 사용하는 것보다 더 좋습니다. 두 번 누를 필요가 예: 또한다작차예않외버두없필부튼습요니가다누번를서을에으며른업지단을하예▁outside▁moreover없(:▁(▁in습니다▁button필like▁twice▁a,요▁of▁case▁a▁it▁the:UIPopover
).
또한, 전화하는 것보다 낫습니다.[textField resignFirstResponder]
화면에 많은 텍스트 필드가 있을 수 있으므로 모든 필드에 적용됩니다.
외부를 터치하여 키보드를 숨기는 가장 쉬운 방법은 다음과 같습니다.
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
[self.view endEditing:YES];
}
(사용자가 텍스트 필드 외부의 다른 영역을 누를 때 키보드를 해제하는 방법?)
에 UIScrollView
그런 다음 다음을 사용할 수 있습니다.
tableView.keyboardDismissMode = UIScrollViewKeyboardDismissModeOnDrag;
tableView.keyboardDismissMode = UIScrollViewKeyboardDismissModeInteractive;
전자는 테이블 보기가 스크롤될 때 키보드를 화면 밖으로 애니메이션화하고 후자는 재고 메시지 앱처럼 키보드를 숨깁니다.
iOS 7.0 이상에서 사용할 수 있습니다.
XCode 6 이상의 스토리보드를 사용하여 이 작업을 수행할 수 있습니다.
키보드 숨기기 작업 만들기
ViewController에서 사용하는 클래스의 헤더 파일에 추가합니다.
@interface TimeDelayViewController : UIViewController <UITextFieldDelegate>
- (IBAction)dissmissKeyboardOnTap:(id)sender;
@end
그런 다음 동일한 ViewController의 구현 파일에 추가합니다.
- (IBAction)dissmissKeyboardOnTap:(id)sender{
[[self view]endEditing:YES];
}
이제 스토리보드 장면(예: ViewController)에 대한 '수신된 액션' 중 하나가 됩니다.
작업을 사용자 이벤트에 연결
이제 키보드를 터치하는 사용자 제스처에 이 동작을 연결해야 합니다.
중요 - 스토리보드에 포함된 'UIView'를 UIC 컨트롤로 변환해야 이벤트를 수신할 수 있습니다.View Controller Scene 계층에서 보기를 선택합니다.
...클래스를 변경합니다.
이제 장면의 '수신된 액션' 옆에 있는 작은 원에서 장면의 '빈' 부분으로 끕니다(실제로는 '수신된 액션'을 UI 컨트롤로 끕니다).다음과 같은 작업을 수행할 수 있는 이벤트를 선택할 수 있습니다.
'내부 터치업' 옵션을 선택합니다.이제 만든 IBAction을 키보드를 터치하는 사용자 작업에 연결했습니다.사용자가 키보드를 누르면 키보드가 숨겨집니다.
(참고: 이벤트에 작업을 연결하려면 수신된 작업에서 View 컨트롤러 계층의 UI 컨트롤로 직접 끌어서 이동할 수도 있습니다.계층에서 'Control'로 표시됩니다.)
내가 제대로 이해했다면 외부를 탭하는 동안 키보드를 사임하고 싶을 것입니다.textfield
하지만 당신은 당신에 대한 언급이 없습니다.textfield
.
사용해 보십시오.
- 글로벌 textField를 사용하여 이를 호출합니다.
reftextField
지금은
textFieldDidBeginEditing
참조 텍스트 필드를 다음으로 설정- (void) textFieldDidBeginEditing:(UITextField *)textField{ reftextField = textField; }
이제 모든 버튼 시계에서 행복하게 사용할 수 있습니다(편집 시작 시 투명 버튼 추가 권장).
- (void)dismissKeyboard { [reftextField resignFirstResponder]; }
아니면 사임 버튼을 누르거나 이것을 클릭하세요.
//for resigning on done button - (BOOL) textFieldShouldReturn:(UITextField *)textField{ [textField resignFirstResponder]; return YES; }
여기 목록에 외부 터치에서 키보드를 해제하는 방법에 대한 제 버전을 추가하려고 합니다.
ViewDidLoad:
UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTap:)];
[self.view addGestureRecognizer:singleTap];
어디서나:
-(void)handleSingleTap:(UITapGestureRecognizer *)sender{
[textFieldName resignFirstResponder];
puts("Dismissed the keyboard");
}
Inswift 5 다음 코드를 사용하여 텍스트 필드 외부의 키보드를 해제할 수 있습니다.
override func viewDidLoad() {
// ... code
let tapGesture = UITapGestureRecognizer(target: self, action: #selector(self.dismissKeyboard(_:)))
self.view.addGestureRecognizer(tapGesture)
}
@objc func dismissKeyboard(_ sender: UITapGestureRecognizer) {
self.view.endEditing(true)
}
목표-C:
이 코드를 ViewController.m 파일에 추가합니다.
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
[self.view endEditing:YES];
}
스위프트:
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
view.endEditing(true)
}
사용에 대한 많은 훌륭한 답변이 여기에 있습니다.UITapGestureRecognizer
것이 중단됩니다. -----------------------------------------------------------UITextField
의 지우기(X) 버튼.해결책은 대리자를 통해 제스처 인식기를 억제하는 것입니다.
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
BOOL touchViewIsButton = [touch.view isKindOfClass:[UIButton class]];
BOOL touchSuperviewIsTextField = [[touch.view superview] isKindOfClass:[UITextField class]];
return !(touchViewIsButton && touchSuperviewIsTextField);
}
가장 강력한 솔루션은 아니지만 저에게는 효과가 있습니다.
다음과 같이 UiView에 대한 카테고리를 생성하고 touchsBegin 메서드를 재정의할 수 있습니다.
그것은 저에게 잘 작동하고 있습니다.그리고 이 문제에 대한 중앙 집중식 해결책입니다.
#import "UIView+Keyboard.h"
@implementation UIView(Keyboard)
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
[self.window endEditing:true];
[super touchesBegan:touches withEvent:event];
}
@end
@Jensen2k의 답변의 빠른 버전:
let gestureRecognizer : UITapGestureRecognizer = UITapGestureRecognizer.init(target: self, action: "dismissKeyboard")
self.view.addGestureRecognizer(gestureRecognizer)
func dismissKeyboard() {
aTextField.resignFirstResponder()
}
원 라이너
self.view.addTapGesture(UITapGestureRecognizer.init(target: self, action: "endEditing:"))
저는 새로운 개발을 위해 배리의 예를 사용했습니다.잘 작동했습니다! 하지만 편집 중인 텍스트 필드에 대해서만 키보드를 해제해야 하는 약간의 변경 사항을 포함해야 했습니다.
그래서 배리의 예에 다음을 추가했습니다.
- (void) textFieldDidBeginEditing:(UITextField *)textField
{
_textBeingEdited = textField;
}
-(void) textFieldDidEndEditing:(UITextField *)textField
{
_textBeingEdited = nil;
}
또한 다음과 같이 키보드 숨기기 방법을 변경했습니다.
- (IBAction)hideKeyboard:(id)sender
{
// Just call resignFirstResponder on all UITextFields and UITextViews in this VC
// Why? Because it works and checking which one was last active gets messy.
//UITextField * tf = (UITextField *) sender;
[_textBeingEdited resignFirstResponder];
}
중 는 이 를 가장쉽짧방법중하이당코컴다신것추입니는가하퓨에에 하는 입니다.viewDidLoad
[self.view addGestureRecognizer:[[UITapGestureRecognizer alloc]
initWithTarget:self.view
action:@selector(endEditing:)]];
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
if let touch = touches.first{
view.endEditing(true)
}
}
저는 여기서 많은 반응을 시도했지만 운이 없었습니다.탭 제스처 인식기가 항상 문제를 일으켰습니다.UIButtons
탭해도 제가 해도 반응이걸리지 않습니다. 심지어 제가 설정했을 때도.cancelsTouchesInView
제스처 인식기의 속성을 NO로 지정합니다.
이것이 결국 문제를 해결한 것입니다.
아이바 있음:
UITapGestureRecognizer *_keyboardDismissGestureRecognizer;
텍스트 필드가 편집을 시작하면 제스처 인식기를 설정합니다.
- (void) textFieldDidBeginEditing:(UITextField *)textField
{
if(_keyboardDismissGestureRecognizer == nil)
{
_keyboardDismissGestureRecognizer = [[[UITapGestureRecognizer alloc]
initWithTarget:self
action:@selector(dismissKeyboard)] autorelease];
_keyboardDismissGestureRecognizer.cancelsTouchesInView = NO;
[self.view addGestureRecognizer:_keyboardDismissGestureRecognizer];
}
}
그렇다면 중요한 것은 어떻게 설정하느냐에 있습니다.dismissKeyboard
방법:
- (void) dismissKeyboard
{
[self performSelector:@selector(dismissKeyboardSelector) withObject:nil afterDelay:0.01];
}
- (void) dismissKeyboardSelector
{
[self.view endEditing:YES];
[self.view removeGestureRecognizer:_keyboardDismissGestureRecognizer];
_keyboardDismissGestureRecognizer = nil;
}
내 생각에 그것을 얻는 것에는 뭔가가 있는 것 같아요.dismissKeyboardSelector
터치 핸들링 실행 스택에서 실행...
resignFirstResponder
텍스트 파일에 저장할 수 있습니다.자세한 내용은 이 게시물을 참조하십시오.
작동합니다.
이 예에서 TextField는 유일한 UITextField...다른 또는 UITextView가 있는 경우에는 조금 더 해야 할 일이 있습니다.
// YourViewController.h
// ...
@interface YourViewController : UIViewController /* some subclass of UIViewController */ <UITextFieldDelegate> // <-- add this protocol
// ...
@end
// YourViewController.m
@interface YourViewController ()
@property (nonatomic, strong, readonly) UITapGestureRecognizer *singleTapRecognizer;
@end
// ...
@implementation
@synthesize singleTapRecognizer = _singleTapRecognizer;
// ...
- (void)viewDidLoad
{
[super viewDidLoad];
// your other init code here
[self.view addGestureRecognizer:self.singleTapRecognizer];
{
- (UITapGestureRecognizer *)singleTapRecognizer
{
if (nil == _singleTapRecognizer) {
_singleTapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(singleTapToDismissKeyboard:)];
_singleTapRecognizer.cancelsTouchesInView = NO; // absolutely required, otherwise "tap" eats events.
}
return _singleTapRecognizer;
}
// Something inside this VC's view was tapped (except the navbar/toolbar)
- (void)singleTapToDismissKeyboard:(UITapGestureRecognizer *)sender
{
NSLog(@"singleTap");
[self hideKeyboard:sender];
}
// When the "Return" key is pressed on the on-screen keyboard, hide the keyboard.
// for protocol UITextFieldDelegate
- (BOOL)textFieldShouldReturn:(UITextField*)textField
{
NSLog(@"Return pressed");
[self hideKeyboard:textField];
return YES;
}
- (IBAction)hideKeyboard:(id)sender
{
// Just call resignFirstResponder on all UITextFields and UITextViews in this VC
// Why? Because it works and checking which one was last active gets messy.
[aTextField resignFirstResponder];
NSLog(@"keyboard hidden");
}
- (void)viewDidLoad
{
[super viewDidLoad];
UITapGestureRecognizer *singleTapGestureRecognizer = [[UITapGestureRecognizer alloc]
initWithTarget:self
action:@selector(handleSingleTap:)];
[singleTapGestureRecognizer setNumberOfTapsRequired:1];
[singleTapGestureRecognizer requireGestureRecognizerToFail:singleTapGestureRecognizer];
[self.view addGestureRecognizer:singleTapGestureRecognizer];
}
- (void)handleSingleTap:(UITapGestureRecognizer *)recognizer
{
[self.view endEditing:YES];
[textField resignFirstResponder];
[scrollView setContentOffset:CGPointMake(0, -40) animated:YES];
}
이 경우 ScrollView를 사용하여 다음에 추가할 수 있습니다.TextField
에서 I the ScrollView(스크롤뷰)를.ScrollView
보기를 선택한 다음 키보드를 해제합니다.만약을 위해 샘플 코드를 만들어 보았습니다. 것처럼.
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var scrollView: UIScrollView!
@IBOutlet weak var textField: UITextField!
override func viewDidLoad() {
super.viewDidLoad()
let tapGesture = UITapGestureRecognizer(target: self, action: #selector(ViewController.tap(_:)))
view.addGestureRecognizer(tapGesture)
// Do any additional setup after loading the view, typically from a nib.
}
func tap(gesture: UITapGestureRecognizer) {
textField.resignFirstResponder()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
당신의 스토리보드 저것을 보세요.
UITextField 외부를 클릭하여 키보드를 해제하는 데 UITapGestureReconnizer 방법을 사용할 수 있습니다.사용자가 UITextField 외부를 클릭할 때마다 이 방법을 사용하면 키보드가 해제됩니다.아래는 이를 사용하기 위한 코드 조각입니다.
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]
initWithTarget:self
action:@selector(dismissk)];
[self.view addGestureRecognizer:tap];
//Method
- (void) dismissk
{
[abctextfield resignFirstResponder];
[deftextfield resignFirstResponder];
}
언급URL : https://stackoverflow.com/questions/5306240/ios-dismiss-keyboard-when-touching-outside-of-uitextfield
'programing' 카테고리의 다른 글
__future__import absolute_import에서 실제로 수행하는 작업은 무엇입니까? (0) | 2023.06.15 |
---|---|
TypeScript에서 router.navigate로 새 탭을 여는 방법 (0) | 2023.06.15 |
전송 보안이 일반 텍스트 HTTP를 차단했습니다. (0) | 2023.06.15 |
C 연결 오류: 'main'에 대한 정의되지 않은 참조 (0) | 2023.06.15 |
Android:애니메이션 확장/축소 (0) | 2023.06.15 |