Swift viewDidApper时调用可重复任务

Swift viewDidApper时调用可重复任务,swift,cocoa-touch,uiviewcontroller,infinite-loop,Swift,Cocoa Touch,Uiviewcontroller,Infinite Loop,我可能完全走错了方向,但我试图实现的是先加载一些视图,然后调用一些将无限期运行的方法,同时给用户提供与该视图交互的可能性 我的第一个猜测是将viewdiapper与UIView.animate一起使用,如下所示 class MainView: UIView { ... func animateTheme() { //want this to print out infinitely print("Test")

我可能完全走错了方向,但我试图实现的是先加载一些视图,然后调用一些将无限期运行的方法,同时给用户提供与该视图交互的可能性

我的第一个猜测是将viewdiapper与UIView.animate一起使用,如下所示

class MainView: UIView {
        ...
        func animateTheme() {
            //want this to print out infinitely
            print("Test")
        }    
}

class ViewController: UIViewController {    
    @IBOutlet weak var mainView: MainView!        

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)

        UIView.animate(withDuration: 1.0, delay: 0.0, options: .repeat, animations: {
            self.mainView.animateTheme()
        }, completion: nil)    
    }
}
情况是,我只能看到一个“测试”打印出来,但这必须无限地调用。此外,正如我提到的,一旦加载了所有内容,用户就需要能够与视图交互


非常感谢您的帮助。

我在一个加载
UIWebView的ViewController上做了类似的操作。加载网页时,我会显示一个带有文本“加载”的
ui标签
,每隔1.5秒我会在文本末尾添加一个句点。我认为你上面描述的方法和我下面展示的方法具有相同的效果,两者都不会被视为无限循环

private func showLoadingMessage(){
    let label = loadingLabel ?? UILabel(frame: CGRect.zero)
    label.text = "Loading"

    view.addSubview(label)
    loadingLabel = label
    addEllipsis()
}

private func addEllipsis() {

    if webpageHasLoaded { return }
    guard let labelText = loadingLabel?.text else {
        return
    }

    DispatchQueue.main.asyncAfter(deadline: .now() + 1.5) {
        self.loadingLabel?.text = labelText + "."
        self.addEllipsis()
    }
}

viewdide
确实会在加载视图时被称为latest,但我认为用户在加载视图之前没有时间进行交互

如果要在加载所有内容后加载动画,可以创建一个计时器并等待x秒。以下示例将在启动后10秒调用

var timer = Timer()

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    timer = Timer.scheduledTimer(timeInterval: 10.0, target: self, selector: #selector(animateSomething), userInfo: nil, repeats: false)

}

func animateSomething() {
    // Animate here
}
更新
要生成无限循环,可以使用以下代码段:

UIView.animate(withDuration: 5.0, delay: 0, options: [.repeat, .autoreverse], animations: {
    self.view.frame = CGRect(x: 100, y: 200, width: 200, height: 200)
}, completion: nil)

首先,非常感谢您的回复。我应该更具体地说明这个案子。我想要实现的是,当所有东西都被加载时,用户可以开始交互,并且有一个进程在后台运行(以无限的方式),例如,某个可见对象不断地改变它的颜色。所以你想做一个无限的动画@RafalK?这正是我需要的:)@RafalK,检查更新,你只需要改变参数和你需要的动画,但这应该可以帮助你开始。我从一个非常类似的东西开始-改变了帖子,以反映我在一开始的位置。情况是,我只能看到“Test”字符串被打印一次。我不能用这种方法实现无限循环。。。