Как реализовать горизонтально сложенные карты, которые перемещаются слева направо, когда мы проводим? - PullRequest
0 голосов
/ 27 мая 2019

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

Я пытался увидеть различные библиотеки, которые сразу не реализуют это. https://www.cocoacontrols.com/controls/iaccordion этот подошел ближе, имеет вертикальное движение и находится в объективе C. Можете ли вы указать мне правильное направление, чтобы сделать это?

1 Ответ

0 голосов
/ 27 мая 2019

Стеки в виде карточек очень легко изготовить, но их может быть сложно усовершенствовать, когда дело доходит до некоторых эффектов. В основном каждый из ваших взглядов имеет одну из 3 возможных позиций; в начальном стеке, в целевом стеке, пользователь перетаскивает его.

Таким образом, самая простая реализация - определить 2 центра для ваших представлений и иметь 2 массива представлений. В начале все представления находятся в первом массиве. Все виды в первом массиве должны быть центрированы по первому центру, а во втором массиве - во втором. Теперь вам нужен жест панорамирования. Когда начинается жест, вы должны проверить, начинается ли он в левом стеке, просто ли он удаляет его из первого массива и начинает изменять его центр. Нравится

func onPanGesture(_ sender: UIGestureRecognizer) {
    switch sender.state {
    case .began:
        if leftStackView.bounds.contains(sender.location(in: leftStackView)), viewsInLeftStack.count > 0 {
            pannedView = viewsInLeftStack.removeLast()
        }
    case .changed:
        pannedView?.center = sender.location(in: self.view)
    }
}

Теперь, когда палец поднят, вы должны проверить, нужно ли положить карту обратно или перенести в другую стопку. Поэтому необходимо добавить еще один случай для распознавателя жестов:

    case .ended, .cancelled:
        if let pannedView = pannedView {
            if(abs(pannedView.center.x-leftStackView.center.x) > abs(pannedView.center.x-rightStackView.center.x)) {
                // Closer to the right one horizontally
                viewsInLeftStack.append(pannedView)
                pannedView.center = leftStackView.center
            } else {
                // Closer to the left one horizontally
                viewsInRightStack.append(pannedView)
                pannedView.center = rightStackView.center
            }
        }

В основах это все, что вам нужно. Но потом приходит сделать компонент приятным. Например, когда карта выпущена, она должна оживить в колоду:

UIView.animate(withDuration: 0.3) {
    pannedView.center = self.rightStackView.center
}

Тогда карты могут быть немного смещены в обе колоды, что проще всего применить для преобразования. Они могут даже немного вращаться, когда вы их перетаскиваете ... Но это все зависит от вас, что вы хотите реализовать.

...