2017-05-27 71 views
1

我有一个x图像列表。对于每一个图像I创建的UIImageView与y中的视图的高度和一个随机X动画滚动随机延迟(一个接一个)和随机水平位置的图像

func computeImageFrame() -> CGRect { 
    let imageWidth: CGFloat = 91 
    let imageHeight: CGFloat = 131 

    var x = xPos() 
    let y = yPos() 

    if (x > ((self.backgroundView?.bounds.width)! - (self.backgroundView?.bounds.width)! * 0.20)){ 
     x = x.truncatingRemainder(dividingBy: ((self.backgroundView?.bounds.width)! - (self.backgroundView?.bounds.width)! * 0.20))} 

    return CGRect(x: x, y: y, width: imageWidth, height: imageHeight) 
} 

其中

func xPos() -> CGFloat { 
    return CGFloat(arc4random_uniform(UInt32((self.backgroundView?.frame.size.width)!))) 
} 
func yPos() -> CGFloat { 
    return self.backgroundView.bounds.height 
} 

在这一点上,我对的UIImageViews一个列表,其中x是随机的,并且y是viewHeight和现在我想要进行动画

func animateBackgroundFor(_ imageViews: [UIImageView]) { 
    for imageView in imageViews { 
     self.backgroundView.addSubview(imageView) 
    } 

    // Animate background 
    UIView.animate(withDuration: 6.0, delay: 0.0, options: [UIViewAnimationOptions.repeat, UIViewAnimationOptions.curveLinear], animations: { 
     for imageView in imageViews { 
      imageView.frame = imageView.frame.offsetBy(dx: 0.0, dy: -7 * imageView.frame.size.height) 
     } 
    }, completion: nil) 
} 

我的问题是我怎么可以让他们拍了一个又一个,而不是在同一时间,我怎么能重新计算每个图像的水平位置在不断y循环。

谢谢

编辑:忘了提,我曾尝试

func animateBackgroundFor(_ imageViews: [UIImageView]) { 
    for imageView in imageViews { 
     self.backgroundView.addSubview(imageView) 
    } 
    for imageView in imageViews { 
     UIView.animate(withDuration: 6.0, delay: 1.2, options: [UIViewAnimationOptions.repeat, UIViewAnimationOptions.curveLinear], animations: { 
      imageView.frame = imageView.frame.offsetBy(dx: 0.0, dy: -7 * imageView.frame.size.height) 
     }, completion: nil) 
    } 
} 

回答

2

请尝试以下解决方案。 添加到您的控制器私有财产:

private var imageViews = [UIImageView]()

,然后修改您的animateBackgroundFor(_)方法以这样的方式:

func animateBackgroundFor(_ imageViews: [UIImageView]) { 
    for imageView in imageViews { 
     self.backgroundView.addSubview(imageView) 
    } 
    self.imageViews = imageViews 
    animateImage(at: 0) 
} 

func animateImage(at index: NSInteger) { 
    guard index >= 0 && index < imageViews.count else { return } 
    let imageView = imageViews[index] 
    imageView.frame = computeImageFrame() 

    UIView.animate(withDuration: 6.0, 
        delay: 0.0, 
        options: UIViewAnimationOptions.curveLinear, 
        animations: { 
        imageView.frame = imageView.frame.offsetBy(dx: 0.0, dy: -7 * imageView.frame.size.height) 
    }, 
        completion: { 
     [weak self] finished in 
        guard finished && self != nil else { return } 
        let nextIndex = index + 1 < self!.imageViews.count ? index + 1 : 0 
        self!.animateImage(at: nextIndex) 
    }) 
} 
+0

伟大的作品!谢谢! –