【问题标题】:Black view is comming while hiding a keyboard隐藏键盘时出现黑色视图
【发布时间】:2018-06-19 08:08:59
【问题描述】:

这是我为在用户开始输入 textview 时移动 textview 而编写的一些代码。

这是代码,

-(BOOL)textViewShouldBeginEditing:(UITextView *)textView{
    if(textView == _textViewMsg || textView == _subjectView ){
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardDidShow:) name:UIKeyboardDidShowNotification object:nil];
   // return YES;
    }
    return YES;
}

- (BOOL)textViewShouldEndEditing:(UITextView *)textView{
    if(textView == _textViewMsg || textView == _subjectView ){
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardDidHide:) name:UIKeyboardDidHideNotification object:nil];

    [self.view endEditing:YES];
    }
    return YES;
}


- (void)keyboardDidShow:(NSNotification *)notification
{

    [self.view setFrame:CGRectMake(0,-50,320,460)];
}

-(void)keyboardDidHide:(NSNotification *)notification
{
    [self.view setFrame:CGRectMake(0,60,320,520)];
}

当我在移动中单击 textview(在主题中)视图时,我可以输入 textview。它工作正常。 (图一)

当我点击完成按钮时,在隐藏时,即在键盘隐藏时会出现一个黑色视图(检查图像 2)几秒钟,然后再次出现正常视图。

编辑:

解决方案:@michael 刚刚给了我解决方案

UIKeyboardDidHideNotification 更改为 UIKeyboardWillHideNotification 它对我有用。

出现新问题: 当我开始输入前 2 个文本视图时,即请求者、名字和姓氏......我无法输入它,因为它正在向上移动。

【问题讨论】:

  • 你能确认同样的问题发生在真实设备上,而不仅仅是模拟器上吗?
  • 真实设备也在发生同样的事情。
  • 不是在文本字段委托中添加观察者,而是将它们添加到 viewDidLoad 并在 dealloc 或 viewDidDisappear 中删除它们。不要更改 self.view 的框架,而是通过将所有这些添加到单独的视图中来优雅地处理它,使其成为 self.view 的子视图,然后移动该单独的视图。或使用 IQKeyBoardManager,您无需执行任何操作。
  • @Ajinkya 我已经使用了 IQKeyBoardManager 库,但我仍然遇到这个问题。
  • 在那个视图中有 9 个视图,其中 5 个是 textview,4 个是 textfield。

标签: ios objective-c keyboard uitextview


【解决方案1】:

发生这种情况是因为您在键盘消失后更改了视图框架,当系统动画完成时。快速修复:将UIKeyboardDidHideNotification 更改为UIKeyboardWillHideNotification

但如果您不介意的话,我想在您的代码中指出其他几项。

1: 每次用户开始编辑时,您都会订阅通知。这意味着当用户第二次开始输入时,您的代码将被触发两次。在viewDidAppear 订阅通知并在viewWillDisappear 取消订阅更合适:

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear: animated];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardDidShow:) name:UIKeyboardDidShowNotification object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardDidHideNotification object:nil];
}

- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}

2: 然后您将框架更改为恒定值。但是现在苹果支持不同尺寸的不同键盘,更不用说键盘尺寸在不同的设备和不同的可能模式下有所不同。因此,从通知中获取键盘大小更为明智:

- (void)keyboardDidShow:(NSNotification *)aNotification
{
    CGRect keyboardFrame = [[aNotification.userInfo valueForKey: UIKeyboardFrameEndUserInfoKey] CGRectValue];
    CGRect overlap =  CGRectIntersection( self.view.frame, keyboardFrame);
    // Setup new frmae according to overlap, for example reduce size by half of overlap, and move up by another half
    CGRect newFrame = self.view.frame;
    newFrame.origin.y -= overlap.size.height / 2.0
    newFrame.size.height -= overlap.size.height / 2.0
    self.view.frame = newFrame;
}

3: 动画:您也可以从通知中获取键盘动画持续时间: UIKeyboardAnimationDurationUserInfoKey:

NSTimeInterval duration = [[aNotification.userInfo  valueForKey: UIKeyboardAnimationDurationUserInfoKey] doubleValue];
[UIView animateWithDuration:duration animations:^{
    self.view.frame = newFrame;
}];

4 看起来您正在使用滚动视图(UITableView 和 UICollectioView 是滚动视图),您可以代替更改框架,更改内容插入(在底部滚动视图中添加空白区域)

[self.view setContentInset:UIEdgeInsetsMake(0, 0, overlap.size.height, 0)];

5 考虑使用自动布局。

【讨论】:

  • 我的问题解决了,但是当我开始输入前 2 个文本视图时,即请求者文本视图和名字文本视图 ....我无法输入它,因为它正在向上移动。其余工作正常
  • 答案已更新,并且在您的原始代码中您正在向上移动视图,所以也许您应该这样做,或者至少检查您正在编辑的字段并确保它会保留在屏幕上。您可以使用边缘插入和滚动偏移来将正在编辑的字段滚动到适当的位置。
【解决方案2】:

添加观察者应该在 viewdidload 中。尝试将添加键盘观察者的代码移至 viewdidload。

编辑

而不是 did... 通知类型检查 will... 所以用 UIKeyboardWillShow 替换 UIKeyboardDidShowNotification,用 UIKeyboardWillHide 替换 UIKeyboardDidHideNotification。

【讨论】:

  • 不工作。我尝试在 viewdidload 方法中添加观察者。
【解决方案3】:

使用 IQKeyboardManager 框架将有助于处理键盘隐藏和取消隐藏问题,

最有效的键盘处理方式:IQKeyboardManager

方法一: 您可以将 Cocoa Pod 文件用于 IQKeyboardManager 库。

  1. 初始化 pod 文件。
  2. pod 'IQKeyboardManager'
  3. 安装 Pod 文件。

方法二:

从 github 下载 IQKeyboardManger SDK 并拖放到您的项目文件中。

Swift 代码 sn-p:

导入 IQKeyboardManagerSwift

@UIApplicationMain 类 AppDelegate: UIResponder, UIApplicationDelegate {

var window: UIWindow?

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

  IQKeyboardManager.sharedManager().enable = true

  return true
}

}

Objective-C 代码段:

#import <IQKeyboardManager/IQKeyboardManager.h>

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    //ONE LINE OF CODE.
    //Enabling keyboard manager(Use this line to enable managing distance between keyboard & textField/textView).
    [[IQKeyboardManager sharedManager] setEnable:YES];
return true;
}

希望这将帮助您解决键盘隐藏和取消隐藏 UI 问题。

【讨论】:

  • 非常有用的答案。
  • 我的问题解决了,但是当我开始输入前 2 个文本视图时,即请求者文本视图和名字文本视图 ....我无法输入它,因为它正在向上移动。其余工作正常
  • 只有当你选择底部文本视图时,视图才会上升。如果您最初从 FirstName 开始,它将正常工作。您也可以使用左右箭头移动到当前文本字段或文本视图。
猜你喜欢
  • 2015-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-13
  • 2018-06-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多