Search code examples
iphoneobjective-ciosxcodeuiimageview

image position not correct after scaling


I am using UIViewContentModeScaleToFill to scale image.After scaling,Image is not showing on correct position.Help me.

Below is my code:

  UIImage *image=[UIImage imageNamed:@"image2.png"];
    UIImageView *imageView = [[UIImageView alloc] initWithImage:image]; 
    imageView.frame=CGRectMake(0, 0, 200, 200);
    imageView.contentMode = UIViewContentModeScaleAspectFit;

    //change width of frame
    CGRect frame = imageView.frame;
    imageView.frame = frame;
    [self.view addSubview:imageView];

After scaling:

refer to image 1

Before scaling:

refer to image 2

I want scaling image starting from origin point (0,0).


Solution

  • Hi try the below code i hope it help you to get idea....

     UIImage *image=[UIImage imageNamed:@"image2.png"];
        UIImageView *imageView = [[UIImageView alloc] initWithImage:image];
      //  imageView.contentMode = UIViewContentModeScaleToFill;
        imageView.contentMode = UIViewContentModeScaleAspectFit; 
        imageView.frame = self.view.bounds;
        [self.view addSubview:imageView];
    

    Update after below comment:

    I want to crop the image without changing its aspect ration.the width is 200px.and height will change according to width. – shivam

    you want to crop means you try the below category code:

    UIImage+MyImage.h

    #import <UIKit/UIKit.h>
    
    @interface UIImage (MyImage)
    
    
    + (UIImage*)imageFromView:(UIView*)view;
    + (UIImage*)imageFromView:(UIView*)view scaledToSize:(CGSize)newSize;
    + (UIImage*)imageWithImage:(UIImage*)image scaledToSize:(CGSize)newSize;
    + (void)beginImageContextWithSize:(CGSize)size;
    + (UIImage *)croppedImage:(UIImage *)myImage :(CGRect)bounds;
    
    + (UIImage *) imageFromColor:(UIColor *)color;
    
    @end
    

    UIImage+MyImage.m

    #import "UIImage+MyImage.h"
    
    @implementation UIImage (MyImage)
    
    + (void)beginImageContextWithSize:(CGSize)size
    {
        if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)]) {
            if ([[UIScreen mainScreen] scale] == 2.0) {
                UIGraphicsBeginImageContextWithOptions(size, YES, 2.0);
            } else {
                UIGraphicsBeginImageContext(size);
            }
        } else {
            UIGraphicsBeginImageContext(size);
        }
    }
    
    + (void)endImageContext
    {
        UIGraphicsEndImageContext();
    }
    
    + (UIImage*)imageFromView:(UIView*)view
    {
        [self beginImageContextWithSize:[view bounds].size];
        BOOL hidden = [view isHidden];
        [view setHidden:NO];
        [[view layer] renderInContext:UIGraphicsGetCurrentContext()];
        UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
        [self endImageContext];
        [view setHidden:hidden];
        return image;
    }
    
    + (UIImage*)imageFromView:(UIView*)view scaledToSize:(CGSize)newSize
    {
        UIImage *image = [self imageFromView:view];
        if ([view bounds].size.width != newSize.width ||
            [view bounds].size.height != newSize.height) {
            image = [self imageWithImage:image scaledToSize:newSize];
        }
        return image;
    }
    
    + (UIImage*)imageWithImage:(UIImage*)image scaledToSize:(CGSize)newSize
    {
        [self beginImageContextWithSize:newSize];
        [image drawInRect:CGRectMake(0,0,newSize.width,newSize.height)];
        UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
        [self endImageContext];
        return newImage;
    }
    
    
    + (UIImage *)croppedImage:(UIImage *)myImage :(CGRect)bounds {
        CGImageRef imageRef = CGImageCreateWithImageInRect(myImage.CGImage, bounds);
        UIImage *croppedImage = [UIImage imageWithCGImage:imageRef];
        CGImageRelease(imageRef);
        CGSize asd =  croppedImage.size;
        return croppedImage;
    }
    
    
    
    
    
    + (UIImage *) imageFromColor:(UIColor *)color {
        CGRect rect = CGRectMake(0, 0, 1, 1);
        UIGraphicsBeginImageContext(rect.size);
        CGContextRef context = UIGraphicsGetCurrentContext();
        CGContextSetFillColorWithColor(context, [color CGColor]);
        //  [[UIColor colorWithRed:222./255 green:227./255 blue: 229./255 alpha:1] CGColor]) ;
        CGContextFillRect(context, rect);
        UIImage *img = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
        return img;
    }
    
    
    
    
    @end
    

    the call will be :

    imageView.image=[UIImage croppedImage:imageView.Image :CGRectMake(0,0,200,200) ];