2015-02-24 4 views
3

У меня есть UIImageView (красные квадраты), на котором будет отображаться UIImage, который необходимо масштабировать (я могу получать изображения больше или меньше, чем UIImageView). После его масштабирования показанная часть UIImage является ее центром.Перемещение UIImage внутри UIImageView

Что мне нужно, чтобы показать часть изображения на синих квадратах, как я могу ее заархивировать?

Я могу получить размер изображения (высота и ширина), но он отображает исходный размер, когда он должен быть масштабированным.

self.viewIm = [[UIImageView alloc] initWithFrame:CGRectMake(100, 100, 120, 80)]; 
self.viewIm.backgroundColor = [UIColor greenColor]; 
self.viewIm.layer.borderColor = [UIColor redColor].CGColor; 
self.viewIm.layer.borderWidth = 5.0; 
UIImage *im = [UIImage imageNamed:@"benjen"]; 
self.viewIm.image = im; 
self.viewIm.contentMode = UIViewContentModeScaleAspectFill; 
// self.viewim.clipsToBounds = YES; 
[self.view addSubview:self.viewIm]; 

enter image description here

+0

попробовать UIViewContentModeTop – Mornirch

+0

'UIViewContentModeTop' не будет масштабироваться, так что это не вариант?. – jherran

+0

use UIGraphicsContext создать новое изображение для нестандартного размера? – Mornirch

ответ

1

Я нашел очень хорошее приближение на this answer. В этом случае категория изменяет размер изображения и затем использует центральную точку для обрезки. Я приспосабливаю его к обрезке, используя (0,0) в качестве начальной точки. Поскольку мне действительно не нужна категория, я использую ее как единственный метод.

- (UIImage *)imageByScalingAndCropping:(UIImage *)image forSize:(CGSize)targetSize { 
    UIImage *sourceImage = image; 
    UIImage *newImage = nil; 
    CGFloat scaleFactor = 0.0; 
    CGFloat scaledWidth = targetSize.width; 
    CGFloat scaledHeight = targetSize.height; 

    if (CGSizeEqualToSize(image.size, targetSize) == NO) { 
     if ((targetSize.width/image.size.width) > (targetSize.height/image.size.height)) { 
      scaleFactor = targetSize.width/image.size.width; // scale to fit height 
     } else { 
      scaleFactor = targetSize.height/image.size.height; // scale to fit width 
     } 

     scaledWidth = image.size.width * scaleFactor; 
     scaledHeight = image.size.height * scaleFactor; 
    } 

    UIGraphicsBeginImageContext(targetSize); // this will crop 

    CGRect thumbnailRect = CGRectZero; 
    thumbnailRect.origin = CGPointZero; 
    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; 
} 

И мой призыв что-то вроде этого:

self.viewIm = [[UIImageView alloc] initWithFrame:CGRectMake(100, 100, 120, 80)]; 
self.viewIm.image = [self imageByScalingAndCropping:[UIImage imageNamed:@"benjen"] forSize:CGSizeMake(120, 80)]; 
[self.view addSubview:self.viewIm]; 
1

Попробуйте что-то вроде этого:

CGRect cropRect = CGRectMake(0,0,200,200); 
CGImageRef imageRef = CGImageCreateWithImageInRect([ImageToCrop CGImage],cropRect); 
UIImage *image = [UIImage imageWithCGImage:imageRef]; 
CGImageRelease(imageRef); 
+0

Ваше решение не масштабирует изображение. – jherran

2

Для того, чтобы делать то, что вы пытаетесь сделать, я бы рекомендовал смотреть в CALayer «s contentsRect собственности.

С тех пор, как я увидел ваш ответ, я пытался найти подходящее решение какое-то время, но математика ускользает от меня, потому что параметры sx и y выглядят как таинственные ... Но вот какой-то код, который может указывать вы в правильном направлении ...

float imageAspect = self.imageView.image.size.width/self.imageView.image.size.height; 
float imageViewAspect = self.imageView.frame.size.width/self.imageView.frame.size.height; 

if (imageAspect > imageViewAspect) { 
    float scaledImageWidth = self.imageView.frame.size.height * imageAspect; 
    float offsetWidth = -((scaledImageWidth-self.imageView.frame.size.width)/2); 
    self.imageView.layer.contentsRect = CGRectMake(offsetWidth/self.imageView.frame.size.width, 0.0, 1.0, 1.0); 
} else if (imageAspect < imageViewAspect) { 
    float scaledImageHeight = self.imageView.frame.size.width * imageAspect; 
    float offsetHeight = ((scaledImageHeight-self.imageView.frame.size.height)/2); 
    self.imageView.layer.contentsRect = CGRectMake(0.0, offsetHeight/self.imageView.frame.size.height, 1.0, 1.0); 
} 
+0

Полезный ключ. благодаря – jherran

Смежные вопросы