繁体   English   中英

Swift UIImageView 拉伸方面

[英]Swift UIImageView Stretched Aspect

UIImageView 错误地呈现图像的大小。 使用 Scale Aspect Fit,如果 UIImageView 是正方形,则图像是正确的纵横比,图像未填充的区域具有透明度。

//Image is Square & Correct Size
var imageView = UIImageView(frame: CGRectMake(0, 50, 320, 320))
imageView.clipsToBounds = true
imageView.contentMode = UIViewContentMode.ScaleAspectFit

//Image is Rectangle & Incorrect Size
var imageView = UIImageView(frame: CGRectMake(0, 50, 320, 450))
imageView.clipsToBounds = true
imageView.contentMode = UIViewContentMode.ScaleAspectFit

UIImageView 需要触摸边缘并在屏幕的顶部和底部有透明空间,并且里面的图像需要保持其原始比例而不是拉伸得更高。 我附上了两张关于 UIImageView 内部图像渲染方式的图像。

具有正确 Aspect 的 ImageViewImageView 有错误的方面

我向 UIImageView 添加了一个自动调整大小的掩码,它现在显示正确的比例。

imageView.autoresizingMask = UIViewAutoresizing.FlexibleBottomMargin | UIViewAutoresizing.FlexibleHeight | UIViewAutoresizing.FlexibleRightMargin | UIViewAutoresizing.FlexibleLeftMargin | UIViewAutoresizing.FlexibleTopMargin | UIViewAutoresizing.FlexibleWidth
imageView.contentMode = UIViewContentMode.ScaleAspectFit

这个答案对我有帮助: 捕获的照片使用 AVCaptureSession sessionPreset = AVCaptureSessionPresetPhoto 拉伸,因为我使用的是通过手机相机拍摄的图像。

我遇到了同样的问题,对我来说修复它的是确保在设置内容模式后设置 imageView 图像。 IE:

    self.imageView.contentMode = UIViewContentMode.ScaleAspectFit
    self.imageView.image = imageChosen

干杯

Swift 3版本的代码:

imageView.autoresizingMask = [.flexibleWidth, .flexibleHeight, .flexibleBottomMargin, .flexibleRightMargin, .flexibleLeftMargin, .flexibleTopMargin]
imageView.contentMode = .scaleAspectFit // OR .scaleAspectFill
imageView.clipsToBounds = true

这是UIViewContentMode.ScaleAspectFit的预期行为。 从文档:

UIViewContentModeScaleAspectFit

通过保持纵横比来缩放内容以适应视图大小的选项。 视图边界的任何剩余区域都是透明的。

从你的描述看来,你需要UIViewContentMode.ScaleAspectFill

UIViewContentModeScaleAspectFill

缩放内容以填充视图大小的选项。 内容的某些部分可能会被裁剪以填充视图的边界。

这里有一个很好的解决方案通过olearyj234
它对我帮助很大。 我建议看看。 此外,这是他在 swift 4 和 Xcode 9.2 中的代码:

    class ScaledHeightImageView: UIImageView {

    override var intrinsicContentSize: CGSize {

        if let myImage = self.image {
            let myImageWidth = myImage.size.width
            let myImageHeight = myImage.size.height
            let myViewWidth = self.frame.size.width

            let ratio = myViewWidth/myImageWidth
            let scaledHeight = myImageHeight * ratio

            return CGSize(width: myViewWidth, height: scaledHeight)
        }

        return CGSize(width: -1.0, height: -1.0)
    }

}

斯威夫特 5

您可以像这样为UIImageView应用UIView.ContentMode.scaleAspectFit

        let logoImage:UIImage = UIImage(named: "my_logo")!

        let logoImageView = UIImageView(image: logoImage)

        logoImageView.contentMode = UIView.ContentMode.scaleAspectFit

        return logoImageView

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM