2017-05-27 1 views
1

Ich habe eine Liste von x Bildern. Für jedes Bild I eine UIImageView mit y die Höhe der Ansicht und eine Zufalls xAnimieren Scrollen Bilder mit zufälliger Verzögerung (nacheinander) und zufällige horizontale Position

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) 
} 

wo

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

an dieser Stelle zu erstellen habe ich eine Liste auf UIImageViews wobei x zufällig ist und y viewheight und jetzt versuche ich,

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) 
} 

Meine Frage zu animieren, wie kann ich sie ein, um zu schießen nach dem anderem bekommen, statt zur gleichen Zeit, und wie kann ich jedes Bild der horizontale Position neu berechnen zu immer y-Schleife.

Danke

Edit: vergaß zu erwähnen, ich

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) 
    } 
} 

Antwort

2

folgende Lösung Versuchen Sie versucht haben. in Ihre Controller Privateigentum:

private var imageViews = [UIImageView]()

und ändern Sie Ihre animateBackgroundFor(_) Methode in einer solchen Art und Weise:

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

funktioniert super! Vielen Dank! –

Verwandte Themen