Ios 在UIImageView中移动UIImage

Ios 在UIImageView中移动UIImage,ios,objective-c,uiimageview,uiimage,Ios,Objective C,Uiimageview,Uiimage,我有一个UIImageView(红色方块),它将显示一个必须缩放的UIImage(我可以接收比UIImageView大或小的图像)。缩放后,UIImage显示的部分是它的中心 我需要的是在蓝色方框中显示图像的一部分,如何存档 我只能得到图像的大小(高度和宽度),但它显示的是原始大小,而应该是缩放的大小 self.viewIm = [[UIImageView alloc] initWithFrame:CGRectMake(100, 100, 120, 80)]; self.viewIm.backg

我有一个
UIImageView
(红色方块),它将显示一个必须缩放的
UIImage
(我可以接收比
UIImageView
大或小的图像)。缩放后,
UIImage
显示的部分是它的中心

我需要的是在蓝色方框中显示图像的一部分,如何存档

我只能得到图像的大小(高度和宽度),但它显示的是原始大小,而应该是缩放的大小

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

试试这样的方法:

CGRect cropRect = CGRectMake(0,0,200,200);
CGImageRef imageRef = CGImageCreateWithImageInRect([ImageToCrop CGImage],cropRect);
UIImage *image = [UIImage imageWithCGImage:imageRef]; 
CGImageRelease(imageRef);
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];

要做您想做的事情,我建议您查看
CALayer
的属性

自从看到你的答案后,我一直在努力找出正确的解决方案,但数学问题让我不知所措,因为
内容反映:
的x和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);
}
float imageAspect=self.imageView.image.size.width/self.imageView.image.size.height;
浮动imageViewAspect=self.imageView.frame.size.width/self.imageView.frame.size.height;
如果(imageAspect>imageViewAspect){
浮动比例图像宽度=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
我在上找到了一个非常好的近似值。在这种情况下,类别将调整图像的大小,然后使用中心点进行裁剪。我使用(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;
}
我的电话是这样的:

CGRect cropRect = CGRectMake(0,0,200,200);
CGImageRef imageRef = CGImageCreateWithImageInRect([ImageToCrop CGImage],cropRect);
UIImage *image = [UIImage imageWithCGImage:imageRef]; 
CGImageRelease(imageRef);
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];

我在这方面花了一些时间,最终创建了一个Swift 3.2解决方案(基于我在另一个线程上的一个答案,以及上面的一个答案)。此代码只允许图像的Y平移,但经过一些调整,任何人都应该能够添加水平平移;)


现在,您可以通过更改
yOffset

尝试UIViewContentModeTop来调整图像的向下或向上距离。
UIViewContentModeTop
不会缩放,因此没有选项。使用UIGraphicsContext创建自定义大小的新图像?您的解决方案不会缩放图像。