2014-12-16 3 views
0

Instagram과 비슷하게 UIImageView가 내부에있는 사각형 자르기보기 (UIScrollView)가 있습니다. 따라서 사용자는 정사각형 안의 세로 또는 가로 이미지 (화면 너비와 동일)를 드래그 한 다음 이미지를 스크롤 오프셋에서 잘라야합니다. UIImageView는 가로 세로 맞춤으로 설정됩니다. UIScrollView 내용 크기는 가로 또는 세로의 배 율 인수로 설정되어 가로 세로 비율에 따라 올바르게 렌더링됩니다. .CGContext - 점에서 이미지 자르기 및 축척

문제 : 사용자가 내가 주어진 크기에 따라 이미지의 최대 크기를 조정할 드래그 완료되면

[CGPoint있는 UIImage drawAtPoint]의 사용 (스크롤 오프셋에 그것을 자르 후 평방 1000x1000px을 말하고하자 나는 점을 상쇄 권리를 얻을 수있는 수학 권리를 얻을 수있다 나는 6+ 그것이 4S에 방법이 꺼집니다에이 가까이있는 경우

여기 규모와 작물에 대한 내 코드입니다 :..

(UIImage *)squareImageFromImage:(UIImage *)image scaledToSize:(CGFloat)newSize { 
CGAffineTransform scaleTransform; 
CGPoint origin; 

if (image.size.width > image.size.height) { 
    //landscape 
    CGFloat scaleRatio = newSize/image.size.height; 
    scaleTransform = CGAffineTransformMakeScale(scaleRatio, scaleRatio); 
    origin = CGPointMake((int)(-self.scrollView.contentOffset.x*scaleRatio),0); 
} else if (image.size.width < image.size.height) { 
    //portrait 
    CGFloat scaleRatio = newSize/image.size.width; 
    scaleTransform = CGAffineTransformMakeScale(scaleRatio, scaleRatio); 
    origin = CGPointMake(0, (int)(-self.scrollView.contentOffset.y*scaleRatio)); 
} else { 
    //square 
    CGFloat scaleRatio = newSize/image.size.width; 
    scaleTransform = CGAffineTransformMakeScale(scaleRatio, scaleRatio); 
    origin = CGPointMake(0, 0); 
} 

UIGraphicsBeginImageContextWithOptions(size, YES, 0); 
CGContextRef context = UIGraphicsGetCurrentContext(); 
CGContextConcatCTM(context, scaleTransform); 
[image drawAtPoint:origin]; 
image = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

return image; 
} 

예를 들어 가로로 스크롤하면 왼쪽으로 스크롤을 드래그하면 이미지가 오른쪽으로 잘 렸을 때 오프셋은 6+에 가까울 것이지만 4S에서는 CGPoint의 관점에서 약 150-200 정도 떨어져있을 것입니다.

CGRect cropRect = CGRectMake(0.0f,0.0,SCREEN_WIDTH,SCREEN_WIDTH); 
CGFloat ratio = (int)self.image.size.height/self.image.size.width; 
CGRect r = CGRectMake(0.0,0.0,SCREEN_WIDTH,SCREEN_WIDTH); 

if (ratio>1.00) { 
    //portrait 
    r = CGRectMake(0.0,0.0,SCREEN_WIDTH,(int)(SCREEN_WIDTH*ratio)); 
} else if (ratio<1.00) { 
    //landscape 
    CGFloat size = (int)self.image.size.width/self.image.size.height; 
    cropOffset = (SCREEN_WIDTH*size)-SCREEN_WIDTH; 
    r = CGRectMake(0.0,0.0,(int)(SCREEN_WIDTH*size),SCREEN_WIDTH); 
} 

NSLog(@"r.size.height == %.4f",r.size.height); 
self.scrollView.frame = cropRect; 
self.scrollView.contentSize = r.size; 

self.imageView = [[UIImageView alloc] initWithFrame:r]; 
self.imageView.backgroundColor = [UIColor clearColor]; 
self.imageView.contentMode = UIViewContentModeScaleAspectFit; 
self.imageView.image = self.image; 

[self.scrollView addSubview:self.imageView]; 

답변

0

자르기 수학 까다로운 일이 될 수 있습니다

다음은 스크롤 뷰와 이미지 뷰를 설정하는 내 코드입니다. 이 문제를 처리해야하는 지 오래되었으므로 희망을 갖고 올바른 방향으로 안내 할 것입니다. 다음은 UIScrollView에서 크기가 조정 된 표시 rect를 잡는 Pixology의 코드입니다. 여기서 누락 된 성분은 zoomScale 일 것 같아요.

CGRect visibleRect; 
visibleRect.origin = _scrollView.contentOffset; 
visibleRect.size = _scrollView.bounds.size; 
// figure in the scale 
float theScale = 1.0/_scrollView.zoomScale; 
visibleRect.origin.x *= theScale; 
visibleRect.origin.y *= theScale; 
visibleRect.size.width *= theScale; 
visibleRect.size.height *= theScale; 

는 또한 장치의 화면 크기에 파악해야 할 수도 있습니다

CGFloat screenScale = [[UIScreen mainScreen] scale]; 

는이 정보로 얻을 수있는 방법까지보고, 알려주세요.

+0

스크롤에 확대/축소가 없으므로 이는 중요하지 않습니다. 오른쪽/왼쪽 또는 위/아래로 스크롤 할뿐입니다. 항상 1.0입니다. CGContextConcatCTM는 스크롤 오프셋이 배수가되도록 이미지의 크기를 조정합니다. 승수는 내가 알 수없는 것입니다. – user636066