Измените размер UIImage и измените размер UIImageView
У меня есть это UIImageView
, и у меня есть значения его максимальной высоты и максимальной ширины. То, что я хочу достичь, - это то, что я хочу взять изображение (с любым соотношением сторон и любым разрешением), и я хочу, чтобы он соответствовал границам, поэтому изображение не превышает их, но оно может сжимать их по своему усмотрению. (обозначено красным на снимке):
В настоящее время изображение подходит для нужного размера, но у меня есть 2 беспокойства:
1. UIImageView
не равен размеру измененного изображения, тем самым оставляя красный фон (и я не хочу этого)
2. Если изображение меньше, чем высота моего UIImageView
не изменена, чтобы быть меньше, она остается той же самой высоты.
Здесь мой код и я знаю его неправильно:
UIImage *actualImage = [attachmentsArray lastObject];
UIImageView *attachmentImageNew = [[UIImageView alloc] initWithFrame:CGRectMake(5.5, 6.5, 245, 134)];
attachmentImageNew.image = actualImage;
attachmentImageNew.backgroundColor = [UIColor redColor];
attachmentImageNew.contentMode = UIViewContentModeScaleAspectFit;
Итак, как мне динамически изменять размер не только UIImageView.image
, но и всего UIImageView
, что делает его размер полностью регулируемым по своему содержанию. Любая помощь будет очень признательна, спасибо!
Ответы
Ответ 1
Когда вы получите ширину и высоту измененного изображения Получите ширину измененного изображения после UIViewContentModeScaleAspectFit, вы можете изменить размер изображения:
imageView.frame = CGRectMake(0, 0, resizedWidth, resizedHeight);
imageView.center = imageView.superview.center;
Я не проверял, работает ли он, но я думаю, что все должно быть ОК
Ответ 2
- (UIImage *)image:(UIImage*)originalImage scaledToSize:(CGSize)size
{
//avoid redundant drawing
if (CGSizeEqualToSize(originalImage.size, size))
{
return originalImage;
}
//create drawing context
UIGraphicsBeginImageContextWithOptions(size, NO, 0.0f);
//draw
[originalImage drawInRect:CGRectMake(0.0f, 0.0f, size.width, size.height)];
//capture resultant image
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
//return image
return image;
}
Ответ 3
Это эквивалент Swift для ответа Rajneesh071, используя расширения
UIImage {
func scaleToSize(aSize :CGSize) -> UIImage {
if (CGSizeEqualToSize(self.size, aSize)) {
return self
}
UIGraphicsBeginImageContextWithOptions(aSize, false, 0.0)
self.drawInRect(CGRectMake(0.0, 0.0, aSize.width, aSize.height))
let image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return image
}
}
Использование:
let image = UIImage(named: "Icon")
item.icon = image?.scaleToSize(CGSize(width: 30.0, height: 30.0))
Ответ 4
Используйте категорию ниже, а затем примените рамку от кварца к вашему изображению:
[yourimage.layer setBorderColor:[[UIColor whiteColor] CGColor]];
[yourimage.layer setBorderWidth:2];
Категория:
UIImage + AutoScaleResize.h
#import <Foundation/Foundation.h>
@interface UIImage (AutoScaleResize)
- (UIImage *)imageByScalingAndCroppingForSize:(CGSize)targetSize;
@end
UIImage + AutoScaleResize.m
#import "UIImage+AutoScaleResize.h"
@implementation UIImage (AutoScaleResize)
- (UIImage *)imageByScalingAndCroppingForSize:(CGSize)targetSize
{
UIImage *sourceImage = self;
UIImage *newImage = nil;
CGSize imageSize = sourceImage.size;
CGFloat width = imageSize.width;
CGFloat height = imageSize.height;
CGFloat targetWidth = targetSize.width;
CGFloat targetHeight = targetSize.height;
CGFloat scaleFactor = 0.0;
CGFloat scaledWidth = targetWidth;
CGFloat scaledHeight = targetHeight;
CGPoint thumbnailPoint = CGPointMake(0.0,0.0);
if (CGSizeEqualToSize(imageSize, targetSize) == NO)
{
CGFloat widthFactor = targetWidth / width;
CGFloat heightFactor = targetHeight / height;
if (widthFactor > heightFactor)
{
scaleFactor = widthFactor; // scale to fit height
}
else
{
scaleFactor = heightFactor; // scale to fit width
}
scaledWidth = width * scaleFactor;
scaledHeight = height * scaleFactor;
// center the image
if (widthFactor > heightFactor)
{
thumbnailPoint.y = (targetHeight - scaledHeight) * 0.5;
}
else
{
if (widthFactor < heightFactor)
{
thumbnailPoint.x = (targetWidth - scaledWidth) * 0.5;
}
}
}
UIGraphicsBeginImageContext(targetSize); // this will crop
CGRect thumbnailRect = CGRectZero;
thumbnailRect.origin = thumbnailPoint;
thumbnailRect.size.width = scaledWidth;
thumbnailRect.size.height = scaledHeight;
[sourceImage drawInRect:thumbnailRect];
newImage = UIGraphicsGetImageFromCurrentImageContext();
if(newImage == nil)
{
NSLog(@"could not scale image");
}
//pop the context to get back to the default
UIGraphicsEndImageContext();
return newImage;
}
@end
Ответ 5
Если у вас есть размер изображения, почему бы вам не установить размер frame.size
для изображения такого размера?
ИЗМЕНИТЬ ----
Хорошо, поэтому, увидев ваш комментарий, я предлагаю следующее:
UIImageView *imageView;
//so let say you're image view size is set to the maximum size you want
CGFloat maxWidth = imageView.frame.size.width;
CGFloat maxHeight = imageView.frame.size.height;
CGFloat viewRatio = maxWidth / maxHeight;
CGFloat imageRatio = image.size.height / image.size.width;
if (imageRatio > viewRatio) {
CGFloat imageViewHeight = round(maxWidth * imageRatio);
imageView.frame = CGRectMake(0, ceil((self.bounds.size.height - imageViewHeight) / 2.f), maxWidth, imageViewHeight);
}
else if (imageRatio < viewRatio) {
CGFloat imageViewWidth = roundf(maxHeight / imageRatio);
imageView.frame = CGRectMake(ceil((maxWidth - imageViewWidth) / 2.f), 0, imageViewWidth, maxHeight);
} else {
//your image view is already at the good size
}
Этот код изменит размер вашего изображения на коэффициент его изображения, а также расположит изображение в том же центре, что и ваша позиция по умолчанию.
PS: Надеюсь, вы установили imageView.layer.shouldRasterise = YES
и imageView.layer.rasterizationScale = [UIScreen mainScreen].scale;
если вы используете эффект тени CALayer;) Это значительно улучшит производительность вашего пользовательского интерфейса.
Ответ 6
Я думаю, что вы хотите другой content mode
. Попробуйте использовать UIViewContentModeScaleToFill
. Это позволит масштабировать контент, чтобы он соответствовал размеру U UmageView, изменяя при этом пропорции содержимого.
Посмотрите на раздел content mode
официального документа, чтобы получить лучшее представление о доступном режиме контента (это проиллюстрировано с изображениями).
Ответ 7
if([[SDWebImageManager sharedManager] diskImageExistsForURL:[NSURL URLWithString:@"URL STRING1"]])
{
NSString *key = [[SDWebImageManager sharedManager] cacheKeyForURL:[NSURL URLWithString:@"URL STRING1"]];
UIImage *tempImage=[self imageWithImage:[[SDImageCache sharedImageCache] imageFromDiskCacheForKey:key] scaledToWidth:cell.imgview.bounds.size.width];
cell.imgview.image=tempImage;
}
else
{
[cell.imgview sd_setImageWithURL:[NSURL URLWithString:@"URL STRING1"] placeholderImage:nil completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL)
{
UIImage *tempImage=[self imageWithImage:image scaledToWidth:cell.imgview.bounds.size.width];
cell.imgview.image=tempImage;
// [tableView beginUpdates];
// [tableView endUpdates];
}];
}