Ios 在多个UIView上添加Facebook Shimmer

Ios 在多个UIView上添加Facebook Shimmer,ios,swift,uicollectionviewcell,loading,Ios,Swift,Uicollectionviewcell,Loading,我正在尝试在UICollectionViewCell上添加Facebook微光,它有多个UIView 对于一个UIView,它可以使用以下代码正常工作: let shimmeringView = FBShimmeringView(frame: imageView.frame) shimmeringView.contentView = imageView backgroundView.addSubview(shimmeringView) shimmeringView.isShimmering =

我正在尝试在UICollectionViewCell上添加Facebook微光,它有多个UIView

对于一个UIView,它可以使用以下代码正常工作:

let shimmeringView = FBShimmeringView(frame: imageView.frame)
shimmeringView.contentView = imageView
backgroundView.addSubview(shimmeringView)
shimmeringView.isShimmering = true
其中,
backgroundView
是我拥有所有子视图的视图,如
imageView
labelView
和其他

当我尝试添加多个视图时,第一个视图得到了正确的帧,但其他视图的宽度变为零。我正在
collectionView(\uu:cellForItemAt:)
中添加此代码


有谁能告诉我,对于多个
UIView
s来说,这是实现Facebook Shimmer的正确方法,还是我做错了什么?

我相信有很多方法可以实现
FBShimmeringView
,这是一个偏好问题。所以在我的情况下,我更喜欢最简单的方法(根据我的说法)

我在我的
tableViewCell
中所做的,当然有多个视图,比如
imageView
标签
,就像你的一样,就是我有多个
ui视图
灰色,放在我单元格中每个视图的顶部

然后我的单元格中只添加了一个
FBShimmeringView
的实例

下面是关于我如何使用
FBShimmeringView
的更多细节

*请注意,我使用
SnapKit
以编程方式布局视图

  • 我的单元格中有一个名为
    isLoading
    的属性,类似于这样,它决定了应该显示还是现在显示灰色视图。如果显示,当然要启用“微光”:

    public var serviceIsLoading: Bool = false {
        didSet {
            _ = self.view_Placeholders.map { $0.isHidden = !self.serviceIsLoading }
            self.view_Shimmering.isHidden = !self.serviceIsLoading
            self.view_Shimmering.isShimmering = self.serviceIsLoading
        }
    } 
    
  • 然后,在将所有子视图添加到单元格后,将白色视图添加到单元格:

    // Place the FBShimmeringView
    // Try to add a dummy view
    let dummyView = UIView()
    dummyView.backgroundColor = .white
    self.addSubview(dummyView)
    dummyView.snp.makeConstraints { (make) in
        make.edges.equalToSuperview()
    }
    
    self.view_Shimmering.contentView = dummyView
    
  • 将ShimerringView也添加到单元格中:

    self.addSubview(self.view_Shimmering)
    self.view_Shimmering.snp.makeConstraints { (make) in
        make.height.width.equalToSuperview()
        make.center.equalToSuperview()
    }
    
  • 最后,将dummyView设置为单元格的contentView:

    // Place the FBShimmeringView
    // Try to add a dummy view
    let dummyView = UIView()
    dummyView.backgroundColor = .white
    self.addSubview(dummyView)
    dummyView.snp.makeConstraints { (make) in
        make.edges.equalToSuperview()
    }
    
    self.view_Shimmering.contentView = dummyView
    
  • 我的屏幕是这样的。还记得在
    表视图中禁用交互

    这看起来很酷,当它闪烁,只是一个shimerring的看法


    希望有帮助

    下面的分机工作正常

    extension UIView {
        func startShimmeringViewAnimation() {
            let gradientLayer = CAGradientLayer()
            gradientLayer.frame = self.bounds
            gradientLayer.startPoint = CGPoint(x: 0.0, y: 1.0)
            gradientLayer.endPoint = CGPoint(x: 1.0, y: 1.0)
            let gradientColorOne = UIColor(white: 0.90, alpha: 1.0).cgColor
            let gradientColorTwo = UIColor(white: 0.95, alpha: 1.0).cgColor
            gradientLayer.colors = [gradientColorOne, gradientColorTwo, gradientColorOne]
            gradientLayer.locations = [0.0, 0.5, 1.0]
            self.layer.addSublayer(gradientLayer)
    
            let animation = CABasicAnimation(keyPath: "locations")
            animation.fromValue = [-1.0, -0.5, 0.0]
            animation.toValue = [1.0, 1.5, 2.0]
            animation.repeatCount = .infinity
            animation.duration = 1.25
            gradientLayer.add(animation, forKey: animation.keyPath)
        }
    }
    
    在UITableViewCell类中,我们需要为每个视图添加微光

    class UAShimmerCell: UITableViewCell {
        @IBOutlet weak var thumbNailView: UIView!
        @IBOutlet weak var label1View: UIView!
        @IBOutlet weak var label2View: UIView!
    
        override func awakeFromNib() {
            super.awakeFromNib()
            thumbNailView.startShimmeringViewAnimation()
            label1View.startShimmeringViewAnimation()
            label2View.startShimmeringViewAnimation()
        }
    }