代码之家  ›  专栏  ›  技术社区  ›  maral

uiview.animate不能在swift中正常工作

  •  2
  • maral  · 技术社区  · 6 年前

    我有一个函数可以使视图的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)
    
    2 回复  |  直到 6 年前
        1
  •  5
  •   Sandeep Bhandari    6 年前

    尝试在主线程上触发通知

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

    原因:

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

        2
  •  1
  •   Moayad Al kouz    6 年前

    下面修改了tr run showResult 方法:

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