在scrollViewDidScroll中以编程方式更新NSLayoutConstraint Swift 4

时间:2018-01-13 21:57:56

标签: ios swift uitableview constraints nslayoutconstraint

我想在viewController的scrollViewDidScroll方法中更新tableView单元格的favoritesImageView的顶部约束常量的约束。

下面是我的自定义tableViewCell中的func

private func setupFavoritesImageView() {
    addSubview(favoritesImageView)
    favoritesImageView.translatesAutoresizingMaskIntoConstraints = false
    imageTopConstraint = favoritesImageView.topAnchor.constraint(equalTo:cellContentView.topAnchor)
    addConstraint(imageTopConstraint)

    imageHeightConstraint = favoritesImageView.heightAnchor.constraint(equalTo: cellContentView.heightAnchor)
    addConstraint(imageHeightConstraint)

    [favoritesImageView.centerXAnchor.constraint(equalTo: cellContentView.centerXAnchor),
    favoritesImageView.widthAnchor.constraint(equalTo: cellContentView.widthAnchor)]
        .forEach{$0.isActive = true}
}

但是,当我在scrollViewDidScroll中设置常量时,它检测到我的约束在控制台中发生了变化,但它看起来与使用相同的公式但使用@IBOutlet约束完全不同。

的ViewController

func scrollViewDidScroll(_ scrollView: UIScrollView) {
    let tableView = favoritesView.tableView
    let offSetY = tableView.contentOffset.y
    for cell in tableView.visibleCells as! [FavoriteImagesTableViewCell] {
        cell.imageTopConstraint.constant = parallaxOffset(newOffsetY: offSetY, cell: cell)
        cell.setNeedsLayout()
    }
}

我试图制作一个视差表View并以编程方式更新约束的常量。我发现在@IBOutlet上使用的相同代码工作正常。我在代码中实现它时遇到了麻烦。

*编辑 - 激活所有约束

图片链接\ /

gray is cell, black is imageView background color

感谢任何帮助,谢谢。

1 个答案:

答案 0 :(得分:0)

从单元格的 layoutSubviews 创建imageView的代码可能只是一次思考调用,因为每次更改 scrollViewDidScroll中的顶部约束时都会再次调用该方法,所以限制再次被添加,所以冲突发生,你看到了奇怪的结果

像这样

enter image description here

这是一个以编程方式约束的演示

ParalloxCell