UIFieldBehaviour для привязки динамического вида к верху, низу или середине экрана

Я использую перетаскиваемый вид, который является шириной и высотой экрана и может перемещаться вверх или вниз по экрану в зависимости от жеста панорамирования.

Когда жест панорамирования закончился, я хочу, чтобы он привязывался к трем различным позициям y, верху, середине или низу экрана в зависимости от того, где был вид, когда панорама закончилась. Я хочу что-то вроде UIFieldBehaviour, где сила оживляет его в правильное положение.

Когда вверху будет отображаться весь вид, а когда внизу будет отображаться только 30px, а остальная часть представления будет находиться под экраном, так сказать. Поэтому мне нужна сила, чтобы вести себя только с верхними 30 пикселями изображения.

Поведение силового поля (извините за плохую покраску):

Привязка поведения:

Есть идеи, как этого добиться?

1 ответ

Решение

Это было проще, чем я думал. Я использую новый UIViewPropertyAnimator и при панорамировании.ended я просто проверяю, должны ли целевые y-позиции привязываться к верху, низу или середине, сравнивая их с высотой UIScreen.

        animator!.addAnimations({
            print(target.frame.origin.y)

            if (target.frame.origin.y > UIScreen.main.bounds.height / 2) {
                if (target.frame.origin.y > (UIScreen.main.bounds.height - 50)) {
                    target.frame = CGRect(x: 0, y: UIScreen.main.bounds.height - 25, width: self.view.frame.width, height: self.view.frame.height)
                } else {
                target.frame = CGRect(x: 0, y: UIScreen.main.bounds.height - 95, width: self.view.frame.width, height: self.view.frame.height)
                }
            } else {
                target.frame = CGRect(x: 0, y: 120, width: self.view.frame.width, height: self.view.frame.height)
            }
        })
        animator!.startAnimation()
Другие вопросы по тегам