表格视图中的印地语文本滞后

Posted

技术标签:

【中文标题】表格视图中的印地语文本滞后【英文标题】:Hindi Text Lagging in tableview 【发布时间】:2016-06-01 12:41:02 【问题描述】:

我有来自Web-service的印地语文本列表并想在UILabel中显示。 我正在尝试使用以下代码。

为了测试,我设置了静态文本,例如:

 NSString *unicode=@"ये भी एक तमाशा है इश्क और मोहब्बत में... - ये भी एक तमाशा है इश्क और मोहब्बत में दिल किसी का होता है और बस किसी का चलता है.";

cell.lblPostContent.text = unicode;

这样的问题是...我的UITableview 滚动不顺畅。 UITableView 延迟太多。有什么方法可以用印地语正确显示此文本,并且还可以在 UITableView 上平滑滚动? 这是我的 cellForRowAtIndexPath………………

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

cell=(GroupDetailCustomeCell*)[tableview dequeueReusableCellWithIdentifier:cellIdentifier];

    if(cell==nil)

        cell=[[GroupDetailCustomeCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];

NSString *unicode=[[post.postContent URLDecode] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];

    if(unicode==nil)
        unicode=[post.postContent stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];

if([post.postType isEqualToString:@"0"])
        //textonly
        cell.lblPostContent.text =unicode;
    
    
 return cell;

【问题讨论】:

文本是印地语还是像 \uxxxx 这样的 unicode?​​span> @AshishKakkad 在英文文本中工作顺利,但在印地文文本中更加滞后...... 我有来自 web 服务的 unicode 相同的东西,即使是大文本也不会滞后,确保你有正确地重用单元格或任何其他在主线程上工作的东西,比如图像/缩略图下载等等。 @ChetanPrajapati 是的。我在想同样的问题可能是重复使用单元格。 @AshishKakkad cell=(GroupDetailCustomeCell*)[tableview dequeueReusableCellWithIdentifier:cellIdentifier]; if(cell==nil) cell=[[GroupDetailCustomeCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier]; 【参考方案1】:

tableView 组件是整个平台中最难学习的组件,因为 90% 的 ios 应用程序都是 tableView 中的数据。有很多事情可以提供这种不正确的行为。您可以尝试一些选项来修复它:

    tableView 中此类问题的最常见原因是heightForRowAtIndexPath 方法。尝试覆盖它并计算那里的真实单元格高度。

例子:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
NSString *yourHindiText = [NSString stringWithString:@"some text"];

CGSize yourTextSize = [yourHindiText sizeWithFont:[UIFont fontWithName: @"SomeFont" size:someSize] constrainedToSize:kLabelFrameMaxSize];

return self.tableView.estimatedRowHeight + yourTextSize.height;

    尝试为您的单元格使用estimatedRowHeight 属性。正如苹果所说,这个属性提供了对行高的非负估计,可以提高加载表格视图的性能。如果表格包含可变高度的行,则在表格加载时计算它们的所有高度可能会很昂贵。使用估算可以将几何计算的一些成本从加载时间推迟到滚动时间。

    当您创建一个自定大小的表格视图单元格时,您需要设置此属性并使用约束来定义单元格的大小。

例子:

self.tableView.estimatedRowHeight = 44.0; //in your viewDidLoad method
    如果仍然没有,请始终在 cellForRowAtIndexPath: 中使用 dequeueReusableCellWithIdentifier:forIndexPath: 方法。

例子:

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath]; //in your cellForRowAtIndexPath method.
    如果委托未使用 rowHeight 属性实现 tableView:heightForRowAtIndexPath: 方法,您可以设置单元格的行高。

例子:

self.tableView.rowHeight = UITableViewAutomaticDimension; //in your viewDidLoad method

对于这个问题可能有越来越多的解决方案(例如使用Core Text Framework 或创建层以使用 GPU 而不是 CPU 来卸载它等)。 你可以找到很多可能的解决方案here。请关注first one。

【讨论】:

我用like=>- (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath return UITableViewAutomaticDimension; 【参考方案2】:

如果限制不是问题,您可以限制印地语字符以改善UITableView滚动延迟。

这是 swift 3 中限制的代码。

extension String

    func limit(by:Int) -> String 
        let startIndex = self.startIndex
        let endIndex = self.index(startIndex, offsetBy: by)
        let range = Range(uncheckedBounds: (lower:startIndex , upper: endIndex))
        return self[range]
    

希望这会有所帮助。

【讨论】:

以上是关于表格视图中的印地语文本滞后的主要内容,如果未能解决你的问题,请参考以下文章

HJCached 图像导致表格视图滞后

如何从 Android 中的印地语 PDF 文件中提取文本

表格单元扩展滞后

Android:将英文数字字符串显示为印地语或任何语言数字字符串

NSTableView 在滚动时非常滞后

将扩展的 ASCII 字符串转换为印地语文本