Изображение в UIImageView обрезается, когда ширина равна ширине устройства, а высота равна исходной высоте изображения.

Я создал ImageViewController, который используется для просмотра длинных изображений. (как приложение для комиксов)

но, поскольку ширина UIImageView равна ширине устройства, высота - исходный размер (соотношение сторон)

Но изображение обрезано. Как мне это сделать?

Код пользовательского интерфейса

    fileprivate let scrollView = UIScrollView().then {
        $0.translatesAutoresizingMaskIntoConstraints = false
        $0.backgroundColor = .yellow
        $0.bounces = false
    }

    fileprivate let stackView = UIStackView().then {
        $0.translatesAutoresizingMaskIntoConstraints = false
        $0.axis = .vertical
    }

    // MARK: - View Life Cycle
    override func viewDidLoad() {
        super.viewDidLoad()

        self.view.addSubview(self.scrollView)
        self.scrollView.addSubview(self.stackView)

        self.scrollView.snp.makeConstraints { make in
            make.edges.equalToSuperview()
        }
        self.stackView.snp.makeConstraints { make in
            make.edges.equalTo(self.scrollView)
        }

    }

Добавить код UIImageView


for element in lists {
    let imgView = UIImageView()
    imgView.setImage(element) // set image from url

    imgView.contentMode = .scaleAspectFill

    imgView.clipsToBounds = true
    imgView.translatesAutoresizingMaskIntoConstraints = false
    self.stackView.addArrangedSubview(imgView)
    imgView.widthAnchor.constraint(equalTo:    self.scrollView.widthAnchor, multiplier: 1.0).isActive = true
    imgView.heightAnchor.constraint(equalTo:     self.scrollView.heightAnchor, multiplier: 1.0).isActive = true
}

Как соотношение сторон (максимальная ширина) UIImageView?


Я нашел решение!

добавлен ниже код,

func imageScaled(with sourceImage: UIImage?, scaledToWidth i_width: Float) -> UIImage? {
        let oldWidth = Float(sourceImage?.size.width ?? 0.0)
        let scaleFactor: Float = i_width / oldWidth

        let newHeight = Float((sourceImage?.size.height ?? 0.0) * CGFloat(scaleFactor))
        let newWidth: Float = oldWidth * scaleFactor
        print(newHeight)

        UIGraphicsBeginImageContext(CGSize(width: CGFloat(newWidth), height: CGFloat(newHeight)))
        sourceImage?.draw(in: CGRect(x: 0, y: 0, width: CGFloat(newWidth), height: CGFloat(newHeight)))
        let newImage: UIImage? = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return newImage
    }

затем установите значение UIImageView.

imgView.setImageScaled(element, width: Float(self.scrollView.frame.width))

person Chorim    schedule 03.04.2019    source источник


Ответы (1)


поскольку ваше изображение больше по высоте, чем высота дисплея iphone, вы должны поместить свое изображение в scrollView и установить режим содержимого на .scaleAspectFit и установить высоту imageView, равную высоте изображения

imgView.contentMode = .scaleAspectFit
person Ajay saini    schedule 03.04.2019
comment
Я пробовал scaleAspectFit .. но этот режим по ширине неточен. UIImageView не на всю ширину. Я изменил contentMode на scaleAspectFit, но экран puu.sh/D9mVI/0bbb185ef0.png - person Chorim; 03.04.2019
comment
это потому, что изображение сохраняет соотношение сторон, поддерживаемое с помощью. scaleAspectFit. если вы хотите занять полную высоту и ширину, используйте scaleToFill - person Ajay saini; 03.04.2019
comment
Я использовал scaleToFill ... тогда изображение выглядит странно. изображение искажено - person Chorim; 03.04.2019
comment
тогда единственный возможный способ - вы должны поместить свое изображение в scrollView и установить режим содержимого на .scaleAspectFit и установить высоту изображения, равную высоте изображения - person Ajay saini; 03.04.2019
comment
Спасибо. Я пойду домой и попробую твой ответ. Хорошего дня. - person Chorim; 03.04.2019