UILabel 在添加文本时反弹

Posted

技术标签:

【中文标题】UILabel 在添加文本时反弹【英文标题】:UILabel bounces as text is added 【发布时间】:2014-10-30 19:43:38 【问题描述】:

文本以编程方式添加到 UILabel。随着更多文本的添加,文本会换行并增加标签的高度。

问题是,当文本在一行的末尾换行时,整个标签会跳到 1 行的高度,并动画自己回到正确的位置。最终结果很好,但是你如何摆脱奇怪的跳跃动画。同样,每次 UILabel 的高度由于另一个换行而增加时都会发生这种情况。

示例代码:

var eventCount = 0;
func someEvent(sender:AnyObject)
    eventCount += 1;
    if(eventCount == 1)
        lbl.text = "this"
    else if(eventCount == 2)
        lbl.text = "this is some" 
    else if(eventCount == 3)
        lbl.text = "this is some sample text" 
    else if(eventCount == 4)
        // this is where text wraps to line 2 
        // the label jumps up 20px or so and 
        //  animates back down to it's original position 
        lbl.text = "this is some sample text that causes the label to wrap" 
    

自动布局约束

            0
            |
     0 - UILabel - 0

标签属性

lines = 0

【问题讨论】:

添加示例代码;感谢您的观看! 您在添加文本时尝试过[self.view layoutIfNeeded] 吗? 是的,之前、之后和两者都试过。还是一样的效果。 我无法复制这个 - 你能提供更多信息吗?什么版本的 Xcode?什么是视图层次结构?还有其他非默认属性吗? 你能添加你的约束设置代码吗? 【参考方案1】:

我已经设法用下面的代码重现了这个问题:

class ViewController: UIViewController 

    @IBOutlet weak var label: UILabel!

    @IBAction func buttonPushed(sender: AnyObject) 
        UIView.animateWithDuration(0.5) 
            self.someEvent(self)
            self.view.layoutIfNeeded()
        
    

    func someEvent(sender:AnyObject)
        self.label.text! += " test"
    

所以,我相信您的 someEvent() 在动画块中被调用。

UIView.performWithoutAnimation 解决了这个问题。

var eventCount = 0;
func someEvent(sender:AnyObject)
    UIView.performWithoutAnimation 
        self.eventCount += 1;
        if(self.eventCount == 1)
            self.lbl.text = "this"
        else if(self.eventCount == 2)
            self.lbl.text = "this is some"
        else if(self.eventCount == 3)
            self.lbl.text = "this is some sample text"
        else if(self.eventCount == 4)
            self.lbl.text = "this is some sample text that causes the label to wrap"
        
        self.view.layoutIfNeeded()
    

【讨论】:

+1 非常感谢您花时间重现此内容。奇怪的是,该错误自行清除了,因此它可能是一个间歇性问题。它现在在我的复杂屏幕和简单测试用例上都可以正常工作。不涉及动画块,但如果没有提供有关此错误的其他见解,我会给你赏金。再次感谢!

以上是关于UILabel 在添加文本时反弹的主要内容,如果未能解决你的问题,请参考以下文章

更改 UILabel 的文本使其在使用 UIViewKeyframeAnimations 时重新出现

adjustsFontSizeToFitWidth 时 UILabel 的裁剪

UILabel 子类 - 尽管标签高度正确,但文本在底部被截断

在 UITableViewCell 中添加渐变隐藏 UILabel 文本

UILabel 不显示整个文本

如何为 UILabel 的文本添加渐变,而不是背景?