ios – 在自动调整TextView中输入文本时,UITableView闪烁/停顿

前端之家收集整理的这篇文章主要介绍了ios – 在自动调整TextView中输入文本时,UITableView闪烁/停顿前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
目前我有一个UITableView,其中有大小的UITextView.单元格使用beginUpdates / endUpdates自动调整大小,但是当它执行表视图stutters(参见下面的gif).

最终结果是一个UITableViewCell,其中有一个文本视图,它根据内容进行调整大小.这是自定义UITableViewCell类中的代码,使UITableView更新自身.

- (void)textViewDidChange:(UITextView *)textView {
    // This is a category on UITableViewCell to get the [self superView] as the UITableView
    UITableView *tableView = [self tableView];
    if (tableView){
        [tableView beginUpdates];
        [tableView endUpdates];
    }
}

这是我已经尝试过的事情:

获取当前的contentOffset并在endUpdates之后重新设置,但没有工作
在更新之前禁用UITableView上的滚动,然后启用
我尝试从 – (BOOL)textViewShouldEndEditing:(UITextView *)textView中始终返回NO
我的UITableView单元格高度正在使用UITableViewAutomaticDimension.欢迎任何其他想法或想法.

以下是一个示例:

我不想使用任何图书馆,所以请不要建议.

谢谢

编辑:解决方

发现于:I do not want animation in the begin updates,end updates block for uitableview?

感谢@JeffBowen为一个伟大的发现(虽然hacky它是可行的,并允许我仍然实现UITableViewDelegate方法支持iOS 7).在执行更新之前关闭动画,然后在更新后启用,以防止UITableView发生口吃.

[UIView setAnimationsEnabled:NO];
[tableView beginUpdates];
[tableView endUpdates];
[UIView setAnimationsEnabled:YES];

如果您不需要使用Delegate方法,并且只需要一个较少的hacky解决方案,只有iOS 8,然后去@ Massmaker的答案下面.

解决方法

我的解决方案(适用于iOS 8)首先在我的viewController viewDidLoad中设置
self.tableView.rowHeight = UITableViewAutomaticDimension;
// this line is needed to cell`s textview change cause resize the tableview`s cell
self.tableView.estimatedRowHeight = 50.0;

那么结合这篇文章solution in Swift和一些肮脏的想法
我在我的牢房里设置了一个属性,叫做

@property (nonatomic,strong) UITableView *hostTableView;

和cell-s(void)textViewDidChange:(UITextView *)textView

CGFloat currentTextViewHeight = _textContainer.bounds.size.height;
CGFloat toConstant = ceilf([_textContainer sizeThatFits:CGSizeMake(_textContainer.frame.size.width,FLT_MAX)].height);
if (toConstant  >  currentTextViewHeight)
{
    [_hostTableView beginUpdates];
    [_hostTableView endUpdates];
}

然后在viewController中

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

textCell.hostTableView = self.tableView;
原文链接:https://www.f2er.com/iOS/337096.html

猜你在找的iOS相关文章