Отредактировано с ссылкой на репозиторий .
Я использую SwiftUI и поэтому не имею доступа к «представлению обрезки». Я использую жесты вместо ScrollView для захвата уровня масштабирования и смещения (x и y) изображения. Я не могу вернуть изображение, которое обрезается должным образом на основе этих факторов.
Кажется, что сам SwiftUI может быть фактором. Возможно, необходимо учитывать смещение изображения в представлении при определении смещений и уровней масштабирования?
У меня есть изображение, и у меня есть следующие значения из жестов на представлении для представления масштаба и x / y position:
@State var scale: CGFloat = 1.0
@State var currentPosition: CGSize = CGSize.zero
Текущая попытка, которая ближе всего подходит к вызываемой функции:
func prepareImage( ) {
let imageToManipulate = UIImage(named: "landscape")
let currentPositionWidth = self.currentPosition.width
let currentPositionHeight = self.currentPosition.height
let zoomScale = self.scale
let imsize = imageToManipulate!.size
var scale : CGFloat = self.frameSize.width / imsize.width
if imsize.height * scale < self.frameSize.height {
scale = self.frameSize.height / imsize.height
}
let croppedImsize = CGSize(width: (self.frameSize.width/scale) / zoomScale, height: (self.frameSize.height/scale) / zoomScale)
let xOffset = (( imsize.width - croppedImsize.width ) / 2.0) - (currentPositionWidth / zoomScale)
let yOffset = (( imsize.height - croppedImsize.height) / 2.0) - (currentPositionHeight / zoomScale)
let croppedImrect: CGRect = CGRect(x: xOffset, y: yOffset, width: croppedImsize.width, height: croppedImsize.height)
let r = UIGraphicsImageRenderer(size:croppedImsize)
let croppedIm = r.image { _ in
imageToManipulate!.draw(at: CGPoint(x:-croppedImrect.origin.x, y:-croppedImrect.origin.y))
}
self.croppedImage = croppedIm
self.photoIsFinished = true
}
Однако, как вы увидите в репозитории, при объединении обоих zoom / масштаб и смещение по оси x / y всегда немного «выключены».
Кроме того, когда вы пытаетесь обрезать квадратное изображение, его значение может быть весьма значительным.