Масштабируемое полноэкранное изображение в портретном и альбомном режимах

Я новичок в программировании. У меня есть приложение, в котором вы можете коснуться любого изображения, которое отображается на дисплее, чтобы показать это изображение в полноэкранном режиме, и можете свести его для увеличения. Проблема, с которой я сталкиваюсь, заключается в том, что если вы повернете телефон, изображение будет видно только наполовину.

Я использую представление прокрутки для достижения функциональности масштабирования, поскольку это, кажется, лучший способ сделать это.

Он отлично работает в портретном режиме или если я вхожу в полноэкранное изображение, когда приложение уже находится в альбомной ориентации, но если я перехожу в альбомную ориентацию в полноэкранном режиме, это происходит неправильно. Вот код:

class PictureDetailViewController: UIViewController, UIScrollViewDelegate {

@IBOutlet weak var scrollView: UIScrollView!
var routeData = IndividualRoute(numberOfRoute: UserDefaults.standard.integer(forKey: "currentRoute"))

var detailPicture = UserDefaults.standard.bool(forKey: "segueFromDetailvc")

var detailImage = UIImageView()

override func viewDidLoad() {
    super.viewDidLoad()

    routeData.routesValues()
    scrollView.delegate = self
    selectImage()
    scrollView.frame = UIScreen.main.bounds
    scrollView.addSubview(detailImage)
    scrollViewContents()
    setupConstraints()
    let scrollViewFrame = scrollView.frame
    let scaleWidth = scrollViewFrame.size.width / scrollView.contentSize.width
    let scaleHieght = scrollViewFrame.size.height / scrollView.contentSize.height
    let minScale = min(scaleHieght, scaleWidth)
    scrollView.minimumZoomScale = minScale
    scrollView.maximumZoomScale = 1
    scrollView.zoomScale = minScale
    let tap = UITapGestureRecognizer(target: self, action: #selector(dismissFullscreen))
    tap.numberOfTapsRequired = 2
    view.addGestureRecognizer(tap)

}

//****************************************

//Image Setup

func setupConstraints() {

    scrollView.translatesAutoresizingMaskIntoConstraints = false

    NSLayoutConstraint.activate([
        scrollView.leadingAnchor.constraint(equalTo: view.leadingAnchor),
        scrollView.trailingAnchor.constraint(equalTo: view.trailingAnchor),
        scrollView.topAnchor.constraint(equalTo: view.topAnchor),
        scrollView.bottomAnchor.constraint(equalTo: view.bottomAnchor),
        scrollView.centerXAnchor.constraint(equalTo: view.centerXAnchor),
        scrollView.centerYAnchor.constraint(equalTo: view.centerYAnchor)])

    scrollView.contentSize = (detailImage.image?.size)!


}

func selectImage() {
    if !detailPicture {
        let foo = "\(routeData.achievements[UserDefaults.standard.integer(forKey: "currentAchievement")])"
        detailImage.image = UIImage(named: "\(foo.folding(options: .diacriticInsensitive, locale: nil)) 0")
    } else {
        let foo = "\(routeData.achievements[0])"
        detailImage.image = UIImage(named: "\(foo.folding(options: .diacriticInsensitive, locale: nil)) 0")
        print("\(foo.folding(options: .diacriticInsensitive, locale: nil)) 0")
    }

    guard let width = detailImage.image?.size.width else {
        return
    }
    guard let height = detailImage.image?.size.height else {
        return
    }

    let frame: CGRect = CGRect(x: 0, y: 0, width: width, height: height)
    detailImage.frame = frame
    detailImage.isUserInteractionEnabled = true

}

//**************************************

//Scrollview setup


@objc func dismissFullscreen(){
    scrollView.setZoomScale(1, animated: true)
}

func scrollViewContents() {

    let boundSize = UIScreen.main.bounds.size
    var contentFrame = detailImage.frame

    if contentFrame.size.width < boundSize.width {
        contentFrame.origin.x = (boundSize.width - contentFrame.size.width) / 2
    } else {
        contentFrame.origin.x = 0
    }
    if contentFrame.size.height < boundSize.height {
        contentFrame.origin.y = (boundSize.height - contentFrame.size.height) / 2
    } else {
        contentFrame.origin.y = 0
    }

    detailImage.frame = contentFrame

}

func scrollViewDidZoom(_ scrollView: UIScrollView) {
    scrollViewContents()
}

func viewForZooming(in scrollView: UIScrollView) -> UIView? {

    return detailImage
}

Извините за публикацию такого большого количества кода, но это почти все актуально (я думаю).

Вот скриншоты проблемы:

Изображение смещено от центра и видно наполовину

Идеально отцентрировано и хорошо выглядит!


person paul_f    schedule 17.11.2017    source источник


Ответы (1)


Хорошо, мне удалось это исправить! Немного попрыгал от удовольствия.

Я настроил новую функцию setupScale(), которая вызывается в viewdidload при представлении представления. Я также добавил переопределение viewwillLayoutSubview() и вызвал внутри него функцию setupScale().

Если выглядит так:

private func setupScale() {

    scrollView.frame = UIScreen.main.bounds
    scrollView.contentSize = (detailImage.image?.size)!
    scrollViewContents()
    let scrollViewFrame = scrollView.frame
    let scaleWidth = scrollViewFrame.size.width / scrollView.contentSize.width
    let scaleHieght = scrollViewFrame.size.height / scrollView.contentSize.height
    let minScale = min(scaleHieght, scaleWidth)
    scrollView.minimumZoomScale = minScale
    scrollView.maximumZoomScale = 1
    scrollView.zoomScale = minScale
}
override func viewWillLayoutSubviews() {
    setupScale()
}

Результаты выглядят идеально на моем iPad и iPhone 7 в альбомной и портретной ориентации.

person paul_f    schedule 18.11.2017