当 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 单元格中停止加载
NSURLConnection 在 UITableView 滚动之前不会“触发”