ios - 在 Swift 中使用 UITextView 属性自定义 UIView 的加载时间缓慢

标签 ios swift performance uitextview custom-view

我最初问this question .我曾假设我的自定义 View 加载时间慢的原因是因为将多个 View 叠加在一起,或者可能是因为某些 recursion problem .然而,在删除越来越多的代码以查看有何不同之后,问题归结为我是否有 UITextView 存在。因为我的问题的明显根源与我在第一个问题中所期望的完全不同,所以我决定开始一个新问题,而不是对旧问题添加冗长的更新。

我用两个 View Controller 设置我的测试项目。第一个 View Controller 上的按钮调用第二个 View Controller 的 show segue。第二个 View Controller 上有我的自定义 View 。 (使用第二个 View Controller 让我了解加载自定义 View 需要多长时间。)

自定义 View 代码:

import UIKit

@IBDesignable class UIMongolTextView: UIView {

    var textView = UITextView() // key line

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }

    override init(frame: CGRect){
        super.init(frame: frame)
    }
}

如您所见,与UIView 的唯一区别是我添加了一个UITextView 属性。正是这个自定义 View 加载速度非常慢。在 Instruments 中运行分配工具我得到以下结果(计数为 997):

enter image description here

但是,如果我注释掉这一行

    //var textView = UITextView()

然后我的自定义 View 加载速度非常快,并且只有 7 个计数。

enter image description here

这是怎么回事?是否可以在自定义 View 中使用 UITextView 属性并避免这种缓慢的加载时间?

最佳答案

瓶颈是 UITextView 的 selectable 属性。在 selectable 设置为默认值 true 的情况下创建 UITextView 时存在莫名其妙的性能问题。

解决该问题的最简单方法是使用 Storyboard添加 TextView ,确保取消选中 selectable 属性。似乎没有记录在代码中创建不可选择的 TextView 的方法(因为在创建后将 selectable 设置为 false 并不能避免创建期间的性能问题)。如果需要可选择的 TextView ,首先创建一个不可选择的 TextView ,然后在 viewDidAppear 中将 selectable 设置为 true。

如果您不能使用 Storyboard,您可能需要考虑使用第三方类,例如 TTTAttributedLabel .

看起来 Apple 使用私有(private) API 来避免这个问题。其他有进取心的开发商有discovered在 ChatKit 中, TextView 似乎是使用名为 initReadonlyAndUnselectableWithFrame:textContainer: 的私有(private)方法创建的。

关于ios - 在 Swift 中使用 UITextView 属性自定义 UIView 的加载时间缓慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34199956/

相关文章:

java - 如何提高Java中的select查询性能?

algorithm - 给定文件名列表,返回具有相同内容的文件列表列表 - 面试题

c++ - 将字节数组 (uint8_t) 转换为字数组 (uint16_t),反之亦然

objective-c - 带有图像的 UIScrollView

ios - SwiftUI 不会对齐 ZStacks

ios - 如何在ios中找到用户点击屏幕的位置

iOS/swift - swift 中 UIViewController 中的常量

ios - 使用 Swift 3 和 Obj C 通过 NSNotificationCenter 将通知数据从 App Delegate 传递到 View Controller

ios - 在 block 中使用 NSUserDefaults 会导致内存崩溃

ios - 如何获取 ImageView 中图像的实际高度以进行纵横比匹配