Resize and crop images before displaying in UITableViewCells

后端 未结 2 1593
鱼传尺愫
鱼传尺愫 2021-02-04 22:49

i have an UITableView in my app and i have to load some images that have a fixed width but different heights. I download the images async using an NSOperationQueue and for resiz

2条回答
  •  灰色年华
    2021-02-04 23:20

    this is what i'm using for resizing and croping the UIImages (the code is from Jane Sales solution)

    @implementation UIImage (Extras) 
    #pragma mark -
    #pragma mark Scale and crop image
    
    - (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;
    }
    

    i call the above function like i said before:

    - (void) setupImage:(UIImage *) anImage
    {
        UIImage *resized = [anImage imageByScalingAndCroppingForSize:CGSizeMake(64, 59)];
        [thumbnailView setImage:resized];
    }
    

    the images are downloaded async when a cell is displayed in the table view. the setupImage function receives the image from an NSOperation that downloads it async. the problem is, like i said above, when it reaches [sourceImage drawInRect:thumbnailRect];

    thumbnailView is an UIImageView that is a subview of my custom TableViewCell.

    hope this clears things a bit about what i'm using in my code. Thank you for the help. Sorin

提交回复
热议问题