Соответствие аэродрома UIImageView
У меня есть изображение, объявленное программным способом, и я устанавливаю его изображение, также программно.
Однако я не могу установить изображение так, чтобы оно соответствовало аспекту и выровняло центр с представлением изображения.
Другими словами, я хочу, чтобы изображение:
- Уменьшите масштаб, чтобы соответствовать аспекту, если изображение велико.
- Центр, но не масштабируется, если изображение мало.
Как это получить?
Ответы
Ответ 1
Просто вставьте решение:
Так же, как @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;
}
решил мою проблему
Ответ 2
В быстром языке мы можем установить режим содержимого представления UIImage следующим образом:
let newImgThumb = UIImageView(frame: CGRect(x: 10, y: 10, width: 100, height: 100))
newImgThumb.contentMode = .scaleAspectFit
Ответ 3
Обновленный ответ
Когда я первоначально ответил на этот вопрос в 2014 году, не было требования не увеличивать изображение в случае маленького изображения. (Вопрос был отредактирован в 2015 году.) Если у вас есть такое требование, вам действительно нужно сравнить размер изображения с размером изображения и использовать UIViewContentModeCenter
(в случае изображения меньше, чем imageView) или UIViewContentModeScaleAspectFit
во всех другие случаи.
Оригинальный ответ
UIViewContentModeScaleAspectFit
достаточно было установить для imageView contentMode значение UIViewContentModeScaleAspectFit
. Кажется, что центрирование изображений также. Я не уверен, почему другие используют логику, основанную на изображении. Смотрите также вопрос: IOS аспект подгонку и центр
Ответ 4
Я решил эту проблему следующим образом.
- setImage для
UIImageView
(с UIViewContentModeScaleAspectFit
) - get imageSize
(CGSize imageSize = imageView.image.size)
-
UIImageView
изменить размер. [imageView sizeThatFits:imageSize]
- переместить положение, где вы хотите.
Я хотел поместить 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];
}
Меня устраивает.
Ответ 5
Вы можете добиться этого, установив режим содержимого изображения в 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;
}
Отредактировано здесь (Swift Version)
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;
}
Ответ 6
let bannerImageView = UIImageView();
bannerImageView.contentMode = .ScaleAspectFit;
bannerImageView.frame = CGRectMake(cftX, cftY, ViewWidth, scrollHeight);
Ответ 7
Этот подкласс использует центр, если изображение не больше, чем представление, в противном случае оно масштабируется. Я нашел это полезным для 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
}
}
}
Ответ 8
[your_imageview setContentMode:UIViewContentModeCenter];
Ответ 9
Для тех, кто ищет изменение размера UIImage,
@implementation UIImage (Resize)
- (UIImage *)scaledToSize:(CGSize)size
{
UIGraphicsBeginImageContextWithOptions(size, NO, 0.0f);
[self drawInRect:CGRectMake(0.0f, 0.0f, size.width, size.height)];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return image;
}
- (UIImage *)aspectFitToSize:(CGSize)size
{
CGFloat aspect = self.size.width / self.size.height;
if (size.width / aspect <= size.height)
{
return [self scaledToSize:CGSizeMake(size.width, size.width / aspect)];
} else {
return [self scaledToSize:CGSizeMake(size.height * aspect, size.height)];
}
}
- (UIImage *)aspectFillToSize:(CGSize)size
{
CGFloat imgAspect = self.size.width / self.size.height;
CGFloat sizeAspect = size.width/size.height;
CGSize scaledSize;
if (sizeAspect > imgAspect) { // increase width, crop height
scaledSize = CGSizeMake(size.width, size.width / imgAspect);
} else { // increase height, crop width
scaledSize = CGSizeMake(size.height * imgAspect, size.height);
}
UIGraphicsBeginImageContextWithOptions(size, NO, 0.0f);
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextClipToRect(context, CGRectMake(0, 0, size.width, size.height));
[self drawInRect:CGRectMake(0.0f, 0.0f, scaledSize.width, scaledSize.height)];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return image;
}
@end
Ответ 10
Swift:
yourImageView.contentMode = .center
Вы можете использовать следующие параметры для позиционирования изображения:
- scaleToFill
- scaleAspectFit//содержимое масштабируется, чтобы соответствовать фиксированному аспекту. остаток прозрачен
- redraw//перерисовка при изменении границ (вызывает -setNeedsDisplay)
- center//содержимое остается того же размера. позиционируется отрегулировано
- Топ
- низ
- оставил
- право
- верхний левый
- в правом верхнем углу
- Нижний левый
- Нижний правый