2015-10-22 4 views
4

СЦЕНАРИЙObjective-C: масштабируются обрезанное изображение от UIScrollView

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

, что я попытался

Я пытался сделать это с помощью нескольких решений на StackOverflow, но они предполагают использование снимок экрана UIScrollView кадра после того, как пользователь изменяет масштаб изображения. Причина, по которой это не будет работать, заключается в том, что когда пользователь снимает снимок экрана на iPhone 5 (320x320, идеальный квадрат по ширине экрана), когда эта фотография загружается и отображается на iPhone 6 Plus (гораздо больший размер экрана), изображение будет пикселированным.

ВОПРОС

Как получить изображение, которое может быть 3000x3000 увеличено в UIScrollView и извлечь изображение, которое размеры UIScrollView рамы (320x320) но масштабируется до 640x640 без потеря разрешения изображения?

ИЛЛЮСТРАЦИИ

enter image description here

ответ

2

Во-первых, вы можете создать подкласс UIScrollView, которые содержат UIImageView внутри него, инициализации этого UIScrollView и UIImageView, assgin с instace изображения в UIImageView, так что он может отображать.

- (instancetype)initWithFrame:(CGRect)frame{ 
    self = [super initWithFrame:frame]; 
    if (self) { 
     self.delegate = self; 
     self.maximumZoomScale = 4.0f; 
     self.showsHorizontalScrollIndicator = NO; 
     self.showsVerticalScrollIndicator = NO; 
     [self loadImageView:frame]; 
    } 
    return self; 
} 

- (void) loadImageView:(CGRect) frame { 
    if (!_imageView) { 
     _imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0,(frame.size.height-frame.size.width)/2, frame.size.width, frame.size.width)]; 
     _imageView.contentMode = UIViewContentModeScaleAspectFit; 
     _imageView.center = self.center; 
     [self addSubview:_imageView]; 
    } 
} 

//call this menthod to assginment image to imageView 
- (void)showImage:(UIImage*)image{ 
    self.imageView.image = image; 
    [self handleImageType]; 
} 

Во-вторых, вы можете обращаться в viewForZoomingInScrollView и scrollViewDidZoom, код, как показано ниже:

- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView { 

    return _imageView;//your imageView inside UIScrollView 
} 


- (void)scrollViewDidZoom:(UIScrollView *)scrollView 
{ 
    CGSize boundSize = self.bounds.size;//scrollView bounds 
    CGFloat boundWidth = boundSize.width; 
    CGFloat boundHeight = boundSize.height; 

    CGSize imageSize = self.imageView.image.size; 
    CGFloat imageWidth = imageSize.width; 
    CGFloat imageHeight = imageSize.height; 

    CGFloat zoomScale = scrollView.zoomScale; 
    DLog(@"zoomScale === %f",zoomScale); 

    [self normalScaleViewDidZoom:boundWidth boundHeight:boundHeight imageWidth:imageWidth imageHeight:imageHeight scrollView:scrollView]; 
} 

- (void)handleImageType{ 

    CGSize imageSize = self.imageView.image.size;//imageView's image size 
    CGFloat imageWidth = imageSize.width; 
    CGFloat imageHeight = imageSize.height; 
    if (imageWidth > imageHeight) { 
     type = 1; 
    } else if (imageWidth < imageHeight){ 
     type = 2; 
    } else if (imageWidth == imageHeight) { 
     type = 3; 
    } 
} 
- (void)normalScaleViewDidZoom:(CGFloat)boundWidth boundHeight:(CGFloat)boundHeight imageWidth:(CGFloat)imageWidth imageHeight:(CGFloat)imageHeight scrollView:(UIScrollView*)scrollView{ 

    CGFloat zoomScale = scrollView.zoomScale; 
    if (type == 1) { 

     self.contentSize = CGSizeMake(boundWidth/imageHeight*imageWidth*zoomScale,boundWidth*zoomScale + (boundHeight-boundWidth)); 
    } else if (type == 2){ 

     self.contentSize = CGSizeMake(boundWidth*zoomScale,boundWidth/imageWidth*imageHeight*zoomScale + (boundHeight-boundWidth)); 
    } else if (type == 3) { 

     self.contentSize = CGSizeMake(boundWidth*zoomScale,boundHeight-boundWidth+boundWidth*zoomScale); 
    } 
    [self zoomCenter:scrollView]; 
} 


- (void)zoomCenter:(UIScrollView*)scrollView{ 
    CGFloat offsetX = (scrollView.bounds.size.width > scrollView.contentSize.width)?(scrollView.bounds.size.width - scrollView.contentSize.width)/2 : 0.0; 
    CGFloat offsetY = (scrollView.bounds.size.height > scrollView.contentSize.height)?(scrollView.bounds.size.height - scrollView.contentSize.height)/2 : 0.0; 
    self.imageView.center = CGPointMake(scrollView.contentSize.width/2 + offsetX,scrollView.contentSize.height/2 + offsetY); 

} 

все выше кода, который я имею применить в моем проекте, надеюсь, что, может быть доступным для вас :)

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