当我想用UITextView填充字符串时,我的整个应用程序会冻结。
这冻结了应用程序:
let testStringLineBreaks = "foooooo \n \n barrrrrr"
self.biographyTextView.text = testStringLineBreaks
这不会冻结应用程序:
let testStringNoLineBreaks = "foooooobarrrrrr"
self.biographyTextView.text = testStringNoLineBreaks
为什么呢?我该如何解决?我需要能够在我的UITextView上使用换行符,因为这是用户填写其个人资料描述的地方。
该应用程序使用大约60 MB。然而,当它被困在线上时:
self.biographyTextView.text = testStringLineBreaks
它持续上升大约每秒2 mb。我以183 mb的价格杀了这个应用程序。
它只发生在iOS 8而不是iOS 9上。
import UIKit
class GFTextView: UITextView {
let bottomBorder = CALayer()
@IBInspectable var haveBottomBar:Bool?
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
self.textContainer.lineFragmentPadding = 0
}
func addBottomBar(){
bottomBorder.frame = CGRectMake(0.0, self.frame.size.height - 1, self.frame.size.width, 1.0);
bottomBorder.backgroundColor = UIColor.grayColor().CGColor
self.layer.addSublayer(bottomBorder)
}
override func becomeFirstResponder() -> Bool {
let shouldBecomeFirstResponder = super.becomeFirstResponder()
bottomBorder.backgroundColor = shouldBecomeFirstResponder ? Constant.ui_applicationMainColor.CGColor : Constant.ui_applicationMainColor.CGColor
return shouldBecomeFirstResponder
}
override func resignFirstResponder() -> Bool {
let shouldResignFirstResponder = super.resignFirstResponder()
bottomBorder.backgroundColor = shouldResignFirstResponder ? UIColor.grayColor().CGColor : Constant.ui_applicationMainColor.CGColor
return shouldResignFirstResponder
}
override func layoutSubviews() {
super.layoutSubviews()
if let font = self.font {
self.font = GFFont.fontForDefaultFontName(font.fontName, size: font.pointSize)
} else {
self.font = UIFont.systemFontOfSize(12)
}
bottomBorder.backgroundColor = UIColor.grayColor().CGColor
}
}
答案 0 :(得分:1)
基于您只从自定义UITextView
子类中获取错误的事实,问题显然来自您的实现。
最可能的原因是您实施了layoutSubview
功能。在重写函数中你应该做的唯一事情是根据需要调整帧。
设置字体可能会导致对layoutSubviews
或类似事件的递归调用。
应在init
功能中设置背景颜色。设置字体应该在以后完成,因为它取决于调用init
时不会设置的属性的值。设置字体的最佳位置是覆盖font
属性的setter。
答案 1 :(得分:0)
我在这里看到类似的问题: Swift - Split string over multiple lines
但我只是尝试使用xcode Version 7.3.1(7D1014)部署目标9.3来执行您的代码。这对我来说可以。可能是之前的问题,但已经解决了最新版本的swift。
@IBOutlet弱变多行:UITextView! override func viewDidLoad(){ super.viewDidLoad() 让testStringLineBreaks =“foooooo \ n \ n barrrrrr”
self.multiline.text = testStringLineBreaks
// Do any additional setup after loading the view.
}