当 UITableView 加载并在滚动后得到修复时,UILabel 向左移动

Posted

技术标签:

【中文标题】当 UITableView 加载并在滚动后得到修复时,UILabel 向左移动【英文标题】:UILabel shifts to left when UITableView Loads and gets fix after scrolling 【发布时间】:2016-05-20 12:36:27 【问题描述】:

我有一个 tableView,我在其中放置了一个 UILabel 并动态更改其左侧约束的常量: 我的 TableViewController

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
    let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as? TableViewCell




    //let totalLength = (cell.slider.frame.width + (cell.postNumber.frame.width + cell.negNumber.frame.width + cell.middleConstraint.constant))
    let differnceToRemove = (cell!.postNumber.frame.width + cell!.negNumber.frame.width + cell!.middleConstraint.constant) / 2

    if indexPath.row == 0 
        cell!.slider.value = 0

    else if indexPath.row == 1 
        cell!.slider.value = 1.0
        
    else if indexPath.row == 2 
        cell!.slider.value = 0.5
    
    else if indexPath.row == 3 

        cell!.slider.value = 0.25
    
    else if indexPath.row == 4 
        cell!.slider.value = 0.33
    


    cell!.contraint.constant =  ((( CGFloat (cell!.slider.value) ) * cell!.slider.frame.width) + cell!.paddingConstraint.constant) - differnceToRemove



    let leftTrackImage = UIImage(named: "vLine")
    cell!.slider.setThumbImage(leftTrackImage, forState: .Normal)
    cell!.slider.setThumbImage(leftTrackImage, forState: .Selected)
    cell!.slider.setThumbImage(leftTrackImage, forState: .Highlighted)


    return cell!

我的 TableViewCell:

class TableViewCell: UITableViewCell 


    @IBOutlet var paddingConstraint: NSLayoutConstraint!
    @IBOutlet var postNumber: UILabel!
    @IBOutlet var negNumber: UILabel!
    @IBOutlet var middleConstraint: NSLayoutConstraint!

    @IBOutlet var contraint: NSLayoutConstraint!

    @IBOutlet var slider: CustomSlider!

    override func awakeFromNib() 
        super.awakeFromNib()
        // Initialization code
    

tableView 加载时的图像 1:

图片 2 当我滚动浏览它时:

在我的 tableView 上滚动每个标签设置到它们的确切位置后,尝试了很多事情,比如在故事板中重新安排我的约束,干净的构建等仍然没有运气,如果有人知道出了什么问题,那么请帮忙

【问题讨论】:

【参考方案1】:

更改约束后需要更新布局:

cell!.contraint.constant =  ((( CGFloat (cell!.slider.value) ) * cell!.slider.frame.width) + cell!.paddingConstraint.constant) - differnceToRemove
cell.setNeedsLayout()
cell.layoutIfNeeded()

请参阅UIView Class Reference 文档的“布置子视图”部分。

自动布局可能很棘手,所以我参考了 Apple 的指南 here。

编辑

您也可以在viewDidLoad() 中使用这些方法。

tableView.setNeedsLayout() 
tableView.layoutIfNeeded() 

我们正在强制表格视图重新加载它自己,从而进行另一次布局传递。这是一个解决方法,您仍然应该确定第一个布局通道和第二个布局通道之间的区别(由于您滚动)。我将从您的自定义表格视图单元格开始。

【讨论】:

首先感谢您的回复,我只是尝试了您的建议,但仍然没有运气:(@fragilecat 您可以尝试在 tableView 上进行相同的调用。 tableView.layoutIfNeeded() 另外,我会将约束代码移动到您返回单元格之前所做的最后一件事 好吧,我尝试了您的新更新答案,并且 tableView 仍然没有变化,现在正在浏览您的链接 尝试将differnceToRemove更改为固定值 - 以进行故障排除。 cell!.postNumber.frame.width + cell!.negNumber.frame.width + cell!.middleConstraint.constant,在方法中打印出这些值或者使用调试器看是否有意义价值。

以上是关于当 UITableView 加载并在滚动后得到修复时,UILabel 向左移动的主要内容,如果未能解决你的问题,请参考以下文章

滚动 tableView 后,视频在 AVPlayerController 的 UITableView 单元格中停止加载

UITableView如何在重新加载后继续滚动

NSURLConnection 在 UITableView 滚动之前不会“触发”

为啥当我滚动浏览 UITableView 时图像会不断调整大小?

滚动表格视图后点击选择行时如何修复崩溃?

UITableView 仅加载在设备上可见的自定义单元格,并在添加更多单元格时崩溃