2013-02-01 54 views
21

Tôi có số này UIImageView và tôi có giá trị chiều cao tối đa và chiều rộng tối đa của nó. Những gì tôi muốn đạt được là tôi muốn chụp ảnh (với bất kỳ tỷ lệ khung hình và độ phân giải nào) và tôi muốn nó vừa với đường viền, vì vậy hình ảnh không vượt quá chúng, nhưng nó có thể thu nhỏ chúng theo ý muốn . (Đánh dấu màu đỏ trong hình):Thay đổi kích cỡ UIImage và thay đổi kích thước của UIImageView

enter image description here

Ngay bây giờ hình ảnh phù hợp với kích thước cần thiết đúng, nhưng tôi có 2 lo lắng: 1. UIImageView không bằng kích thước của hình ảnh thay đổi kích cỡ, do đó để lại nền màu đỏ (và tôi không muốn điều đó) 2. Nếu hình ảnh nhỏ hơn chiều cao của UIImageView của nó, nó không được thay đổi kích thước để nhỏ hơn, nó vẫn giữ nguyên chiều cao.

Dưới đây là mã của tôi và tôi biết sai của nó:

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; 

Vì vậy, làm thế nào để tự động thay đổi kích thước không chỉ của UIImageView.image, nhưng tất cả UIImageView, do đó làm cho kích thước của nó hoàn toàn có thể điều chỉnh nội dung của nó. Bất kỳ trợ giúp sẽ được nhiều đánh giá cao, cảm ơn!

Trả lời

30

Khi bạn nhận được chiều rộng và chiều cao của một hình ảnh thay đổi kích cỡ Get width of a resized image after UIViewContentModeScaleAspectFit, bạn có thể thay đổi kích thước IMAGExem của bạn:

imageView.frame = CGRectMake(0, 0, resizedWidth, resizedHeight); 
imageView.center = imageView.superview.center; 

tôi đã không kiểm tra nếu nó hoạt động, nhưng tôi nghĩ rằng tất cả nên được OK

+1

nếu sau khi giám sát, tôi không thêm '!' nó cung cấp cho tôi lỗi 'giá trị của loại tùy chọn' UIView? ' chưa được gỡ bỏ 'là cố định nếu tôi sử dụng'! ' : imageView.center = imageView.superview! .center; – Alex

+0

Nếu bạn đang sử dụng bố cục tự động thì sao? Bạn không nên đặt 'khung'? –

1

Nếu bạn có kích thước hình ảnh, tại sao bạn không đặt frame.size của chế độ xem hình ảnh có kích thước này?

EDIT ----

Ok, vậy khi nhìn thấy bình luận của bạn Tôi đề nghị này:

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 
} 

Mã này sẽ thay đổi kích thước xem hình ảnh của bạn với tỷ lệ hình ảnh của mình, và cũng có vị chế độ xem hình ảnh vào cùng một trung tâm với vị trí "mặc định" của bạn.

PS: Tôi hy vọng bạn đang thiết imageView.layer.shouldRasterise = YESimageView.layer.rasterizationScale = [UIScreen mainScreen].scale;

nếu bạn đang sử dụng CALayer hiệu ứng đổ bóng;) Nó sẽ cải thiện đáng kể hiệu suất của giao diện người dùng của bạn.

+0

Tại sao bạn nghĩ tôi thay đổi kích thước bằng 'attachmentImageNew.contentMode = UIViewContentModeScaleAspectFit'? Bởi vì hình ảnh quá lớn. Tôi không thể đặt kích thước của 'imageView' thành kích thước chính xác của hình ảnh vì tôi có giá trị tối đa cho chiều cao và chiều rộng của hình ảnh. Và khá nhiều 90% hình ảnh phải được thay đổi kích cỡ. –

0

Tôi nghĩ điều bạn muốn là khác nhau content mode. Thử sử dụng UIViewContentModeScaleToFill. Điều này sẽ mở rộng nội dung để phù hợp với kích thước của UIImageView ur bằng cách thay đổi tỷ lệ khung hình của nội dung nếu cần.

Hãy xem phần content mode trên tài liệu chính thức để có ý tưởng tốt hơn về chế độ nội dung khác nhau có sẵn (được minh họa bằng hình ảnh).

+0

Tôi đã thử điều đó và nó vượt quá giới hạn của 'UIImageView' của tôi vào thiên hà xa xa –

+0

Điều đó nghe giống như một cuộc chiến tranh sao lỗi sau đó :-) – tiguero

+0

Vâng, nó không có lỗi, nó chỉ cư xử như vậy, tôi không nghĩ rằng tôi cần 'contentMode' ở tất cả, tôi cần một cái gì đó mạnh mẽ hơn –

22
- (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; 
} 
4

Sử dụng các loại dưới đây và sau đó áp dụng biên từ thạch anh vào hình ảnh của bạn:

[yourimage.layer setBorderColor:[[UIColor whiteColor] CGColor]]; 
[yourimage.layer setBorderWidth:2]; 

Danh mục: 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 
6

Đây là tương đương Swift cho câu trả lời Rajneesh071 của, sử dụng phần mở rộng

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 
    } 
} 

Cách sử dụng:

let image = UIImage(named: "Icon") 
item.icon = image?.scaleToSize(CGSize(width: 30.0, height: 30.0)) 
+0

Điều này làm việc cho tôi! – thejuki

0
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]; 

     }]; 
    } 
Các vấn đề liên quan