繁体   English   中英

我不知道使用 UIView.animate 或创建 UIImageView 方法有什么问题。 我使用 swift 语言

[英]I don't know what was a wrong about use UIView.animate or create UIImageView method. I'm use swift language

我创建了一个继承 UIView 的模块并将图像向左移动。 一开始还不错,但如果再次移动后进入屏幕,屏幕会消失并重新出现。 (self.present 或其他 tabbarcontroller...) 我正在滚动三个图像,哪里错了? 请检查底部代码。 在下面的代码中,将图像参数传递给setImage后,由startAnimate()执行。 我也上传视频,请帮忙。

https://youtu.be/I9AJrt-SWF0

import UIKit
import Kingfisher

class DisolveBanner: UIView {

    private var bannerImage = [String]()
    private var bannerStr = [String]()
    private var timer: Timer?
    private var num: Int = 0
    private var numNow: Int = 0

    var timerInterval: Double = 5.0
    var disolveInterval: Double = 1.0
    var rangeMove: CGFloat = 100

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }

    // -MARK: Setting Images
    func setImage(images: [String], str: [String]) {

        if images.isEmpty == false && images.count == str.count {
            bannerImage.removeAll()
            bannerImage = images

            bannerStr.removeAll()
            bannerStr = str

            num = (bannerImage.count) - 1
        }
    }

    // -MARK: Start Animation
    func startAnimate() {

        if bannerImage.isEmpty == false {
            autoAnimate()
            timer = Timer()
            timer = Timer.scheduledTimer(timeInterval: (timerInterval - disolveInterval),
                                         target: self,
                                         selector: #selector(autoAnimate),
                                         userInfo: nil,
                                         repeats: true)
        }
    }

    // -MARK: Finish Animation
    func stopAnimate() {
        timer?.invalidate()
        timer = nil
    }

    @objc private func  autoAnimate() {

        moveImage(image: bannerImage[numNow], str: bannerStr[numNow])

        if numNow < num {
            numNow = numNow + 1
        } else {
            numNow = 0
        }
    }

    private func moveImage(image: String?, str: String?) {

        if let img = image {

            let imgWidth = self.frame.size.width + rangeMove
            let imgView = UIImageView(frame: CGRect(x: 0, y: 0, width: imgWidth, height: self.frame.size.height))
            imgView.frame.origin.x = 0
            imgView.alpha = 0.2
            imgView.setKingfisher(image: img)
            self.addSubview(imgView)

            UIView.animate(withDuration: disolveInterval) {
                self.imgView.alpha = 1.0
            }

            UIView.animate(withDuration: timerInterval, animations: {
                self.imgView.frame.origin.x = (0 - self.rangeMove)
            }) { (finished) in
                self.imgView.removeFromSuperview()
            }
        }

        if let msg = str {

            let msgView = UILabel(frame: CGRect(x: 0, y: 0, width: 100, height: 50))
            msgView.frame.origin.x = 0
            msgView.alpha = 0.2
            msgView.text = msg
            msgView.sizeToFit()
            msgView.textColor = UIColor.white
            self.addSubview(msgView)

            UIView.animate(withDuration: timerInterval, animations: {
                msgView.alpha = 1.0
            }) { (finished) in
                msgView.removeFromSuperview()
            }
        }
    }
}

首先要考虑很多,所以我不能给你确切的解决方案,但这里有一些事情要注意:

当您的 viewController 消失时,动画师就会停止。 也许计时器也是。 所以这是第一条线索。 您可能想要覆盖 viewDidAppear 并从头开始重新启动动画,或者如果您正在跟踪 state,则从它停止的任何地方开始。 视频中很清楚,当您的计时器第一次滴答作响时,它会启动 animation。 var timerInterval: Double = 5.0相反,您应该在 viewDidAppear 或 viewWillAppear 时立即启动它(这也应该起作用)。

另一件事是; viewDidLoad 不会在您的标签栏项目上第二次被调用,只会在第一次被调用。 当您有太多的状态和异步完成句柄并且它们相互依赖以共享一些数据并且您通过停止所有它们(应用程序确实如此)来破坏它时,这些事情就会发生,通常处理消失和出现的 viewController,不要依赖 viewDidLoad

要看的第三件事:您可能需要检查,当应用程序进入Background,或进入AppSwitcher 或可访问性时会发生什么,这些是下一个go 错误的情况。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM