当前位置:  开发笔记 > IOS > 正文

使用Swift中的UITextView属性自定义UIView的加载时间较慢

如何解决《使用Swift中的UITextView属性自定义UIView的加载时间较慢》经验,为你挑选了1个好方法。

我最初问过这个问题.我假设自定义视图加载时间缓慢的原因是因为将多个视图叠加在一起或者可能是因为一些递归问题.然而,在删除越来越多的代码以查看会产生什么影响后,可归结为我是否有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在自定义视图中使用属性并避免这种缓慢的加载时间?



1> jamesk..:

瓶颈是selectableUITextView 的属性.在创建UITextView selectable并将其设置为默认值true时,会出现无法解释的性能问题.

解决此问题的最简单方法是使用故事板添加文本视图,确保取消标记selectable属性.似乎没有文档化的方法在代码中创建不可选择的文本视图(因为创建后设置可选择为false,无法避免创建期间的性能问题).如果需要可选择的文本视图,请首先创建一个不可选择的文本视图,然后将selectable设置为true viewDidAppear.

如果您无法使用故事板,则可能需要考虑使用第三方类,例如TTTAttributedLabel.

看起来Apple使用私有API来避免这个问题.其他有进取心的开发人员发现,在ChatKit中,文本视图似乎是使用一个名为的私有方法创建的initReadonlyAndUnselectableWithFrame:textContainer:.


这不是我希望的答案,但它确实回答了(在某种程度上)这个问题发生的原因.
只是注意,减速仅在调试时发生.如果您手动启动应用程序,则无任何延迟.
推荐阅读
mobiledu2402852357
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有