ios 如何在 UIImageView 中获取缩放的 UIImage 的大小?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/389342/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How to get the size of a scaled UIImage in UIImageView?
提问by cncool
The image.size
attribute of UIImageView
gives the size of the original UIImage
. I would like to find out the size of the autoscaled image when it is put in the UIImageView
(typically smaller than the original).
的image.size
属性UIImageView
给出了原始的大小UIImage
。我想找出自动缩放图像放入时的大小UIImageView
(通常小于原始图像)。
For example, I have the image set to Aspect Fit
. Now I want to know its new height and width on the screen so I can draw accurately on the new scaled image.
例如,我将图像设置为Aspect Fit
. 现在我想知道它在屏幕上的新高度和宽度,以便我可以在新的缩放图像上准确绘制。
Is there any way to do this without figuring it out myself based on the UIImageView size & UIImage original size (basically reverse engineering its scaling)?
有没有办法做到这一点,而无需根据 UIImageView 大小和 UIImage 原始大小(基本上对其缩放进行逆向工程)自己弄清楚?
回答by cncool
Objective-C:
目标-C:
-(CGRect)frameForImage:(UIImage*)image inImageViewAspectFit:(UIImageView*)imageView
{
float imageRatio = image.size.width / image.size.height;
float viewRatio = imageView.frame.size.width / imageView.frame.size.height;
if(imageRatio < viewRatio)
{
float scale = imageView.frame.size.height / image.size.height;
float width = scale * image.size.width;
float topLeftX = (imageView.frame.size.width - width) * 0.5;
return CGRectMake(topLeftX, 0, width, imageView.frame.size.height);
}
else
{
float scale = imageView.frame.size.width / image.size.width;
float height = scale * image.size.height;
float topLeftY = (imageView.frame.size.height - height) * 0.5;
return CGRectMake(0, topLeftY, imageView.frame.size.width, height);
}
}
Swift 4:
斯威夫特 4:
func frame(for image: UIImage, inImageViewAspectFit imageView: UIImageView) -> CGRect {
let imageRatio = (image.size.width / image.size.height)
let viewRatio = imageView.frame.size.width / imageView.frame.size.height
if imageRatio < viewRatio {
let scale = imageView.frame.size.height / image.size.height
let width = scale * image.size.width
let topLeftX = (imageView.frame.size.width - width) * 0.5
return CGRect(x: topLeftX, y: 0, width: width, height: imageView.frame.size.height)
} else {
let scale = imageView.frame.size.width / image.size.width
let height = scale * image.size.height
let topLeftY = (imageView.frame.size.height - height) * 0.5
return CGRect(x: 0.0, y: topLeftY, width: imageView.frame.size.width, height: height)
}
}
回答by Meet Doshi
This simple function will calculate size of image:-
这个简单的函数将计算图像的大小:-
[imageView setFrame:AVMakeRectWithAspectRatioInsideRect(image.size, imageView.frame)];
For more details, You can refer AVMakeRectWithAspectRatioInsideRect - AVFoundation.
有关更多详细信息,您可以参考AVMakeRectWithAspectRatioInsideRect - AVFoundation。
回答by Oleh Kudinov
This simple function will calculate size of image after aspect fit:
这个简单的函数将计算宽高比匹配后的图像大小:
-(CGSize)imageSizeAfterAspectFit:(UIImageView*)imgview{
float newwidth;
float newheight;
UIImage *image=imgview.image;
if (image.size.height>=image.size.width){
newheight=imgview.frame.size.height;
newwidth=(image.size.width/image.size.height)*newheight;
if(newwidth>imgview.frame.size.width){
float diff=imgview.frame.size.width-newwidth;
newheight=newheight+diff/newheight*newheight;
newwidth=imgview.frame.size.width;
}
}
else{
newwidth=imgview.frame.size.width;
newheight=(image.size.height/image.size.width)*newwidth;
if(newheight>imgview.frame.size.height){
float diff=imgview.frame.size.height-newheight;
newwidth=newwidth+diff/newwidth*newwidth;
newheight=imgview.frame.size.height;
}
}
NSLog(@"image after aspect fit: width=%f height=%f",newwidth,newheight);
//adapt UIImageView size to image size
//imgview.frame=CGRectMake(imgview.frame.origin.x+(imgview.frame.size.width-newwidth)/2,imgview.frame.origin.y+(imgview.frame.size.height-newheight)/2,newwidth,newheight);
return CGSizeMake(newwidth, newheight);
}
回答by Cesar
An adaptation of cncool answer, in swift as a UIImageView extension, perhaps it could be useful to someone:
cncool answer的改编,作为 UIImageView 扩展迅速,也许它可能对某人有用:
extension UIImageView{
func frameForImageInImageViewAspectFit() -> CGRect
{
if let img = self.image {
let imageRatio = img.size.width / img.size.height;
let viewRatio = self.frame.size.width / self.frame.size.height;
if(imageRatio < viewRatio)
{
let scale = self.frame.size.height / img.size.height;
let width = scale * img.size.width;
let topLeftX = (self.frame.size.width - width) * 0.5;
return CGRectMake(topLeftX, 0, width, self.frame.size.height);
}
else
{
let scale = self.frame.size.width / img.size.width;
let height = scale * img.size.height;
let topLeftY = (self.frame.size.height - height) * 0.5;
return CGRectMake(0, topLeftY, self.frame.size.width, height);
}
}
return CGRectMake(0, 0, 0, 0)
}
}
回答by August
Since you've got the image view set to Aspect Fit, you can simply take the height and width of the image view along with the height and width of the original image and calculate the height and width of the scaled image.
由于您已将图像视图设置为 Aspect Fit,您可以简单地获取图像视图的高度和宽度以及原始图像的高度和宽度,并计算缩放图像的高度和宽度。
That said, the betterway of doing this is to have a custom view instead of a UIImageView. Then, draw the image yourself in the custom view. That way you can control every aspect of it.
也就是说,更好的方法是使用自定义视图而不是 UIImageView。然后,在自定义视图中自己绘制图像。这样你就可以控制它的各个方面。
回答by Nathan F.
Following up on @MeetDoshi, here is an extension that should accommodate this.
跟进@MeetDoshi,这是一个应该适应这个的扩展。
extension UIImageView {
/// Retrieve the scaled size of the image within this ImageView.
/// - Returns: A CGRect representing the size of the image after scaling or nil if no image is set.
func getScaledImageSize() -> CGRect? {
if let image = self.image {
return AVMakeRect(aspectRatio: image.size, insideRect: self.frame);
}
return nil;
}
}
回答by Nathan F.
I wrote a useful extension that includes this in it's set of additions, might be worth checking out.
我写了一个有用的扩展,将它包含在它的一组添加中,可能值得一试。
Included Functions
包含的功能
func getScaledImageSize() -> CGRect?
func getScaledImageSizeWithPadding() -> CGRect?
func getPaddingTop() -> CGFloat? {
func getPaddingBottom() -> CGFloat? {
func getPaddingLeft() -> CGFloat? {
func getPaddingRight() -> CGFloat?
func getScaledCoordinate(forX x: CGFloat, andY y: CGFloat, multiplier:CGFloat = 100.0) -> CGPoint?
func getScaledCoordinateWithPadding(forX x: CGFloat, andY y: CGFloat, multiplier:CGFloat = 100.0) -> CGPoint?
https://gist.github.com/nathan-fiscaletti/e1b85f68559f305db7342bfff9574563
https://gist.github.com/nathan-fiscaletti/e1b85f68559f305db7342bfff9574563
回答by Nathan F.
If the frame is filled maintaining the image aspect ratio, the imageview frame will not be the same as the image size.
如果在保持图像纵横比的情况下填充框架,则图像视图框架将与图像大小不同。
回答by leonho
How about just get the UIImageView size from its frame? i.e. imageView.frame?
从它的框架中获取 UIImageView 大小怎么样?即imageView.frame?