Как повернуть UIImage, а затем повернуть его обратно? - PullRequest
0 голосов
/ 03 марта 2020

У меня есть UITableViewCell с UIImageView. Когда пользователь нажимает на ячейку в моем табличном представлении, вызывается cell.isExpanded.toggle(), который поворачивает изображение.

Сейчас он вращается от 0 до 180 по часовой стрелке, но при повторном нажатии поворачивается на 180 до 0, также по часовой стрелке.

Как заставить его вращаться на 180 против 0 против часовой стрелки, если значение равно false?

class TVCell: UITableViewCell {

    var isExpanded = false {
        didSet {
            rotateImage(isExpanded)
        }
    }

    let iv = UIImageView()

    override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
        super.init(style: style, reuseIdentifier: reuseIdentifier)

        addSubview(iv)
        iv.center.x = 33
        iv.center.y = 6
        iv.frame.size = CGSize(width: 30, height: 30)
    }

    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    func rotateImage(_ val: Bool) {
        UIView.animate(withDuration: 0.2, delay: 0, options: .curveEaseInOut, animations: {
            if val {
                self.iv.transform = CGAffineTransform(rotationAngle: .pi)
            } else {
                self.iv.transform = .identity
            }
        }, completion: nil)
    }

}

Ответы [ 2 ]

0 голосов
/ 03 марта 2020

Это было то, что я нашел, самое простое и лучше всего работает

UIView.animate(withDuration: 0.2, delay: 0, options: .curveEaseInOut, animations: {
    let rotationAngle: CGFloat = val ? .pi : (-.pi * 2)
    self.iv.transform = .init(rotationAngle: rotationAngle)
}, completion: nil)
0 голосов
/ 03 марта 2020

В этом случае CGFloat.pi и -CGFloat.pi анимируются в одной и той же позиции.

Вращение против часовой стрелки можно выполнить с помощью -(CGFloat.pi * 0.999)

self.iv.transform = CGAffineTransform(rotationAngle:-(CGFloat.pi * 0.999))
...