UIImageView方面适合和中心

Rav*_*oda 168 objective-c uiimageview uiimage ios

我有一个图像视图,以编程方式声明,我也以编程方式设置其图像.

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

换句话说,我希望图像:

  • 如果图像很大,缩小以适合方面.
  • 如果图像很小,则居中但不放大.

我怎么做到的?

Rav*_*oda 194

刚刚粘贴解决方案:

就像@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;
}
Run Code Online (Sandbox Code Playgroud)

解决了我的问题

  • 查找图像的较短方式较小:`CGRectContainsRect(imageView.bounds,{CGPointZero,image.size})` (6认同)

Ali*_*aza 67

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

let newImgThumb = UIImageView(frame: CGRect(x: 10, y: 10, width: 100, height: 100))
newImgThumb.contentMode = .scaleAspectFit
Run Code Online (Sandbox Code Playgroud)

  • 如果图像小于图像视图,则会放大图像,这与OP的要求相反。 (2认同)

Nat*_*ook 12

更新的答案

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

原始答案

将imageView的contentMode设置UIViewContentModeScaleAspectFit为足够我.它似乎也是图像的中心.我不确定为什么其他人正在使用基于图像的逻辑.另请参阅此问题:iOS方面适合和中心


Jon*_*ann 12

迅速:

yourImageView.contentMode = .center
Run Code Online (Sandbox Code Playgroud)

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

  • scaleToFill
  • scaleAspectFit //内容按比例缩放以适合固定的方面。其余部分是透明的
  • redraw //重绘边界更改(调用-setNeedsDisplay)
  • center//内容保持相同大小。调整位置。
  • top
  • bottom
  • left
  • right
  • topLeft
  • topRight
  • bottomLeft
  • bottomRight


Nic*_*nux 10

我这样解决了这个问题.

  1. setImage to UIImageView(with UIViewContentModeScaleAspectFit)
  2. 得到imageSize (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];
}
Run Code Online (Sandbox Code Playgroud)

这个对我有用.


Man*_*ish 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;
}
Run Code Online (Sandbox Code Playgroud)

编辑在这里(斯威夫特版)

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;
}
Run Code Online (Sandbox Code Playgroud)


ork*_*den 8

如果图像不大于视图,则此子类使用center,否则缩小.我发现这对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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


Ant*_*eph 7

let bannerImageView = UIImageView();
bannerImageView.contentMode = .ScaleAspectFit;
bannerImageView.frame = CGRectMake(cftX, cftY, ViewWidth, scrollHeight);
Run Code Online (Sandbox Code Playgroud)


sou*_*cse 5

[your_imageview setContentMode:UIViewContentModeCenter];
Run Code Online (Sandbox Code Playgroud)

  • 这将忽略缩放 (17认同)
  • 我不知道为什么像这样的解决方案得到了如此多的赞成。这个人显然根本没看问题。 (2认同)