UIView.animate在swift中无法正常工作

时间:2018-05-28 08:01:22

标签: ios swift

我有一个动画可以为视图的y位置设置动画。我以两种方式调用此函数,首先作为按钮的操作目标,然后通过观察通知。在第一种情况下它可以工作,但在第二种情况下,当它通过通知调用它没有动画。功能代码是:

func showResult() {
    resultMode = true

    self.containerView.frame.origin.y = CGFloat(1000)
    self.view.layoutIfNeeded()
    UIView.animate(
        withDuration: 3,
        animations: {
            self.containerView.frame.origin.y = CGFloat(200)
            self.view.layoutIfNeeded()
    } ,
        completion: nil
    )
}

它被称为:

NotificationCenter.default.addObserver(self, selector: #selector(self.showResult), name: NSNotification.Name(rawValue: "SHOWRESULT"), object: nil)

resultBtn.addTarget(self, action: #selector(self.showResult), for: .touchUpInside)

3 个答案:

答案 0 :(得分:5)

尝试在主线程上触发通知

    DispatchQueue.main.async {
        NotificationCenter.default.addObserver(self, selector: #selector(self.showResult), name: NSNotification.Name(rawValue: "SHOWRESULT"), object: nil)
    }

<强>原因:

  

常规通知中心在线程中发送通知   通知已发布。分布式通知中心   在主线程上发送通知。有时,您可能需要   要在特定线程上传递的通知   由您而不是通知中心确定。例如,如果   在后台线程中运行的对象正在侦听   来自用户界面的通知,例如窗口关闭,您   想在后台线程中收到通知   而不是主线程。在这些情况下,你必须抓住   通知,因为它们是在默认线程和重定向上传递的   他们到适当的线程。

答案 1 :(得分:1)

showResult方法下修改了Tr:

func showResult() {
    resultMode = true

    self.containerView.frame.origin.y = CGFloat(1000)
    self.view.layoutIfNeeded()
    DispatchQueue.main.async {
        UIView.animate(
            withDuration: 3,
            animations: {
                self.containerView.frame.origin.y = CGFloat(200)
                self.view.layoutIfNeeded()
            } ,
            completion: nil
        )
    }
}

答案 2 :(得分:1)

在我的情况下,我在按钮水龙头上有一个闭合按钮,点击该按钮时需要对颜色进行动画处理。经过数小时的无奈之后,调用DispatchMain内部的动画成功了

copyButton.buttonPressedAction = { [weak self] in
  guard let self = self else {
    return
  }
  DispatchQueue.main.async {
    self.backgroundColor = .green
    UIView.animate(withDuration: 2, animations: {() -> Void in
      self.layer.backgroundColor = UIColor.clear.cgColor
    })
  }
}