xcode 与UITextField相比,UITextView的加载时间较慢

mmvthczy  于 2023-03-13  发布在  其他
关注(0)|答案(1)|浏览(129)

我正在做一个基于XML文件动态创建表单的项目。一切都很好,除了如果一个表单有太多的textView,它加载非常慢。通过xcode时间分析器分析应用程序的性能,我发现每当textView初始化时,它会消耗大量的CPU。
为了使这一点更容易理解,我创建了一个示例项目来重现这个问题。当加载ViewController时,示例项目只添加了大约1000个UITextView。我使用Xcode Profiler检查了这段代码的性能。我能够弄清楚,如果UITextView被UITextField替换,性能显著提高。2演示项目会显示出一点改进,因为视图仅限于文本视图或文本字段。3但在我的实际应用中,当我尝试加载一个很重的XML时,我看到至少有4秒的改进。

示例项目:https://github.com/amrit42087/TextView_Performance
以下是Xcode Profiler的屏幕截图(带UITextView):

下面是Xcode Profiler的屏幕截图,其中包含UITextField:

UITextField将UITextView的加载时间从1.49秒减少到960毫秒。我的实际项目注意到了相当多的改进,因为这是一个繁重的应用程序。

**问题:**如果有人能提出一个解决方案来提高使用UITextView时的性能,我将不胜感激。使用UITextField不是一个选项,因为我需要多行文本。

yi0zb3m4

yi0zb3m41#

默认情况下,UITextView初始化时.isSelectable属性设置为true
isSelectable属性是一个布尔值,它确定用户是否可以选择UITextView示例的文本内容并与之交互。
isSelectable属性设置为true时,用户可以通过几种方式与文本视图的内容交互,例如:

  • 通过在文本视图的内容上拖动手指来选择一系列文本
  • 将所选文本复制到剪贴板
  • 点击链接或电话号码以触发相应的操作

如果isSelectable属性设置为false,用户将无法选择文本视图内容中的任何文本或与文本视图内容中的任何链接或电话号码交互。
但是,值得注意的是,即使将isSelectable设置为false,文本视图仍然可以显示属性化文本,您仍然可以设置和获取文本视图的text和attributedText属性。
因此,尝试禁用它,从设置为false开始,然后添加textview作为子视图。

private func addTextView() {
    let textView = UITextView(frame: .zero)
    textView.isSelectable = false

    view.addSubview(textView)
}

如果仍然看到性能问题,请尝试从xib文件创建UITextView,确保取消Selectable behavior选项。
我测量了性能,得到的结果似乎更接近UITextField的,然而,它可能会因机器硬件而异,但看起来很有希望。
MacBook Pro 2021,M1 Pro芯片

UITextField    
Elapsed time: 1.0315909385681152 seconds

UITextView  
Elapsed time: 1.2108770608901978 seconds

如果你仍然需要它是可选择的,可以考虑在示例化完成后再做,希望这能有所帮助。

相关问题