195

我有一个以编程方式声明的图像视图,并且我也在以编程方式设置它的图像。

但是,我发现自己无法将图像设置为既适合方面又使中心与图像视图对齐。

换句话说,我希望图像:

  • 如果图像很大,请按比例缩小以适应方面。
  • 如果图像很小,居中但不放大。

我怎么得到它?

4

10 回答 10

214

只需粘贴解决方案:

就像@manohar 说的

imageView.contentMode = UIViewContentModeCenter;
if (imageView.bounds.size.width > ((UIImage*)imagesArray[i]).size.width && imageView.bounds.size.height > ((UIImage*)imagesArray[i]).size.height) {
       imageView.contentMode = UIViewContentModeScaleAspectFit;
}

解决了我的问题

于 2013-03-19T12:35:33.773 回答
82

在 swift 语言中,我们可以设置 UIImage 视图的内容模式,如下所示:

let newImgThumb = UIImageView(frame: CGRect(x: 10, y: 10, width: 100, height: 100))
newImgThumb.contentMode = .scaleAspectFit
于 2014-11-14T06:00:28.400 回答
31

迅速

yourImageView.contentMode = .center

您可以使用以下选项来定位图像:

  • scaleToFill
  • scaleAspectFit // 内容缩放以适应固定方面。余数是透明的
  • redraw// 重绘边界变化(调用 -setNeedsDisplay)
  • center// 内容保持相同大小。定位调整。
  • top
  • bottom
  • left
  • right
  • topLeft
  • topRight
  • bottomLeft
  • bottomRight
于 2018-12-10T11:06:59.587 回答
12

更新的答案

当我在 2014 年最初回答这个问题时,没有要求在小图像的情况下不放大图像。(问题是在 2015 年编辑的。)如果您有这样的要求,您确实需要将图像的大小与 imageView 的大小进行比较并使用UIViewContentModeCenter(在图像小于 imageView 的情况下)或UIViewContentModeScaleAspectFit在所有其他情况下.

原始答案

将 imageView 的 contentMode 设置UIViewContentModeScaleAspectFit为对我来说就足够了。它似乎也使图像居中。我不确定为什么其他人使用基于图像的逻辑。另请参阅此问题:iOS aspect fit and center

于 2014-05-26T23:14:37.153 回答
10

我这样解决了这个问题。

  1. 将图像设置为UIImageView(使用UIViewContentModeScaleAspectFit
  2. 获取图像大小(CGSize imageSize = imageView.image.size)
  3. UIImageView调整大小。[imageView sizeThatFits:imageSize]
  4. 移动你想要的位置。

我想把 UIView 放在UICollectionViewCell. 所以,我使用了这个功能。

- (void)setImageToCenter:(UIImageView *)imageView
{
    CGSize imageSize = imageView.image.size;
    [imageView sizeThatFits:imageSize];
    CGPoint imageViewCenter = imageView.center;
     imageViewCenter.x = CGRectGetMidX(self.contentView.frame);
    [imageView setCenter:imageViewCenter];
}

这个对我有用。

于 2015-03-10T06:35:57.310 回答
8

如果图像不大于视图,则该子类使用中心,否则按比例缩小。我发现这对UIImageView改变大小很有用。

它显示的图像比大尺寸的视图小,但比小尺寸的视图大。我只希望它缩小,而不是放大。

class CenterScaleToFitImageView: UIImageView {
    override var bounds: CGRect {
        didSet {
            adjustContentMode()
        }
    }

    override var image: UIImage? {
        didSet {
            adjustContentMode()
        }
    }

    func adjustContentMode() {
        guard let image = image else {
            return
        }
        if image.size.width > bounds.size.width ||
            image.size.height > bounds.size.height {
            contentMode = .ScaleAspectFit
        } else {
            contentMode = .Center
        }
    }
}
于 2016-04-20T10:23:10.723 回答
8

您可以通过将图像视图的内容模式设置为 UIViewContentModeScaleAspectFill 来实现。

然后使用以下方法方法来获取调整大小的 uiimage 对象。

- (UIImage*)setProfileImage:(UIImage *)imageToResize onImageView:(UIImageView *)imageView
{
    CGFloat width = imageToResize.size.width;
    CGFloat height = imageToResize.size.height;
    float scaleFactor;
    if(width > height)
    {
        scaleFactor = imageView.frame.size.height / height;
    }
    else
    {
        scaleFactor = imageView.frame.size.width / width;
    }

    UIGraphicsBeginImageContextWithOptions(CGSizeMake(width * scaleFactor, height * scaleFactor), NO, 0.0);
    [imageToResize drawInRect:CGRectMake(0, 0, width * scaleFactor, height * scaleFactor)];
    UIImage *resizedImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    return resizedImage;
}

在此编辑(Swift 版本)

func setProfileImage(imageToResize: UIImage, onImageView: UIImageView) -> UIImage
{
    let width = imageToResize.size.width
    let height = imageToResize.size.height

    var scaleFactor: CGFloat

    if(width > height)
    {
        scaleFactor = onImageView.frame.size.height / height;
    }
    else
    {
        scaleFactor = onImageView.frame.size.width / width;
    }

    UIGraphicsBeginImageContextWithOptions(CGSizeMake(width * scaleFactor, height * scaleFactor), false, 0.0)
    imageToResize.drawInRect(CGRectMake(0, 0, width * scaleFactor, height * scaleFactor))
    let resizedImage = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()

    return resizedImage;
}
于 2015-12-18T13:15:47.220 回答
7
let bannerImageView = UIImageView();
bannerImageView.contentMode = .ScaleAspectFit;
bannerImageView.frame = CGRectMake(cftX, cftY, ViewWidth, scrollHeight);
于 2016-01-03T13:22:32.730 回答
5
[your_imageview setContentMode:UIViewContentModeCenter];
于 2013-12-09T05:58:13.213 回答
2

For people looking for UIImage resizing,

@implementation UIImage (Resize)

- (UIImage *)scaledToSize:(CGSize)size
{
    UIGraphicsBeginImageContextWithOptions(size, NO, 0.0f);
    [self drawInRect:CGRectMake(0.0f, 0.0f, size.width, size.height)];
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return image;
}

- (UIImage *)aspectFitToSize:(CGSize)size
{
    CGFloat aspect = self.size.width / self.size.height;
    if (size.width / aspect <= size.height)
    {
        return [self scaledToSize:CGSizeMake(size.width, size.width / aspect)];
    } else {
        return [self scaledToSize:CGSizeMake(size.height * aspect, size.height)];
    }
}

- (UIImage *)aspectFillToSize:(CGSize)size
{
    CGFloat imgAspect = self.size.width / self.size.height;
    CGFloat sizeAspect = size.width/size.height;

    CGSize scaledSize;

        if (sizeAspect > imgAspect) { // increase width, crop height
            scaledSize = CGSizeMake(size.width, size.width / imgAspect);
        } else { // increase height, crop width
            scaledSize = CGSizeMake(size.height * imgAspect, size.height);
        }
    UIGraphicsBeginImageContextWithOptions(size, NO, 0.0f);
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextClipToRect(context, CGRectMake(0, 0, size.width, size.height));
    [self drawInRect:CGRectMake(0.0f, 0.0f, scaledSize.width, scaledSize.height)];
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return image;
}

@end
于 2018-04-04T09:12:53.053 回答