Obj-C - 通过在UITextView屏幕上的任意位置点击关闭键盘?
当我的用户点击我的UITextView(不是uitextfield ...)时,会出现动画。但是在UITextView开始编辑之后,没有其他的UITapGesture被识别出来(例如,如果我添加一个tapGesture到我的UIView来消除这个动画,它根本不会执行)。我一直试图解决这个问题,感觉像是永远。帮助表示赞赏,我很难过。Obj-C - 通过在UITextView屏幕上的任意位置点击关闭键盘?
ViewController.m
- (void)viewDidLoad
{
[super viewDidLoad];
self.replyField.delegate = self;
[self.replyField setUserInteractionEnabled:YES];
UITapGestureRecognizer *gestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(textViewTapped)];
[self.view addGestureRecognizer:gestureRecognizer];
}
-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
return YES;
}
-(void)textViewTapped {
NSLog(@"DISMISS PLEASE!");
[self animateTextView:NO];
}
- (void)textViewDidBeginEditing:(UITextView *)textView
{
[self animateTextView: YES];
self.replyField.gestureRecognizers = nil;
}
- (void)textViewDidEndEditing:(UITextView *)textView
{
[self animateTextView:NO];
}
- (void) animateTextView:(BOOL) up
{
const int movementDistance = 206;
const float movementDuration = 0.3f;
int movement= movement = (up ? -movementDistance : movementDistance);
NSLog(@"%d",movement);
[UIView beginAnimations: @"anim" context: nil];
[UIView setAnimationBeginsFromCurrentState: YES];
[UIView setAnimationDuration: movementDuration];
self.view.frame = CGRectOffset(self.inputView.frame, 0, movement);
[UIView commitAnimations];
}
- (void)textViewDidChange:(UITextView *)textView
{
}
您的问题与手势识别器无关。 问题引起的线:
self.view.frame = CGRectOffset(self.inputView.frame, 0, movement);
你为self.view从self.inputView具有偏移设定帧。
而当self.view大小发生变化时,其子视图(包括文本视图)可能具有超出视图范围的位置。如果触摸点超出了超视界,UIView不响应触摸事件。 您可以轻松地设置视图背景色检查并显示他们帧日志:
...
- (void) animateTextView:(BOOL) up
{
NSLog(@"self.view state1:%@", self.view);
NSLog(@"self.replyField state1:%@", self.replyField);
self.view.backgroundColor = [UIColor redColor];
self.replyField.backgroundColor = [UIColor blueColor];
const int movementDistance = 206;
const float movementDuration = 0.3f;
int movement= movement = (up ? -movementDistance : movementDistance);
NSLog(@"%d",movement);
[UIView beginAnimations: @"anim" context: nil];
[UIView setAnimationBeginsFromCurrentState: YES];
[UIView setAnimationDuration: movementDuration];
//self.view.frame = CGRectOffset(self.inputView.frame, 0, movement);
self.replyField.frame = CGRectOffset(self.replyField.frame, 0, movement);
[UIView setAnimationDidStopSelector:@selector(afterAnimationStops)];
[UIView commitAnimations];
}
- (void)afterAnimationStops {
NSLog(@"self.view state2:%@", self.view);
NSLog(@"self.replyField state2:%@", self.replyField);
}
...
还什么是self.inputView?它是否设置正确?
BTW:代码的目标是什么?你想移动文本视图以避免键盘重叠?然后考虑将它放在UIScrollView中。 例如参见这里的讨论:How to make a UITextField move up when keyboard is present?。
你是个天才。大声笑。谢谢,这让我非常疯狂!修正了基于此的代码。 – Brittany
在的viewController可以做到这一点
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
[self.view endEditing:Yes];
}
在viewDidLoad中:
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]
initWithTarget:self
action:@selector(dismissKeyboard)];
[self.view addGestureRecognizer:tap];
创建一个方法:
-(void)dismissKeyboard {
[textView resignFirstResponder];
}
我遇到过类似的问题,请使用下面的代码通过点击屏幕视图上的任意位置来关闭键盘。希望对你有帮助。
目标C
- (void)viewDidLoad
{
UITapGestureRecognizer *gestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(dismissKeyboard)];
[self.view addGestureRecognizer:gestureRecognizer];
gestureRecognizer.cancelsTouchesInView = NO;
}
- (void)dismissKeyboard
{
[self.view endEditing:YES];
}
斯威夫特4
func viewDidLoad() {
let gestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(self.dismissKeyboard))
view.addGestureRecognizer(gestureRecognizer)
gestureRecognizer.cancelsTouchesInView = false
}
func dismissKeyboard() {
view.endEditing(true)
}
我结束了使用这种方法,它的工作原理 - 但在这种情况下,如何在键盘显示时将视图向上移动? – Brittany
没有搞清楚什么是你想要顺便说一句让我解释一下。
首先,如果你想隐藏你的键盘,你可以通过单行代码来完成。
目标C
[self.view endEditing:YES];
斯威夫特
view.endEditing(true)
现在在你的代码,你self.view
加点触手势就意味着如果触摸主视图中的任何地方,然后你的姿态方法会呼叫。如果你希望当我触摸主视图时我的键盘将被隐藏,那么在点击手势的方法中,你应该写上面的代码([self.view endEditing:YES];
)但是如果你点击你的textView,确保键盘将被打开。
但如果你想键盘的时候我就UITextView
然后双击的方法有很多,但按照以下
目标C
UIView* dummyInputView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 1, 1)];
myTextView.inputView = dummyInputView;
斯威夫特不应打开
let dummyInputView = UIView(frame: CGRect(x: 0, y: 0, width: 1, height: 1))
myTextView.inputView = dummyInputView
这里键盘不会打开,但是如果是y,则光标会闪烁OU想隐藏光标则可以如果你有那么任何问题做评论下面的代码
目标C
myTextView.tintColor = [UIColor clearColor];
斯威夫特
myTextView.tintColor = UIColor.clear
做的。
尝试结合使用'resignFirstResponder'用'endEditing:' –
@AlejandroIván试了一下,没有去:( – Brittany
'[self.replyField resignFirstResponder]' –