recorta una image ampliada en ImageView dentro de scrollView

Ya hago muchos esfuerzos desde mi lado. finalmente necesito ayuda Gracias

Objetivo: 1) Cómo encajo imageView dentro de ScrollView

2) Cómo recorto una image ampliada dentro de scrollView.

Tengo una image dentro de la vista de desplazamiento. Quiero recortar la image después del zoom que se muestra dentro del límite de scrollview. Recorté la image pero ya no es exactamente lo que quiero.

Aquí pongo backgroundColor Black en mi scrollView. Y cuando coloco imageView dentro de él, no está en forma. introduzca la descripción de la imagen aquí

después de que la image de zoom dentro de la vista de desplazamiento es

introduzca la descripción de la imagen aquí

y después de que la image de la cosecha esté

introduzca la descripción de la imagen aquí

y mi código está aquí:

- (void)viewDidLoad { [super viewDidLoad]; CGRect frame1 = CGRectMake(50,50,200,200); CGRect frame2 = CGRectMake(50,50,200,200); imageView1=[[UIImageView alloc]initWithFrame:frame1]; imageView1.image= [UIImage imageNamed:@"back.jpeg"]; imageView1.backgroundColor=[UIColor brownColor]; imageView1.contentMode = UIViewContentModeScaleAspectFit; scroll=[[UIScrollView alloc]initWithFrame:frame2]; scroll.backgroundColor=[UIColor blackColor]; [scroll addSubview:imageView1]; scroll.delegate=self; [self.view addSubview:scroll]; [self setContentSizeForScrollView]; self.imageView1.userInteractionEnabled = YES; } 

configuration de la vista de desplazamiento contentSize

 -(void)setContentSizeForScrollView { // scroll.contentSize = CGSizeMake(imageView1.frame.size.width,imageView1.frame.size.height); scroll.contentSize = CGSizeMake(200, 200); scroll.minimumZoomScale = .50; scroll.maximumZoomScale = 1.5; } 

y mi lógica de cultivos es

 -(IBAction)cropButtonClicked { //Calculate the requinetworking area from the scrollview CGRect rect = CGRectMake(50, 50, 200,200); UIImage *image = [self imageByCropping:imageView1.image toRect:rect]; imageView1.image=image; imageView1.contentMode = UIViewContentModeScaleAspectFit; } 

Y esta image de recorte de método:

 - (UIImage*)imageByCropping:(UIImage *)myImage toRect:(CGRect)cropToArea{ CGImageRef cropImageRef = CGImageCreateWithImageInRect(myImage.CGImage, cropToArea); UIImage* cropped = [UIImage imageWithCGImage:cropImageRef]; CGImageRelease(cropImageRef); return cropped; } 

Respuesta de mi propia pregunta: Después de muchos esfuerzos, encontré la respuesta de mis dos preguntas.

y me funciona bien. Comparto aquí, puede ser que ayude a alguien. 🙂

1) Ajuste la vista de la image dentro de la vista de desplazamiento. Yo uso este enlace

 - (void)centerScrollViewContents { CGSize boundsSize = scroll.bounds.size; CGRect contentsFrame = self.imageView1.frame; if (contentsFrame.size.width < boundsSize.width) { contentsFrame.origin.x = (boundsSize.width - contentsFrame.size.width) / 2.0f; } else { contentsFrame.origin.x = 0.0f; } if (contentsFrame.size.height < boundsSize.height) { contentsFrame.origin.y = (boundsSize.height - contentsFrame.size.height) / 2.0f; } else { contentsFrame.origin.y = 0.0f; } self.imageView1.frame = contentsFrame; } 

2) Recortar una image ampliada dentro de scrollView. Yo uso este enlace

  UIGraphicsBeginImageContext(CGSizeMake(200, 200)); [scroll.layer renderInContext:UIGraphicsGetCurrentContext()]; UIImage *fullScreenshot = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); imageView1.contentMode = UIViewContentModeScaleAspectFill; UIImageWriteToSavedPhotosAlbum(fullScreenshot, nil, nil, nil); return fullScreenshot; 

Tuve un problema similar recientemente, obtuve la solución usando la idea relativa (Xa, b = Xa, c – Xb, c)

 -(IBAction)crop:(id)sender{ // F = frame // i = image // iv = imageview // sv = self.view // of = offset //Frame Image in imageView coordinates CGRect Fi_iv = [self frameForImage:self.image inImageViewAspectFit:self.imageView]; //Frame ImageView in self.view coordinates CGRect Fiv_sv = self.imageView.frame; //Frame Image in self.view coordinates CGRect Fi_sv = CGRectMake(Fi_iv.origin.x + Fiv_sv.origin.x ,Fi_iv.origin.y + Fiv_sv.origin.y, Fi_iv.size.width, Fi_iv.size.height); //ScrollView offset CGPoint offset = self.scrollView.contentOffset; //Frame Image in offset coordinates CGRect Fi_of = CGRectMake(Fi_sv.origin.x - offset.x, Fi_sv.origin.y - offset.y, Fi_sv.size.width, Fi_sv.size.height); CGFloat scale = self.imageView.image.size.width/Fi_of.size.width; //the crop frame in image offset coordinates CGRect Fcrop_iof = CGRectMake((self.cropView.frame.origin.x - Fi_of.origin.x)*scale, (self.cropView.frame.origin.y - Fi_of.origin.y)*scale, self.cropView.frame.size.width*scale, self.cropView.frame.size.height*scale); UIImage *image = [self image:self.imageView.image cropRect:Fcrop_iof]; // Use this crop image... 

Puede recortar la image con:

 //Use this code to crop when you have the right frame -(UIImage*)image:(UIImage *)image cropRect:(CGRect)frame { // Create a new UIImage CGImageRef imageRef = CGImageCreateWithImageInRect(image.CGImage, frame); UIImage *croppedImage = [UIImage imageWithCGImage:imageRef]; CGImageRelease(imageRef); return croppedImage; } 

Dado que está utilizando ImageView en Aspect Fit, necesita calcular el marco de image dentro de imageView

 -(CGRect)frameForImage:(UIImage*)image inImageViewAspectFit:(UIImageView*)imageView { float imageRatio = image.size.width / image.size.height; float viewRatio = imageView.frame.size.width / imageView.frame.size.height; if(imageRatio < viewRatio) { float scale = imageView.frame.size.height / image.size.height; float width = scale * image.size.width; float topLeftX = (imageView.frame.size.width - width) * 0.5; return CGRectMake(topLeftX, 0, width, imageView.frame.size.height); } else { float scale = imageView.frame.size.width / image.size.width; float height = scale * image.size.height; float topLeftY = (imageView.frame.size.height - height) * 0.5; return CGRectMake(0, topLeftY, imageView.frame.size.width, height); } } 

Espero que este código pueda funcionar para usted, ya que funcionó para mí.

Mejor,

Rafael