真正的奇怪的一个被卡住但奇怪的是我。
您有imageView
包含图片。您缩小imageView
的大小,然后告诉它使用UIViewContentModeScaleAspectFit
。所以你的imageView
可能是300乘200但你的缩放图像可能是300乘118或228乘200,因为它aspectfit
。
你到底如何得到实际图像的大小?
imageView.image.size
是原始图片的大小
imageview.frame
是imageview
未包含图片的框架
imageview.contentstretch
不起作用
答案 0 :(得分:36)
我在UIImageView上编写了一个快速类别来实现:
(H)
@interface UIImageView (additions)
- (CGSize)imageScale;
@end
(M)
@implementation UIImageView (additions)
- (CGSize)imageScale {
CGFloat sx = self.frame.size.width / self.image.size.width;
CGFloat sy = self.frame.size.height / self.image.size.height;
CGFloat s = 1.0;
switch (self.contentMode) {
case UIViewContentModeScaleAspectFit:
s = fminf(sx, sy);
return CGSizeMake(s, s);
break;
case UIViewContentModeScaleAspectFill:
s = fmaxf(sx, sy);
return CGSizeMake(s, s);
break;
case UIViewContentModeScaleToFill:
return CGSizeMake(sx, sy);
default:
return CGSizeMake(s, s);
}
}
@end
将原始图像尺寸乘以给定比例,您将获得实际显示的图像尺寸。
答案 1 :(得分:11)
如果图像视图为300x200且图像为1024x768,则可以计算出哪个是限制因素
300/1024 = 0.29296875
200/768 = 0.260416667
因此高度是限制因素......图像将是:
267x200
答案 2 :(得分:4)
在Individual11代码上添加一点安全性。 在没有实际图像的imageView上调用imageScale会崩溃。
extension UIImageView {
var imageScale: CGSize {
if let image = self.image {
let sx = Double(self.frame.size.width / image.size.width)
let sy = Double(self.frame.size.height / image.size.height)
var s = 1.0
switch (self.contentMode) {
case .scaleAspectFit:
s = fmin(sx, sy)
return CGSize (width: s, height: s)
case .scaleAspectFill:
s = fmax(sx, sy)
return CGSize(width:s, height:s)
case .scaleToFill:
return CGSize(width:sx, height:sy)
default:
return CGSize(width:s, height:s)
}
}
return CGSize.zero
}
}