Ich habe dieses UIImageView
und ich habe die Werte für seine maximale Höhe und maximale Breite. Was ich erreichen will ist, dass ich das Bild aufnehmen möchte (mit beliebigem Seitenverhältnis und beliebiger Auflösung) und ich möchte, dass es in die Ränder passt, damit das Bild sie nicht überschreitet sie aber es kann sie verkleinern es will. (im Bild rot markiert):
Im Moment passt das Bild richtig in die nötige Größe, aber ich habe zwei Sorgen: 1. UIImageView
entspricht nicht der Größe des skalierten Bildes und hinterlässt somit einen roten Hintergrund (und ich möchte das nicht) 2. Wenn das Bild kleiner als die Höhe meines UIImageView
ist, wird die Größe nicht geändert, damit es kleiner wird. Es bleibt jedoch dieselbe Höhe.
Hier ist mein Code und ich weiß, dass es falsch ist:
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;
Wie ändere ich also dynamisch die Größe nicht nur des UIImageView.image
, sondern des gesamten UIImageView
, so dass seine Größe vollständig an den Inhalt angepasst werden kann. Jede Hilfe wäre sehr dankbar, danke!
Wenn Sie die Breite und Höhe eines skalierten Bildes erhalten Breite eines skalierten Bildes nach UIViewContentModeScaleAspectFit abrufen, können Sie die Bildansicht ändern:
imageView.frame = CGRectMake(0, 0, resizedWidth, resizedHeight);
imageView.center = imageView.superview.center;
Ich habe nicht überprüft, ob es funktioniert, aber ich denke, alles sollte in Ordnung sein
- (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;
}
Dies ist das schnelle Äquivalent für die Antwort von Rajneesh071, das Erweiterungen verwendet
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
}
}
Verwendungszweck:
let image = UIImage(named: "Icon")
item.icon = image?.scaleToSize(CGSize(width: 30.0, height: 30.0))
Verwenden Sie die unten stehende Kategorie und wenden Sie dann den Rand von Quarz in Ihr Bild an:
[yourimage.layer setBorderColor:[[UIColor whiteColor] CGColor]];
[yourimage.layer setBorderWidth:2];
Die Kategorie: 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
Wenn Sie die Größe des Bildes haben, warum setzen Sie den frame.size
der Bildansicht nicht auf diese Größe?
BEARBEITEN----
Ok, da ich deinen Kommentar sehe, schlage ich Folgendes vor:
UIImageView *imageView;
//so let's 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
}
Durch diesen Code wird die Bildansicht an das Bildverhältnis angepasst und die Bildansicht in der Mitte der "Standardposition" positioniert.
PS: Ich hoffe, Sie setzen imageView.layer.shouldRasterise = YES
Und imageView.layer.rasterizationScale = [UIScreen mainScreen].scale;
wenn Sie den CALayer-Schatteneffekt verwenden;) Dadurch wird die Leistung Ihrer Benutzeroberfläche erheblich verbessert.
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];
}];
}
Ich denke, was Sie wollen, ist ein anderer content mode
. Versuchen Sie es mit UIViewContentModeScaleToFill
. Dadurch wird der Inhalt an die Größe Ihres UIImageView angepasst, indem das Seitenverhältnis des Inhalts bei Bedarf geändert wird.
Schauen Sie sich den Abschnitt content mode
des offiziellen Dokuments an, um einen besseren Überblick über die verschiedenen verfügbaren Inhaltsmodi zu erhalten (dies wird mit Bildern veranschaulicht).