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/

相关文章:

c++ - 图像矩的快速计算

java - Redis hash写入速度非常慢

Java - 向上舍入数,因此位数递增

ios - Swift:Voice Over 从 View 过渡到警报 View 或另一个 View

ios - 如何使用 iOS 轻松调整/优化图像大小?

Swift assert() 无法与 nil 进行简单比较

swift - editActionsForRowAtIndexPath 未调用,目前均提交 editorialStyle 和 canEditRowAt

ios - 有没有办法在 Swift/iOS 中比较按钮图像

ios - 尝试在 Swift 中追加字典

ios - 如何使用委托(delegate)将数据从页脚单元格传递到 View Controller ?