답변:
를 추가 UITapGestureRecogniser
하고보기에 할당 한 다음 UITextField
선택기에서 첫 번째 응답자에게 서명을 요청해야 합니다.
코드:
viewDidLoad에서
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(dismissKeyboard)];
[self.view addGestureRecognizer:tap];
dismissKeyboard에서 :
-(void)dismissKeyboard
{
[aTextField resignFirstResponder];
}
( aTextField
키보드를 담당하는 텍스트 필드는 어디에 있습니까 )
스위프트 3 버전은 다음과 같습니다
let tapGesture = UITapGestureRecognizer(target: self, action: #selector(self.dismissKeyboard (_:)))
self.view.addGestureRecognizer(tapGesture)
dismissKeyboard의 경우
func dismissKeyboard (_ sender: UITapGestureRecognizer) {
aTextField.resignFirstResponder()
}
[aTextField resignFirstResponder]
할 것보다 낫다고 생각 [self.view endEditing:YES];
합니다.
[self.view addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self.view action:@selector(endEditing:)]];
[tap setCancelsTouchesInView:NO];
의 답변 에 따라 추가했습니다 . 행 선택에 응답하지 않는 테이블에 문제가있었습니다. 5 년 후, 나는 이것이 다른 누군가를 돕기를 바랍니다.
self.view.addGestureRecognizer(UITapGestureRecognizer(target: self.view, action: #selector(UIView.endEditing(_:))))
나는 몇 가지 답변을 으깨었다.
동안 초기화되는 ivar을 사용하십시오. 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
}
또는
이 라이브러리는 스크롤 막대 자동 스크롤, 키보드를 숨길 수있는 탭 공간 등을 처리합니다.
일부 사람들은이 UITapGestureRecognizer
방법을 사용하는 데 문제가있는 것으로 보입니다 . 기존 버튼의 탭 동작을 그대로 유지 하면서이 기능을 수행하는 가장 쉬운 방법은 @ Jensen2k의 답변에 한 줄만 추가하는 것입니다.
[tap setCancelsTouchesInView:NO];
이것은 @Dmitry Sitnikov의 방법을 사용하지 않고 기존 버튼이 계속 작동하도록했습니다.
그것에 대해 읽으 property
십시오 (검색 CancelsTouchesInView
) : UIGestureRecognizer 클래스 참조
일부에 문제가 있음을 알기 때문에 스크롤 막대에서 어떻게 작동하는지 잘 모르겠지만 다른 사람이 내가 가진 것과 동일한 시나리오를 겪을 수도 있습니다.
UIImageView
추가 [imageView setUserInteractionEnabled:NO];
하고 추가 하고 "클릭"하면이 방법이 작동합니다.
당신의 수 있도록하는 것이 좋습니다 UIView
의 인스턴스를 UIControl
(인터페이스 빌더)와 그들의 연결 TouchUpInside
이벤트를 dismissKeyboard
하는 방법. 이 IBAction
방법은 다음과 같습니다.
- (IBAction)dismissKeyboard:(id)sender {
[aTextBox resignFirstResponder];
}
UITapGestureRecognizer
보기 내부의 버튼을 두드리는 것을 방해했습니다). 응답자 체인에 혼란 touchesEnded
이 있었기 때문에 작동하지 않았습니다 UIScrollView
.)
스위프트 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
}
}
Swift 버전은 다른 요소 (예 : a UIButton
또는 other)와 함께 작동합니다 UITextField
.
override func viewDidLoad() {
super.viewDidLoad()
let tapper = UITapGestureRecognizer(target: self, action:#selector(endEditing))
tapper.cancelsTouchesInView = false
view.addGestureRecognizer(tapper)
}
self
오히려self.view
canclesTouchesInView
사용하기 편리한 속성입니다. 감사.
c#
. 참고 세미콜론은 구문이 허용되므로 꼭 필요한 것은 아닙니다.
어떻습니까 : 나는 이것이 오래된 게시물이라는 것을 알고 있습니다. 누군가를 도울 수 있습니다 :)
- (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];
}
}
}
}
이것은 좋은 일반적인 해결책입니다.
목표 -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
스위프트 4 oneliner
view.addGestureRecognizer(UITapGestureRecognizer(target: view, action: #selector(UIView.endEditing(_:))))
가장 쉬운 방법은 글로벌 뷰를 서브 클래스 화하고 hitTest:withEvent
메서드를 사용 하여 모든 터치를 듣는 것입니다. 키보드의 터치는 등록되지 않았으므로 hitTest : withEvent는 다른 곳 을 터치 / 스크롤 / 스 와이프 / 핀치 할 때만 호출됩니다 [self endEditing:YES]
.
이것은 더 나은 사용하는 것보다 touchesBegan
있기 때문에 touchesBegan
당신이보기의 상단의 버튼을 클릭하면 호출되지 않습니다. UITapGestureRecognizer
예를 들어 스크롤 동작을 인식 할 수없는 것보다 낫습니다 . 복잡하고 역동적 인 사용자 인터페이스에서는 어두운 화면을 어디에나 배치 할 수 없기 때문에 어두운 화면을 사용하는 것보다 낫습니다. 또한 다른 작업을 차단하지 않으므로 외부의 버튼을 선택하기 위해 두 번 탭할 필요가 없습니다 (와 같은 경우 UIPopover
).
또한 [textField resignFirstResponder]
화면에 많은 텍스트 필드가있을 수 있으므로를 호출하는 것보다 낫습니다 . 따라서 모든 필드에 적용됩니다.
외부를 터치하여 키보드를 숨기는 가장 쉬운 방법이어야합니다.
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
[self.view endEditing:YES];
}
( 텍스트 필드 외부의 다른 영역을 누를 때 키보드 를 해제 하는 방법에서? )
XCode 6 이상의 스토리 보드를 사용하여이 작업을 수행 할 수 있습니다.
이것을 ViewController에서 사용하는 클래스의 헤더 파일에 추가하십시오.
@interface TimeDelayViewController : UIViewController <UITextFieldDelegate>
- (IBAction)dissmissKeyboardOnTap:(id)sender;
@end
그런 다음 동일한 ViewController의 구현 파일에 이것을 추가하십시오.
- (IBAction)dissmissKeyboardOnTap:(id)sender{
[[self view]endEditing:YES];
}
이제 스토리 보드 장면 (예 : ViewController)에 대한 '수신 된 액션'중 하나가됩니다.
이제 키보드를 터치하는 사용자 동작에이 동작을 연결해야합니다.
중요-스토리 보드에 포함 된 'UIView'를 UIControl로 변환해야 이벤트를 수신 할 수 있습니다. View Controller 장면 계층에서보기를 선택하십시오.
... 그리고 클래스를 변경하십시오 :
이제 장면의 '수신 된 액션'옆에있는 작은 원에서 장면의 '빈'부분으로 드래그하십시오 (실제로 '수신 된 액션'을 UIControl로 드래그합니다). 다음과 같은 작업을 수행 할 수있는 다양한 이벤트가 표시됩니다.
'내부 터치'옵션을 선택하십시오. 이제 생성 한 IBAction을 키보드를 터치하는 사용자 동작에 연결했습니다. 사용자가 키보드를 탭하면 키보드가 숨겨집니다.
참고 : 액션을 이벤트에 연결하려면 수신 된 액션에서 View Controllers 계층의 UIControl로 직접 드래그 할 수도 있습니다. 계층에서 'Control'로 표시됩니다.
내가 당신을 바로 잡았다면 당신은 out of Side를 두드리는 키보드 wile을 사임하고 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");
}
여기에 사용에 대한 큰 응답의 많음 UITapGestureRecognizer
휴식의 --all 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);
}
가장 강력한 솔루션은 아니지만 저에게 효과적입니다.
return !touchViewIsButton
. 키보드를 해제 해야하는 다른 버튼은 해당 작업을 수행해야한다고 생각합니다. 또한 키보드 해제에서 레이아웃이 변경 될 때 TouchUpInside가 호출되지 않을 수 있습니다.
UiView에 대한 카테고리를 작성하고 다음과 같이 touchesBegan meathod를 대체 할 수 있습니다.
그것은 나를 위해 잘 작동하고 있으며이 문제에 대한 중앙 집중식 솔루션입니다.
#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:"))
새로운 개발에 Barry 예제를 사용했습니다. 잘 작동했습니다! 그러나 편집중인 텍스트 필드에 대해서만 키보드를 해제 해야하는 약간의 변경 사항이 포함되어야했습니다.
그래서 Barry 예제에 다음을 추가했습니다.
- (void) textFieldDidBeginEditing:(UITextField *)textField
{
_textBeingEdited = textField;
}
-(void) textFieldDidEndEditing:(UITextField *)textField
{
_textBeingEdited = nil;
}
또한 hideKeyboard 방법을 다음과 같이 변경했습니다.
- (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];
}
나는 여기에서 많은 반응을 시도했지만 운이 없었습니다. 탭 동작 인식기를 UIButtons
탭해도 탭 제스처 인식기가 항상 응답하지 않습니다.cancelsTouchesInView
속성을 NO로 .
이것이 결국 문제를 해결 한 것입니다.
ivar이 있으십시오 :
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
터치 처리 실행 스택 에서 실행을 얻는 것과 관련하여 뭔가가 있다고 생각합니다 ...
이 예제에서 aTextField는 유일한 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
있는 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 외부를 클릭하여 키보드를 닫는 데 UITapGestureRecongnizer 메소드를 사용할 수 있습니다. 사용자가 UITextField 외부를 클릭 할 때마다이 방법을 사용하면 키보드가 해제됩니다. 아래는이를 사용하기위한 코드 스 니펫입니다.
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]
initWithTarget:self
action:@selector(dismissk)];
[self.view addGestureRecognizer:tap];
//Method
- (void) dismissk
{
[abctextfield resignFirstResponder];
[deftextfield resignFirstResponder];
}