Swift - 英雄动画关闭视图

Chr*_*ris 6 animation uiviewcontroller ios uipangesturerecognizer swift

我在使用英雄库通过自定义动画来解雇我时遇到问题ViewController

最后,我希望拥有与该视频中几乎完全相同的动画:

首选解雇动画

到目前为止,我的解雇动画如下所示:

到目前为止我的解雇动画

我有 3 个我无法解决的主要问题:

1. 当展示/解散我的ViewController第二个背景时,似乎有这个白色背景ViewController,但我想用第二个背景覆盖我的第ViewController一个背景,而不需要任何白色视图。

2.image当用户开始在我的视图后面向下滑动后, 我的消失,而在视图实际关闭之前,它不应该改变其位置(首选关闭动画)。add-Button右下角的也是同样的情况。

3.就像在首选的关闭动画中一样,我的backgroundView(第二个视频中的浅灰色视图)应该比另一个更快地关闭subviews。我尝试使用cascade-modifier但无法达到这种效果。

这是我的第二个ViewController

 override func viewDidLoad() {
    super.viewDidLoad()

    self.wishlistBackgroundView.hero.isEnabled = true
    self.wishlistBackgroundView.heroID = "wishlistView"

    self.wishlistBackgroundView.hero.modifiers = [.fade, .translate(CGPoint(x: 0, y: 800), z: 20)]

    // adding panGestureRecognizer
    panGR = UIPanGestureRecognizer(target: self,
              action: #selector(handlePan(gestureRecognizer:)))
    view.addGestureRecognizer(panGR)

    self.wishlistLabel.text = wishList.name
    self.wishlistImage.image = wishList.image
    self.theTableView.wishList = wishList.wishData
    self.theTableView.tableView.reloadData()


    view.addSubview(wishlistBackgroundView)
    view.addSubview(dismissWishlistViewButton)
    view.addSubview(menueButton)
    wishlistBackgroundView.addSubview(wishlistView)
    wishlistBackgroundView.addSubview(wishlistLabel)
    wishlistBackgroundView.addSubview(wishlistImage)
    wishlistView.addSubview(theTableView.tableView)
    wishlistView.addSubview(addWishButton)

    NSLayoutConstraint.activate([


        // constrain wishlistView
        wishlistBackgroundView.topAnchor.constraint(equalTo: view.topAnchor),
        wishlistBackgroundView.bottomAnchor.constraint(equalTo: view.bottomAnchor),
        wishlistBackgroundView.leadingAnchor.constraint(equalTo: view.leadingAnchor),
        wishlistBackgroundView.trailingAnchor.constraint(equalTo: view.trailingAnchor),


        wishlistView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 160.0),
        wishlistView.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: 0),
        wishlistView.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor, constant: 0),
        wishlistView.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor, constant: 0),

        // constrain wishTableView
        theTableView.view.topAnchor.constraint(equalTo: wishlistView.topAnchor, constant: 60.0),
        theTableView.view.bottomAnchor.constraint(equalTo: wishlistView.bottomAnchor, constant: 0),
        theTableView.view.leadingAnchor.constraint(equalTo: wishlistView.safeAreaLayoutGuide.leadingAnchor, constant: 30.0),
        theTableView.view.trailingAnchor.constraint(equalTo: wishlistView.safeAreaLayoutGuide.trailingAnchor, constant: -30.0),

        // constrain dismissButton
        dismissWishlistViewButton.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 20),
        dismissWishlistViewButton.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor, constant: 23.0),

        // constrain menueButton
        menueButton.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 20),
        menueButton.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor, constant: -25.0),

        // constrain wishlistImage
        wishlistImage.topAnchor.constraint(equalTo: wishlistView.topAnchor, constant: -70),
        wishlistImage.leadingAnchor.constraint(equalTo: wishlistView.leadingAnchor, constant: 30),
        wishlistImage.widthAnchor.constraint(equalToConstant: 90),
        wishlistImage.heightAnchor.constraint(equalToConstant: 90),

        //constrain wishlistlabel
        wishlistLabel.topAnchor.constraint(equalTo: wishlistView.topAnchor, constant: -47),
        wishlistLabel.leadingAnchor.constraint(equalTo: wishlistImage.leadingAnchor, constant: 100),

        addWishButton.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor, constant: -20),
        addWishButton.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor, constant: -40),

    ])

    // set DeleteWishDelegate protocol for the table
    theTableView.deleteWishDelegate = self


}

// define a small helper function to add two CGPoints
func addCGPoints (left: CGPoint, right: CGPoint) -> CGPoint {
  return CGPoint(x: left.x + right.x, y: left.y + right.y)
}

// handle swqipe down gesture
@objc private func handlePan(gestureRecognizer:UIPanGestureRecognizer) {

    // calculate the progress based on how far the user moved
    let translation = panGR.translation(in: nil)
    let progress = translation.y / 2 / view.bounds.height

  switch panGR.state {
  case .began:
    // begin the transition as normal
    dismiss(animated: true, completion: nil)
  case .changed:

    Hero.shared.update(progress)

    // update views' position based on the translation
    let viewPosition = CGPoint(x: wishlistBackgroundView.center.x, y: translation.y + wishlistBackgroundView.center.y)

    Hero.shared.apply(modifiers: [.position(viewPosition)], to: self.wishlistBackgroundView)


  default:
    // finish or cancel the transition based on the progress and user's touch velocity
       if progress + panGR.velocity(in: nil).y / view.bounds.height > 0.3 {
         Hero.shared.finish()
       } else {
         Hero.shared.cancel()
       }
  }
}
Run Code Online (Sandbox Code Playgroud)

我在 git 上找不到任何关于这方面的好的教程,也找不到任何关于这些主题的内容。如果有人知道任何问题的一个答案,我会非常高兴。

从技术上讲,这是三个问题,但它们非常相关。如果这违反了规则,我很乐意单独询问他们。