从子视图调用UIView.animate不起作用

时间:2018-04-15 01:28:06

标签: ios xcode swift4

我正在试图熟悉swift4和xcode。我创建了一个容器视图,其ID类似于从子视图中使用UIView.animate切换宽度。

如果我从容器视图控制器类调用我的toggleWidth函数,它会动画。

如果我从子视图控制器调用它,它会改变宽度,但不会设置动画。

有人可以解释原因吗?

以下是相关代码:

容器控制器

class ViewController: UIViewController {
  @IBOutlet weak var menuContainer: UIView!
  @IBOutlet weak var menuWidth: NSLayoutConstraint!

  override func viewDidLoad() {
    super.viewDidLoad()

    toggleMenu()
  }

  func toggleMenu() {
    menuWidth.constant -= 100

    UIView.animate(withDuration: 5) {
        self.menuContainer.layoutIfNeeded()
    }
  }
}

儿童控制器

class MenuController : UITableViewController {
  @IBOutlet weak var homeCell: UITableViewCell!

  override func viewDidLoad() {
    let tap = UITapGestureRecognizer(target: self, action: #selector(MenuController.imageTapped))
    homeCell.addGestureRecognizer(tap)
    homeCell.isUserInteractionEnabled = true
  }

  @objc func imageTapped()
  {
    (self.parent as! ViewController).toggleMenu()
  }
}

感谢对此提供的任何帮助。

2 个答案:

答案 0 :(得分:1)

宽度的变化需要在动画块中完成,如https://developer.apple.com/documentation/uikit/uiview/1622418-animate中所述。

class ViewController: UIViewController {
  @IBOutlet weak var menuContainer: UIView!
  @IBOutlet weak var menuWidth: NSLayoutConstraint!

  override func viewDidLoad() {
    super.viewDidLoad()

    toggleMenu()
  }

  func toggleMenu() {
    UIView.animate(withDuration: 5) {
       self.menuWidth.constant -= 100
       self.menuContainer.layoutIfNeeded()
    }
  }
}

答案 1 :(得分:0)

好吧,我在玩了一个简单的测试项目之后回到了这里,我意识到我正在调用视图上我正在改变约束,而苹果明确表示你应该在父对象上调用layoutifneeded。一旦我改变了这一点,一切都开始起作用了。希望有人可以从我的错误中吸取教训。