UITextView keyboardDismissMode Bug

时间:2013-09-21 08:13:27

标签: ios xcode uiscrollview uitextview ios7

我刚刚发现了keyboardDismissMode的新scroll view属性的烦人错误。当text view使用值为UIScrollViewKeyboardDismissModeInteractive并且键盘被解除时,scroll view似乎会在继续减速之前跳到顶部。

我已向Apple提交了错误报告但需要解决方法。我尝试了DAKeyboardControl没有新的iOS7支持,幕后使用的是keyboardDismissMode,它仍然会对我说明这是一个更深层次的问题。

有什么建议吗?

2 个答案:

答案 0 :(得分:1)

对于这个问题,您可以使用scrollviewDelegete进行编码,只需提及何时通过ResignFirstResponder解除键盘

答案 1 :(得分:0)

似乎是一个错误或只是一个非理想的默认状态。但是根据测试项目中的代码,经过一些更精细的调整后,下面的内容可能会起作用。

示例代码存在两个问题,一个是当键盘出现时您没有对文本大小做任何事情,因此您无法使用或查看键盘下的文本。还有其他解决方案,但快速而肮脏的解决方案是更改帧大小(在提交应用程序中,我还将获取动画信息并动画视图框架更改以匹配键盘动画,这超出了此问题的范围)。你在'willShow'之类的东西中做到了,然后把它带回'didHide'之类的东西。

然后,内容偏移在隐藏时会被捏造,并且当您在回调之前和周围将其拖离屏幕以进行隐藏和滚动视图更改时,会出现一些奇怪的状态。我只是保存状态并在键盘消失后“修复”它,我已经更新了文本视图。

我在故事板中创建了一些属性和插座,以便用文本视图进行捏造。

- (void) viewDidLoad
{
    [super viewDidLoad];

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardDidHide:) name:UIKeyboardDidHideNotification object:nil];
}

- (void) keyboardWillShow:(NSNotification *)notification
{
    NSDictionary * info = [notification userInfo];
    CGSize size = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;

    CGRect rect = self.textView.frame;
    rect.size.height -= size.height;
    self.textView.frame = rect;
}

- (void)keyboardDidHide:(NSNotification *)notification
{
    NSLog(@"====== keyboardDidHide =======");

    NSDictionary * info = [notification userInfo];
    CGSize size = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;

    CGRect rect = self.textView.frame;
    rect.size.height += size.height;
    self.textView.frame = rect;


    self.hidingKeyboard = YES;
}

- (void) scrollViewDidScroll:(UIScrollView *)scrollView
{
    NSLog(@"%f", scrollView.contentOffset.y);
    if(self.hidingKeyboard == YES)
    {
        scrollView.contentOffset = self.lastOffset;
        self.hidingKeyboard = NO;
        NSLog(@"====== reset =======");
    }
    else
        self.lastOffset = scrollView.contentOffset;
}