当视图宽度发生变化时,如何使 UILabel 正确调整其尺寸?

Posted

技术标签:

【中文标题】当视图宽度发生变化时,如何使 UILabel 正确调整其尺寸?【英文标题】:How to make UILabel resize it's dimensions correctly when the view width changes? 【发布时间】:2017-10-12 01:19:14 【问题描述】:

我有一个 UILabel 配置为根据文本长度自动调整多行的大小。标签位于动态调整大小的 UITableViewCell 中,所有大小都有约束。

代码将 UILabel 原点向右移动,从而缩小了 UILabel 宽度。

标签正确调整了文本的大小和换行。在将原点定位回其原始位置的过程中,UILabel 的高度扩展了 3 行。但只需要 2 行文本。

之所以高度扩大为3行,是因为在view动画回原点的过程中,文字扩大为3行,缩小为2行。

是否有可以使单元格正确调整大小的调用或设置?或者 2 有没有办法让单元格在原点更改时不调整大小。尤其。是否可以在宽度缩小和扩大时暂时禁用 UILabel 多行选项?

这里是显示行为的屏幕截图。

图(1)UITableViewCell改变原点前label的位置。

图(2)UILabel的原点向右移动,减少了标签的宽度。请注意,第二行有 2 行,标签边框紧紧地包裹着文本。

图(3) Origin返回第一张图片的位置。请注意,第二行的 UIlabel 松散地拥抱文本,并没有恢复到原来的高度。

    @IBAction func editTable(_ sender: UIBarButtonItem) 

    if isEditingDynamic  
        let animate = UIViewPropertyAnimator(duration: 0.4, curve: .easeIn) 
            for cell in self.tableView.visibleCells as! [CellResize] 
                cell.lblDescription.frame.origin.x = 16
            
            self.tableView.beginUpdates()
            self.tableView.endUpdates()
        
        animate.addCompletion()
            (position:UIViewAnimatingPosition) in
            for cell in self.tableView.visibleCells as! [CellResize] 
                cell.leadingContraint.constant = 0
            
            self.tableView.beginUpdates()
            self.tableView.endUpdates()
        
        animate.startAnimation()
        isEditingDynamic = false
     else 
        let animate = UIViewPropertyAnimator(duration: 0.4, curve: .easeIn) 
            for cell in self.tableView.visibleCells as! [CellResize] 
                cell.lblDescription.frame.origin.x = 60
            
            self.tableView.beginUpdates()
            self.tableView.endUpdates()
        
        animate.addCompletion()
            (position:UIViewAnimatingPosition) in
            for cell in self.tableView.visibleCells as! [CellResize] 
                cell.leadingContraint.constant = 54
            
            self.tableView.beginUpdates()
            self.tableView.endUpdates()
        
        animate.startAnimation()
        isEditingDynamic = true
    

【问题讨论】:

【参考方案1】:

您能否发布一些有关如何设置表格视图单元格和控制器的代码?通常,我将创建一个单行 UILabel 并将其放置在单元格的内容视图中,并使用 height constraint >= currentnumberOfLines = 0 约束它TopLeftTrailingLeading

然后,在tableview cell中,我将设置它的estimatedHeight to be 100heightForRow to be UITableViewAutomaticDimension

在这种情况下,TableView 将根据标签的内容自动处理单元格的高度。

【讨论】:

是的,我已将单元格配置为具有您描述的所有属性的动态单元格,但高度除外。由于 4 个边都已设置,因此没有高度限制。问题在于调整大小的动画。我可以看到标签调整为原始大小时,UILabel 将文本从 2 行包装到 3 行,然后在完成之前返回到 2。一旦标签设置为 3 行,它不会将高度重新调整为 2 行,直到标签原点再次变小。

以上是关于当视图宽度发生变化时,如何使 UILabel 正确调整其尺寸?的主要内容,如果未能解决你的问题,请参考以下文章

UILabel Autolayout 宽度问题

如何防止 sizeToFit 更改 UILabel 宽度?

当单元格具有动态宽度时,CollectionView 中的间距不正确?

iOS 如何通过 PureLayout 使两个视图居中

如何动态地将按钮添加到视图以使布局宽度正常工作?

没有子视图时更新uilabel的宽度