【问题标题】:Animate scrolling images with random delay (one after another) and random horizontal position具有随机延迟(一个接一个)和随机水平位置的动画滚动图像
【发布时间】:2017-05-27 06:27:59
【问题描述】:

我有 x 个图像的列表。对于每个图像,我创建一个 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)
}

我的问题是如何让他们一个接一个地拍摄,而不是同时拍摄,以及如何在每个循环中重新计算每个图像的水平位置。

谢谢

编辑:忘了说,我试过了

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

【问题讨论】:

    标签: swift animation uiview uiviewanimation


    【解决方案1】:

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

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

    【讨论】:

    • 效果很好!谢谢!
    猜你喜欢
    • 1970-01-01
    • 2021-10-06
    • 2013-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多