动态文本视图大小调整在更新到 iOS 7.1 后中断



我有一个表视图,需要一个用于添加内容的子视图。 子视图包含用于输入文本的 UITextView。 在 7.1 之前,将发生以下情况:

  • 子视图通过滚动视图粘附到表视图的底部
  • 视图
  • 激活后,将显示键盘,视图与键盘一起动画化
  • 键入文本时,如果需要,textView 将向上展开,文本视图的底部保持不变。

现在在 7.1 之后,将发生以下行为:

  • 子视图向上动画,键盘精细
  • 如果文本强制换行,而不是展开,则文本视图DidEndEdit将触发,键盘将关闭。
  • 文本视图中不允许进一步编辑,任何编辑都会立即关闭键盘。

关于 7.1 发生了哪些变化会使现有的工作代码中断的任何建议? 这是所有相关代码。 我很乐意提供任何其他详细信息。 我已经有一段时间了,它让我精神上。

tableViewController.m - 在子视图中添加的代码。 子视图有自己的 xib。 xib 是在 IB 中创建的。 我删除了与其他组件相关的部分。

- (void)viewDidLoad {
    //Setup contentBar
    if (self.contentBar == nil) {
        //Add subView to View
        NSArray *subviewArray = [[NSArray alloc] init];
        subviewArray = [[NSBundle mainBundle] loadNibNamed:contentIdentifier owner:self options:nil];
        self.contentBar = [subviewArray objectAtIndex:0];
        [self.view addSubview:self.contentBar];
        //Setup textView
        UITextView *addContentTextView = (UITextView *)[self.contentBar viewWithTag:2];
        addContentTextView.text = [NSString stringWithFormat:@"text (optional)"];
        addContentTextView.delegate = self;
    }
}

我的文本查看委托

#pragma mark - TextView Delegate
- (void)textViewDidEndEditing:(UITextView *)textView{
    NSLog(@"textViewDidEndEditing:");
    if ([textView.text isEqualToString:@""]) {
        textView.text = @"text (optional)";
        textView.textColor = [UIColor lightGrayColor]; //optional
    }
    [textView resignFirstResponder];
}
- (void)textViewDidBeginEditing:(UITextView *)textView {
    NSLog(@"textViewDidBeginEditing:");
    if ([textView.text isEqualToString:@"text (optional)"]) {
        textView.text = @"";
        textView.textColor = [UIColor blackColor]; //optional
    }
    [textView becomeFirstResponder];
}
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
{
    NSString *newText = [textView.text stringByReplacingCharactersInRange:range withString:text];
    if ([newText length] > 0 || _image) {
        _addContentButton.enabled = YES;
    } else {
        _addContentButton.enabled = NO;
    }
    if([text isEqualToString:[text stringByTrimmingCharactersInSet:[NSCharacterSet newlineCharacterSet]]]) {
        return YES;
    } else {
        NSLog(@"return pressed");
        [textView resignFirstResponder];
        [self addedContent:nil];
    }
    return YES;
}
- (void)textViewDidChange:(UITextView *)textView
{
    NSLog(@"textViewDidChange");
    [self sizeTextView];
}
- (void)sizeTextView
{
    NSLog(@"sizeTextView");
    UIImageView *barImage = (UIImageView *)[self.contentBar viewWithTag:87];
    UITextView *textView = (UITextView *)[self.contentBar viewWithTag:2];
    CGSize sizeThatShouldFitTheContent = [textView sizeThatFits:textView.frame.size];
    CGRect newTextViewFrame = textView.frame;
    newTextViewFrame.size.height = sizeThatShouldFitTheContent.height;
    CGFloat adjustment = sizeThatShouldFitTheContent.height - textView.frame.size.height;
    newTextViewFrame.origin.y = textView.frame.origin.y - adjustment;
    textView.frame = newTextViewFrame;
    CGRect newImageViewFrame = barImage.frame;
    newImageViewFrame.size.height = barImage.frame.size.height + adjustment;
    newImageViewFrame.origin.y = barImage.frame.origin.y - adjustment;
    barImage.frame = newImageViewFrame;
}

如果您想查看其他内容,我很乐意发布。

我已经通过实现以下内容解决了这个问题:

    将我的表视图控制器
  • 重写为标准视图控制器,而不是表视图控制器
  • 向视图控制器添加了一个表视图和一个单独的"contentWrapper"视图。
  • 内容包装器包含如下所示的示例:https://github.com/datwelk/RDRStickyKeyboardView

我仍然不确定iOS 7.1中是什么导致了这个问题,但是使用RDRStickyKeyboardView效果很好,解决了我的所有问题。

我读过表视图不应该是其他视图的父视图,因此此解决方案也适用于良好的编码实践。

最新更新