Проход по массиву, когда состояние на UIPanGesture равно .ended - PullRequest
0 голосов
/ 14 марта 2019

Я хотел бы знать, как я могу перебрать массив и изменить имя после распознавателя .state .ended.Когда я использую метод forEach, он показывает мне только последний элемент из массива.Массив:

let persons = [
        Name(name: "Theo", imageName: "theoPhoto"),
        Name(name: "Matt", imageName: "mattPhoto"),
        Name(name: "Tom", imageName: "tomPhoto")
    ]

UIPanGestureRecognizer:

@IBAction func handleCard(recognizer: UIPanGestureRecognizer) {        

    guard let card =  recognizer.view else { return }
    switch recognizer.state {
    case .began:
        initialCGRect = card.frame
    case .changed:
        handleChanged(recognizer, card)
    case .ended:
        handleEnded(recognizer, card)
    default:
        return
    }
}

fileprivate func handleChanged(_ recognizer: UIPanGestureRecognizer, _ card: UIView) {
    let panning = recognizer.translation(in: view)
    let degrees : CGFloat = panning.x / 20
    let angle = degrees * .pi / 180

    let rotationTransformation = CGAffineTransform(rotationAngle: angle)
    card.transform = rotationTransformation.translatedBy(x: panning.x, y: panning.y)
}

fileprivate func handleEnded(_ recognizer: UIPanGestureRecognizer, _ card: UIView) {

    let transitionDirection: CGFloat = recognizer.translation(in: view).x > 0 ? 1 : -1
    let shuldDismissCard = abs(recognizer.translation(in: view).x) > treshold

    UIView.animate(withDuration: 1, delay: 0, usingSpringWithDamping: 1, initialSpringVelocity: 1, options: .curveEaseOut, animations: {
        if shuldDismissCard {
            card.frame = CGRect(x: 600 * transitionDirection, y: 0, width: card.frame.width, height: card.frame.height)
        } else {
            card.transform = CGAffineTransform.identity
        }

    }) { (_) in
        // Complete animation, bringing card back
        card.transform = CGAffineTransform.identity
    }
}

Метод forEach:

func setupCards() {        
        persons.forEach { (Person) in
            cardView.image = UIImage(named: Person.imageName)
            cardLabel.text = Person.name
        }   
    }

Если я включаю его в полную анимацию, он проходит по массиву и показывает мнепоследний пункт.

1 Ответ

0 голосов
/ 21 июня 2019

Ваш setupCards() метод неверен.Он всегда будет отображать последний элемент, потому что вы обновляете только один cardView.Также не используйте имя класса Person в замыкании цикла.Вы должны хранить массив CardView и соответственно изменять данные.

func setupCards() {        
        var i = 0
        persons.forEach { (p) in
            let cardView = self.cards[i]
            cardView.image = UIImage(named: p.imageName)
            cardView.cardLabel.text = p.name
            i += 1
        }   
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...