我最初问过这个问题.我假设自定义视图加载时间缓慢的原因是因为将多个视图叠加在一起或者可能是因为一些递归问题.然而,在删除越来越多的代码以查看会产生什么影响后,可归结为我是否有UITextView
礼物.因为我的问题的明显来源与我在第一个问题中所期望的那么不同,所以我决定开始一个新问题,而不是对旧问题添加冗长的更新.
我用两个视图控制器设置我的测试项目.第一个视图控制器上的按钮将show segue调用到第二个视图控制器.第二个视图控制器上有我的自定义视图.(使用第二个视图控制器让我了解加载自定义视图所需的时间.)
自定义视图代码:
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
属性.而且这种自定义视图加载速度非常慢.在Instruments中运行Allocations工具我得到以下结果(计数为997):
但是,如果我注释掉这条线
//var textView = UITextView()
然后我自定义视图加载非常快,只有7的计数.
这里发生了什么?是否可以UITextView
在自定义视图中使用属性并避免这种缓慢的加载时间?
瓶颈是selectable
UITextView 的属性.在创建UITextView selectable
并将其设置为默认值true时,会出现无法解释的性能问题.
解决此问题的最简单方法是使用故事板添加文本视图,确保取消标记selectable
属性.似乎没有文档化的方法在代码中创建不可选择的文本视图(因为创建后设置可选择为false,无法避免创建期间的性能问题).如果需要可选择的文本视图,请首先创建一个不可选择的文本视图,然后将selectable设置为true viewDidAppear
.
如果您无法使用故事板,则可能需要考虑使用第三方类,例如TTTAttributedLabel.
看起来Apple使用私有API来避免这个问题.其他有进取心的开发人员发现,在ChatKit中,文本视图似乎是使用一个名为的私有方法创建的initReadonlyAndUnselectableWithFrame:textContainer:
.