Swift - герой анимации, чтобы уволить View - PullRequest
4 голосов
/ 10 января 2020

У меня проблемы с использованием Библиотеки героев для отклонения моего ViewController с пользовательской анимацией.

В конце я хотел бы получить почти такую ​​же анимацию, как в этом видео:

предпочитаемую анимацию смещения

Пока что мое смещение анимация выглядит следующим образом:

моя анимация отклонения до сих пор

У меня 3 основные проблемы, которые я не могу понять:

1. При представлении / отклонении моего ViewController, кажется, есть этот белый фон за моим вторым ViewController, но я хотел бы просто накрыть свой первый ViewController вторым без каких-либо белых видов.

2. Мой image исчезает после того, как пользователь начинает смахивать вниз за моими представлениями, когда вместо этого он не должен менять свою позицию ( предпочтительная анимация отклонения ), пока представление фактически не отклонится. То же самое касается add-Button в правом нижнем углу.

3. Как и в предпочтительной анимации отклонения my the backgroundView (lightGray View в 2-е видео) должно уйти немного быстрее, чем другое 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()
       }
  }
}

Я не смог найти ни хороших учебников по этому, ни ничего по этим темам на git. Если кто-то знает хотя бы один ответ на любую из проблем, я более чем счастлив.

Технически это 3 вопроса, но они довольно связаны. Если это противоречит SO-правилам, я с удовольствием спрошу их отдельно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...