ios - uitextfield去掉边框 - uitextfield样式




iOS-在触摸UITextField外部时关闭键盘 (20)

这工作

在这个例子中,aTextField是唯一的UITextField ....如果有其他人或UITextViews,还有很多事情要做。

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

我想知道如何在用户触摸到UITextField之外时使键盘消失。


@ 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:"))

斯威夫特4

例如在viewDidLoad使用这个扩展方法设置你的UIViewController

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

只是在这里添加我的版本,如何在外部触摸上解除键盘。

viewDidLoad中:

UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTap:)];
[self.view addGestureRecognizer:singleTap];

任何地方:

-(void)handleSingleTap:(UITapGestureRecognizer *)sender{
    [textFieldName resignFirstResponder];
    puts("Dismissed the keyboard");
}

如果我有你的权利,你想要辞掉键盘,而不是在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;
    }
    

如果视图完全嵌入到UIScrollView那么您可以使用以下方法:

tableView.keyboardDismissMode = UIScrollViewKeyboardDismissModeOnDrag;
tableView.keyboardDismissMode = UIScrollViewKeyboardDismissModeInteractive;

当桌面视图滚动时,前者会使键盘脱离屏幕动画,后者会像股票消息应用程序一样隐藏键盘。

请注意,这些都可在iOS 7.0或更高版本上使用。


将此代码添加到ViewController.m文件中:

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    [self.view endEditing:YES];
}

将消息resignFirstResponder发送到放置在那里的文本文件。 请参阅此帖以获取更多信息。


您可以使用XCode 6及更高版本中的Storyboard进行此操作:


创建隐藏键盘的操作

将此添加到您的ViewController使用的类的头文件中:

@interface TimeDelayViewController : UIViewController <UITextFieldDelegate>

- (IBAction)dissmissKeyboardOnTap:(id)sender;

@end

然后将其添加到相同ViewController的实现文件中:

- (IBAction)dissmissKeyboardOnTap:(id)sender{
    [[self view]endEditing:YES];
}

这将成为您的故事板场景(即ViewController)的“已收到操作”之一:


将操作连接到用户事件

现在您需要将此操作连接到触摸键盘的用户手势。

重要 - 您需要将故事板中包含的'UIView'转换为UIControl ,以便它可以接收事件。 从View Controller Scene层次结构中选择视图:

...并改变它的类:

现在从您的场景的“接收动作”旁边的小圆圈拖动到场景的“空白”部分(实际上是将'接收的动作'拖动到UIControl中)。 您将看到一系列活动,您可以将活动与以下内容联系起来:

选择'修改里面'选项。 您现在已将您创建的IBAction挂接到触摸键盘的用户操作。 当用户点击键盘时,它现在将被隐藏。

(注意:要将操作挂钩到事件,您还可以将接收到的操作直接拖到View Controller层次结构中的UIControl中,它在层次结构中显示为“Control”。)


您可以创建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

我使用巴里的例子来进行我的新开发。 它效果很好! 但是我不得不稍微改变一下,只有在编辑的文本字段时才需要关闭键盘。

所以,我给巴里添加了以下例子:

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

我发现有些人在使用UITapGestureRecognizer方法时遇到了问题。 在完成此功能的同时,仍保留现有按钮的抽头行为的最简单方法是在@ Jensen2k的答案中只添加一行:

[tap setCancelsTouchesInView:NO];

这让我现有的按钮仍然可以使用@Dmitry Sitnikov的方法。

在这里阅读有关该property (搜索CancelsTouchesInView ): UIGestureRecognizer类参考

我不确定它是如何与滚动条一起工作的,因为我看到一些问题,但希望其他人可能遇到同样的情况。


我找到了几个答案。

使用在viewDidLoad:期间初始化的伊娃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];
}

我认为做到这一点最简单(也是最好)的方法是对全局视图进行子类化,并使用hitTest:withEvent方法来侦听任何触摸。 在键盘上触摸没有注册,所以hitTest:withEvent只有当你触摸/滚动/刷卡/捏...在其他地方,然后调用[self endEditing:YES]调用。

这比使用touchesBegan更好touchesBegan因为如果点击视图顶部的按钮, touchesBegan不会被调用。 例如,它比UITapGestureRecognizer更好,它无法识别滚动手势。 它比使用昏暗的屏幕更好,因为在复杂和动态的用户界面中,您无法在任何地方放置昏暗的屏幕。 此外,它不会阻止其他操作,您不需要点击两次以选择外部按钮(例如在UIPopover的情况下)。

另外,它比调用[textField resignFirstResponder] ,因为屏幕上可能有许多文本字段,所以这对所有的字符都适用。


最简单和最短的方法之一是将此代码添加到您的viewDidLoad

[self.view addGestureRecognizer:[[UITapGestureRecognizer alloc]
                                     initWithTarget:self.view
                                     action:@selector(endEditing:)]];

检查一下,这将是最简单的方法,

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
      [self.view endEditing:YES];// this will do the trick
}

要么

该库将处理包括滚动条自动滚动,点击空间以隐藏键盘等。

https://github.com/michaeltyson/TPKeyboardAvoiding



这是一个很好的通用解决方案:

Objective-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://.com/a/18756253/417652 ://.com/a/18756253/417652


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

}

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {

    if let touch = touches.first{
     view.endEditing(true)

     }
}




uikit