IPhone: получение размера изображения после AspectFt
Реальная нечетная, чтобы застрять, но странно я.
У вас есть imageView
, содержащий изображение. Вы уменьшаете размер imageView
вниз, а затем говорите ему, чтобы он использовал UIViewContentModeScaleAspectFit
. поэтому ваш imageView
может быть 300 на 200, но ваше масштабированное изображение внутри может быть 300 на 118 или 228 на 200, потому что его aspectfit
.
Как вы получаете размер фактического изображения?
imageView.image.size
- размер исходного изображения.
imageview.frame
- это рамка imageView
не содержащегося изображения.
imageview.contentstretch
тоже не работает
Ответы
Ответ 1
Я написал быструю категорию в UIImageView, чтобы добиться этого:
(. Ч)
@interface UIImageView (additions)
- (CGSize)imageScale;
@end
(м.)
@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
Умножьте исходный размер изображения на заданный масштаб, и вы получите фактический размер отображаемого изображения.
Ответ 2
ну.. вам нужно сделать некоторую математику. у вас есть размер исходного изображения, и вы имеете размер изображения. Поэтому вы можете рассчитать, будет ли он изменяться по высоте или ширине.
если вы видите изображение размером 300x200, а изображение 1024x768, вы можете рассчитать, который является лимитирующим фактором
300/1024 = 0.29296875
200/768 = 0.260416667
так что высота является ограничивающим фактором... изображение будет:
267x200
Ответ 3
Быстрая версия принятого ответа:
extension UIImageView {
var imageScale: CGSize {
let sx = Double(self.frame.size.width / self.image!.size.width)
let sy = Double(self.frame.size.height / self.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)
}
}
}
Ответ 4
Просто добавьте небольшую защиту в код Individual11.
При вызове 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
}
}