Обрезать правую сторону UIImage внутри UIImageView с помощью PanGestureRecognizer

Я пытаюсь "обрезать" изображение внутри imageView. Обрезать в смысле: если пользователь перемещается влево, изображение обрезается с правой стороны влево. Таким образом, когда пользователь перемещается вправо, изображение будет отображаться полностью, если пользователь перемещается в крайнее левое положение, изображение не будет видно.

Я попробовал следующее:

@IBAction func handlePanGesture(recognizer: UIPanGestureRecognizer) {
    let translation = recognizer.translationInView(containerView)

    // Resize the image View
    let image = imageView.image!
    let hasAlpha = false
    let scale: CGFloat = 0.0

    let newRect = CGRectMake(0, 0, image.size.width - translation.x, image.size.height)
    UIGraphicsBeginImageContextWithOptions(newRect.size, !hasAlpha, scale)
    image.drawAtPoint(CGPointMake(-newRect.origin.x, -newRect.origin.y))
    let croppedImage = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()

    imageView.image = croppedImage

    recognizer.setTranslation(CGPointZero, inView: containerView)
}

Этот вид работ. Смотрите gif здесь (в данный момент это только применено к левому изображению).

Может ли кто-нибудь указать мне правильное направление? Почему высота изображения не остается прежней, потому что для contentMode установлено значение "Соотношение сторон"? Почему это только изменение размера, когда вы перемещаетесь влево? Вот скриншот конфигурации imageView

Спасибо за любые советы.

1 ответ

Решение

Я решил это следующим образом.

Я объясню и отправлю код ниже. Во-первых, я изменил размер изображения, чтобы соответствовать imageView, Таким образом, я мог бы установить contentMode в .Left, Во-вторых, я сохранил две копии изображения. Таким образом, одно изображение может быть обрезано справа налево, а одно может быть перевернуто, когда пользователь перемещается слева направо. Моя функция обрезки сверху не будет работать, поэтому я обрезал их CGImageCreateWithImageInRect(_:_:),

Вот код для UIPanGestureRecognizer который работает для меня:

@IBAction func handlePanGesture(recognizer: UIPanGestureRecognizer) {
    let translation = recognizer.translationInView(containerView)
    let imageLeft = googleImageView.image!
    let imageRef = CGImageCreateCopy(initiallyScaledImage?.CGImage)
    let imageRight = UIImage(CGImage: imageRef!, scale: (initiallyScaledImage?.scale)!, orientation: (initiallyScaledImage?.imageOrientation)!)

    if translation.x < 0 {
        let scale = imageLeft.scale
        let newRect = CGRectMake(0, 0, (imageLeft.size.width + translation.x) * scale, imageLeft.size.height * scale)
        let imageRef = CGImageCreateWithImageInRect(imageLeft.CGImage, newRect)

        if let croppedImage = imageRef {
            googleImageView.image = UIImage(CGImage: croppedImage, scale: scale, orientation: imageLeft.imageOrientation)
        }
    } else if translation.x > 0 {
        // Get the rect from above, add translation, set new picture
        let scale = imageRight.scale
        let newRect = CGRectMake(0, 0, (imageLeft.size.width + translation.x) * scale, imageRight.size.height * scale)
        let imageRef = CGImageCreateWithImageInRect(imageRight.CGImage, newRect)

        if let uncroppedImage = imageRef {
            googleImageView.image = UIImage(CGImage: uncroppedImage, scale: scale, orientation: imageRight.imageOrientation)
        }
    }

    recognizer.setTranslation(CGPointZero, inView: containerView)
}
Другие вопросы по тегам