【问题标题】:UIImageView content mode is not workingUIImageView 内容模式不起作用
【发布时间】:2015-07-03 04:54:11
【问题描述】:

我有一个大图像 (1920*1080) 和一个较小的 UIImageView (320*568),在故事板中缩放到全屏尺寸。

现在我想全屏显示这个大图像,但适合 UIImageView。

我已经尝试了所有的内容模式,但它们都不起作用。每次它只显示图像的左上角全屏尺寸。

 [self.imageView setFrame:self.view.bounds];
 [self.imageView setContentMode:UIViewContentModeScaleAspectFit] ;
 [self.imageView setImage:image] ;
 [self.view insertSubview:_imageView aboveSubview:_previewView] ;

那么在我的情况下可能有什么问题?这可能是 Xcode 故事板配置错误吗?

谢谢。

【问题讨论】:

  • 如果可以的话,你能上传截图吗?所以我们可以得到想法。你所面临的..
  • 这种情况有时也发生在我身上,当我使用 CIFilters 制作图像时,我得到一个 CIImage 并转换为 UIImage,某些设备架构会创建一个不尊重 contentModes 的损坏图像。例如,它将在设备上运行,但在模拟器上失败。这是一个 Apple 错误,但您可以通过手动调整 UIImageView 的大小来解决它,使用 CGContext 对其进行快照,然后使用该 CGImage 并将 UIImageView 放回您需要的框架/边界。烦人的解决方法,但 Apple 多年来一直没有修复此错误。

标签: ios objective-c uiimageview


【解决方案1】:

如果您在 ImageView 中只看到图像顶角,则可能的原因是:您的 ImageView 框架超出屏幕尺寸或未设置内容模式。在您的代码中,您将框架设置为超级视图的边界。如果您使用的是自动布局,请检查自动布局是否设置正确。如果没问题,那么在设置框架之前尝试设置 UIImageView ContentMode。

// Setting the content mode.
self.imageView.contentMode = UIViewContentModeScaleAspectFit;
// Now set the frame.
[self.imageView setFrame:self.view.bounds];

其他解决方案是您可以缩小图像以适合您的 ImageView。为此,您可以使用以下功能:

- (UIImage *)scaleImage:(UIImage *)orginalImage
{
    float widthFactor = photoImageView.frame.size.width / orginalImage.size.width;
    CGSize destinationSize = CGSizeMake(orginalImage.size.width * widthFactor,orginalImage.size.height * widthFactor);
    UIGraphicsBeginImageContext(destinationSize);
    [orginalImage drawInRect:CGRectMake(0,0,destinationSize.width,destinationSize.height)];
    UIImage *scaledImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    photoImageView.image = scaledImage;
    return scaledImage;
}

【讨论】:

  • 确认缩小图像在我的情况下工作,但我想如果我自己这样做是在浪费内存?
  • @tomriddle_1234 :如果我们设置内容模式或任何其他默认属性,则必须有一些这样的方法来处理它。不同之处在于默认属性以有效的方式处理内存。如果我们能这样处理内存,就不会浪费内存了。
【解决方案2】:

CIImage 存在一个不尊重 contentMode 的问题(至少在某些设备/iOS 版本上)。将 CIImage 转换为 CGImage 以使其工作。

Swift 3 代码:

func convertCIImageToCGImage(inputImage: CIImage) -> CGImage?
{
    let context = CIContext(options: nil)
    if let cgImage = context.createCGImage(inputImage, from: inputImage.extent)
    {
        return cgImage
    }
    return nil
}

【讨论】:

    【解决方案3】:

    试试这个

    [self.imageView setFrame:self.view.bounds];
    self.imageView.contentMode = UIViewContentModeScaleAspectFit; 
    self.imageView.clipsToBounds = YES;
    [self.imageView setImage:image] ;
    [self.view insertSubview:_imageView aboveSubview:_previewView] ;
    

    工作正常.. :)

    【讨论】:

      【解决方案4】:

      在我的情况下,我解决了这个问题,消除了一些调整我错误设置的图像视图大小的约束。

      检查您的 imageview 约束,尝试删除所有这些约束

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-17
        • 1970-01-01
        • 1970-01-01
        • 2015-06-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多