Стеки в виде карточек очень легко изготовить, но их может быть сложно усовершенствовать, когда дело доходит до некоторых эффектов. В основном каждый из ваших взглядов имеет одну из 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
}
Тогда карты могут быть немного смещены в обе колоды, что проще всего применить для преобразования. Они могут даже немного вращаться, когда вы их перетаскиваете ... Но это все зависит от вас, что вы хотите реализовать.