Sur*_*gch 27 performance uitextview custom-view ios swift
我最初问过这个问题.我假设自定义视图加载时间缓慢的原因是因为将多个视图叠加在一起或者可能是因为一些递归问题.然而,在删除越来越多的代码以查看会产生什么影响后,可归结为我是否有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)
}
}
Run Code Online (Sandbox Code Playgroud)
正如你所看到的,唯一的区别UIView是我添加了一个UITextView属性.而且这种自定义视图加载速度非常慢.在Instruments中运行Allocations工具我得到以下结果(计数为997):
但是,如果我注释掉这条线
//var textView = UITextView()
Run Code Online (Sandbox Code Playgroud)
然后我自定义视图加载非常快,只有7的计数.
这里发生了什么?是否可以UITextView在自定义视图中使用属性并避免这种缓慢的加载时间?
jam*_*esk 27
瓶颈是selectableUITextView 的属性.在创建UITextView selectable并将其设置为默认值true时,会出现无法解释的性能问题.
解决此问题的最简单方法是使用故事板添加文本视图,确保取消标记selectable属性.似乎没有文档化的方法在代码中创建不可选择的文本视图(因为创建后设置可选择为false,无法避免创建期间的性能问题).如果需要可选择的文本视图,请首先创建一个不可选择的文本视图,然后将selectable设置为true viewDidAppear.
如果您无法使用故事板,则可能需要考虑使用第三方类,例如TTTAttributedLabel.
看起来Apple使用私有API来避免这个问题.其他有进取心的开发人员发现,在ChatKit中,文本视图似乎是使用一个名为的私有方法创建的initReadonlyAndUnselectableWithFrame:textContainer:.
尝试了类似的方法,其中将标签和文本字段作为子视图添加到 uiview 子类中。我所做的方法如下:
@interface CustomTextField : UIView
@property (weak, nonatomic) IBOutlet UITextField *valueField;
@end
Run Code Online (Sandbox Code Playgroud)
因此,我们有一个 xib 文件,我们实际上在其中添加了标签和文本字段。在 xib 文件上,文件所有者是“CustomTextField”,并且出口与头文件从那里链接。
构造方法如下所示:
- (id)initWithValue:(NSString *)value
{
self = [super initWithFrame:CGRectZero];
if (self) {
NSArray *nibs = [[NSBundle mainBundle] loadNibNamed:NSStringFromClass([self class]) owner:self options:nil];
UIView *view = nibs[0];
self.valueField.frame = view.bounds;
[self setFrame:view.bounds];
[self addSubview:view];
[self.valueField setText:value];
}
return self;
}
Run Code Online (Sandbox Code Playgroud)
对我来说效果很好。