У меня есть два контроллера представления.Оба они содержат представления изображений, и их режимы содержимого .scaleAspectFill
.
Я использую пользовательскую анимацию перехода для модального перехода от первого контроллера представления ко второму.Во время анимации я добавляю другой вид изображения поверх первого в первом контроллере вида и масштабирую его до тех пор, пока он не охватит весь экран.Второй контроллер представления содержит представление изображения, которое охватывает весь экран, поэтому в конце перехода я удаляю временный.
Вот код перехода в аниматоре (originFrame
- этокадр представления изображения в первом контроллере представления):
func handleImageViewAnimations(completion: @escaping (()->Void)) {
guard let containerView = containerView, let toView = toView else {
return
}
let imageView = UIImageView.init(frame: originFrame)
imageView.image = image
imageView.contentMode = .scaleAspectFill
imageView.clipsToBounds = true
containerView.addSubview(imageView)
containerView.insertSubview(toView, aboveSubview: imageView)
toView.alpha = 0.0
containerView.bringSubview(toFront: imageView)
let xFactor = toView.frame.width / originFrame.width
let yFactor = toView.frame.height / originFrame.height
CATransaction.begin()
CATransaction.setAnimationDuration(animationDuration)
CATransaction.setCompletionBlock(completion)
UIView.animate(withDuration: animationDuration, animations: {
imageView.transform = CGAffineTransform(scaleX:xFactor, y: yFactor)
imageView.center = toView.center
}) { (_) in
imageView.setNeedsDisplay()
imageView.removeFromSuperview()
toView.alpha = 1.0
}
CATransaction.commit()
}
Однако, поскольку режим содержимого представлений изображения равен .scaleAspectFill
, конец анимации не является плавным.Это происходит потому, что в этом режиме содержимого изображения отображаются по-разному в представлениях изображений в зависимости от их границ.Анимация в основном растягивает вид изображения, однако она не учитывает, что различные части изображения видны в зависимости от размера границ вида изображения.GIF ниже показывает, что я имею в виду:
Эта анимация с представлениями изображений, которые имеют режим содержания .scaleToFill
, работает очень хорошо, однако яхотел бы реализовать это в режиме scaleAspectFill
.
Если вы знаете, как сделать анимацию плавной, я был бы признателен за вашу помощь.