Swift 3:设置标签线高度会导致无限循环?

时间:2017-09-05 00:05:42

标签: ios swift uilabel

我不知道这里发生了什么 - 遵循减少UILable线高的所有其他答案,我有一系列标签,其文字是动态的,可以随时更改,因为它们是文字拉来自服务器。

因为行高似乎总是与标签的实际文本相关联,所以由于某些无限循环,我可能会遇到应用程序冻结。我不知道该怎么做。

以下是我尝试更改行高的方法,其中txtSources[id]不断更新:

override init (frame : CGRect) {
        super.init(frame : frame)

    }
    func customInit()
    {
//        if(bgView.frame == CGRect.zero)
//        {
//            bgView = UIView(frame: self.frame)
//            bgView.backgroundColor = self.backgroundColor
//            bgView.center = CGPoint(x: self.bounds.width/2, y: self.bounds.height/2)
//            self.addSubview(bgView)
//            self.sendSubview(toBack: bgView)
//        }
        self.font = iphoneFont
        if txtSources[id] != ""
        {
            str = (txtSources[id]?.capitalizingFirstLetter())!
            let paragraphStyle = NSMutableParagraphStyle()

            //line height size
            paragraphStyle.lineSpacing = 0.1
            let attrString = NSMutableAttributedString(string: str)
            attrString.addAttribute(NSParagraphStyleAttributeName, value:paragraphStyle, range:NSMakeRange(0, attrString.length))

            self.attributedText = attrString
            //self.text = str
        }
        if(Network.reachability?.isReachable == false && self.text == "")
        {
           noWifiAlternative()

        }

        self.numberOfLines = 0
        self.backgroundColor = UIColor.clear
        self.textColor = barColorStr
        self.clipsToBounds = false

        //self.sizeToFit()

        thinLabel.frame = CGRect(x: 0, y: 0, width: self.bounds.width, height: self.bounds.height)
        thinLabel.textColor = barColorStr
        thinLabel.textAlignment = .left
        thinLabel.numberOfLines = 0
        thinLabel.font = iphoneFontThin
        thinLabel.center = CGPoint(x: self.bounds.width/2, y: self.bounds.height * 0.89)
        self.addSubview(thinLabel)
        thinLabel.text = "bkadasjdjasb"

    }

    func noWifiAlternative()
    {
        self.text = txtSourcesNoWifi[id]!
    }

    required public init(coder aDecoder: NSCoder) {
        fatalError("This class does not support NSCoding")
    }

    convenience init () {
        self.init(frame:CGRect.zero)
    }
    override public func layoutSubviews() {
        customInit()
    }

然而,这不会导致无限循环:

if txtSources[id] != ""
        {
            str = (txtSources[id]?.capitalizingFirstLetter())!
            self.text = str
        }

并将布尔标志设置为仅设置行高一次无效,因为在初始化后的几秒钟内,标签的文本=""

如何降低线高?

2 个答案:

答案 0 :(得分:1)

请参阅我的回答第3段:UIButton: when isHighlighted = true, I can only call a function by swiping my finger

您误解了使用layoutSubviews的位置/方式。

  

只有在自动调整和时,才应覆盖此方法   子视图的基于约束的行为不提供行为   你要。您可以使用实现来设置框架矩形   您的子视图直接。

除了子视图框架矩形设置外,其他任何代码都不属于layoutSubviews

一次性初始化的通常位置为viewDidLoad() UIViewControllers,加载NIB awakeFromNib()UIViews,加载非NIB为init() UIView秒。视图操作代码的通常位置是自定义私有方法,例如检查数据的updateUI(),例如一个String,并相应地更新一些视图。

答案 1 :(得分:1)

您的代码无限重新布局,因为:

customInit来电self.addSubview(thinLabel),会调用调用layoutIfNeeded的{​​{1}}调用layoutSubViews,因此循环会重复。

customInit中你应该做的唯一事情是layoutSubviews(IE:布局子视图的帧)。