在 UIView 内缩放图像而不改变边界?

Posted

技术标签:

【中文标题】在 UIView 内缩放图像而不改变边界?【英文标题】:Scale image inside UIView without changing bounds? 【发布时间】:2013-11-02 13:04:48 【问题描述】:

是否可以在不改变 UIView 边界的情况下缩放 UIView 内的图像? (也就是说,仍然将图像裁剪到 UIView 的边界,即使图像的缩放比例大于 UIView。)

我在不同的 SO 帖子上发现了一些代码,可以缩放 UIView 中的图像:

view.transform = CGAffineTransformScale(CGAffineTransformIdentity, _scale, _scale);

但是,这似乎会影响视图的边界——使它们变大——因此 UIView 的绘图现在会随着其内容变大而压倒其他附近的 UIView。我可以将其内容缩放得更大,同时保持剪裁范围不变吗?

【问题讨论】:

除了@Jing 的回答,为什么不把 UIImageView 放在容器视图中? 我昨晚发现这是要走的路。您可以将父视图的剪辑设置为YES,然后在子视图上更改变换,它可以工作! 【参考方案1】:

缩放图像最简单的方法是通过设置其 contentMode 属性来使用 UIImageView。

如果您必须使用 UIView 显示图像,您可以尝试在 UIView 中重绘图像。

1.子类 UIView

2.在drawRect中绘制你的图像

//the followed code draw the origin size of the image

- (void)drawRect:(CGRect)rect

    CGContextRef context = UIGraphicsGetCurrentContext();
    [_yourImage drawAtPoint:CGPointMake(0,0)];


//if you want to draw as much as the size of the image, you should calculate the rect that the image draws into

- (void)drawRect:(CGRect)rect

    CGContextRef context = UIGraphicsGetCurrentContext();
    [_yourImage drawInRect:_rectToDraw];


- (void)setYourImage:(UIImage *)yourImage

    _yourImage = yourImage;

    CGFloat imageWidth = yourImage.size.width;
    CGFloat imageHeight = yourImage.size.height;

    CGFloat scaleW = imageWidth / self.bounds.size.width;
    CGFloat scaleH = imageHeight / self.bounds.size.height;

    CGFloat max = scaleW > scaleH ? scaleW : scaleH;

    _rectToDraw = CGRectMake(0, 0, imageWidth * max, imageHeight * max);

【讨论】:

将其标记为答案,因为您花时间发布回复,虽然昨晚我发现如果我创建一个 UIImageView 作为子视图,我可以在其上设置转换,然后调用setClipsToBounds 为父视图设置 YES,子视图被剪裁。效果很好! 是的,使用 UIImageView 是最简单的方法,我在第一行提到过 只需将UIImageView的contentMode设置为Aspect Fill即可达到效果,在super view中无需使用clipToBounds

以上是关于在 UIView 内缩放图像而不改变边界?的主要内容,如果未能解决你的问题,请参考以下文章

确保可拖动的图像视图保持在框架的边界内

Fabricjs - 在画布边界内缩放画布背景以“包含”

应用小部件布局:图像上方的文本行,在边界框内居中

在 Android 上缩放图像会使图像呈现在 ImageView 边界之外

C ++ Opencv重新缩放边界矩形

UIScrollView 缩放:将平移限制为 imageView.image 边界