Еще один простой способ сделать это - поместить ваш файл UIImageView
в UIScrollView
. Как я описываю здесь , вам нужно установить contentSize представления прокрутки таким же, как ваш UIImageView's
размер. Установите экземпляр контроллера , чтобы быть делегат зрения прокрутки и реализовать viewForZoomingInScrollView:
и scrollViewDidEndZooming:withView:atScale:
методы , чтобы обеспечить пинч-масштабирование и панорамирование изображения. Фактически это то, что делает решение Бена, только немного более легким способом, поскольку у вас нет накладных расходов, связанных с полным веб-представлением.
Одна из проблем, с которой вы можете столкнуться, заключается в том, что масштабирование в представлении прокрутки осуществляется в виде преобразований, применяемых к изображению. Это может привести к размытости при большом коэффициенте увеличения. Для чего-то, что можно перерисовать, вы можете следовать моим советам здесь, чтобы обеспечить более четкое отображение после завершения жеста сжатия. На этом этапе можно использовать решение hniels для изменения масштаба изображения.
Как описывали другие, самое простое решение - поместить ваш UIImageView в UIScrollView. Я сделал это в файле .xib Interface Builder.
В viewDidLoad установите следующие переменные. Установите в качестве контроллера UIScrollViewDelegate.
- (void)viewDidLoad { [super viewDidLoad]; self.scrollView.minimumZoomScale = 0.5; self.scrollView.maximumZoomScale = 6.0; self.scrollView.contentSize = self.imageView.frame.size; self.scrollView.delegate = self; }
Вам необходимо реализовать следующий метод, чтобы вернуть изображение, которое вы хотите увеличить.
- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView { return self.imageView; }
В версиях до iOS9 вам также может потребоваться добавить этот пустой метод делегата:
- (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(CGFloat)scale { }
Apple , документация делает хорошую работу по описанию , как это сделать:
источник
scrollViewDidEndZooming :
метода.Решение Шефали для UIImageView отлично работает, но требует небольшой модификации:
- (void)pinch:(UIPinchGestureRecognizer *)gesture { if (gesture.state == UIGestureRecognizerStateEnded || gesture.state == UIGestureRecognizerStateChanged) { NSLog(@"gesture.scale = %f", gesture.scale); CGFloat currentScale = self.frame.size.width / self.bounds.size.width; CGFloat newScale = currentScale * gesture.scale; if (newScale < MINIMUM_SCALE) { newScale = MINIMUM_SCALE; } if (newScale > MAXIMUM_SCALE) { newScale = MAXIMUM_SCALE; } CGAffineTransform transform = CGAffineTransformMakeScale(newScale, newScale); self.transform = transform; gesture.scale = 1; } }
(Обратной стороной решения Шефали было то, что оно не масштабировалось непрерывно во время сжатия. Кроме того, при запуске нового сжатия текущий масштаб изображения сбрасывался.)
источник
Приведенный ниже код помогает увеличить UIImageView без использования UIScrollView:
-(void)HandlePinch:(UIPinchGestureRecognizer*)recognizer{ if ([recognizer state] == UIGestureRecognizerStateEnded) { NSLog(@"======== Scale Applied ==========="); if ([recognizer scale]<1.0f) { [recognizer setScale:1.0f]; } CGAffineTransform transform = CGAffineTransformMakeScale([recognizer scale], [recognizer scale]); imgView.transform = transform; } }
источник
Имейте в виду, что вы НИКОГДА не увеличиваете масштаб изображения
UIImage
. КОГДА-ЛИБО.Вместо этого вы увеличиваете и уменьшаете масштаб изображения, на
view
котором отображаетсяUIImage
.В этом конкретном случае вы можете выбрать создание пользовательского
UIView
рисунка для отображения изображения,UIImageView
который отображает изображение для вас, или дляUIWebView
которого потребуется дополнительный HTML-код для его резервного копирования.Во всех случаях вам необходимо реализовать
touchesBegan
,touchesMoved
и тому подобное, чтобы определить, что пользователь пытается сделать (масштабирование, панорамирование и т. Д.).источник
Вот решение, которое я использовал раньше, для которого не требуется использовать UIWebView.
- (UIImage *)scaleAndRotateImage(UIImage *)image { int kMaxResolution = 320; // Or whatever CGImageRef imgRef = image.CGImage; CGFloat width = CGImageGetWidth(imgRef); CGFloat height = CGImageGetHeight(imgRef); CGAffineTransform transform = CGAffineTransformIdentity; CGRect bounds = CGRectMake(0, 0, width, height); if (width > kMaxResolution || height > kMaxResolution) { CGFloat ratio = width/height; if (ratio > 1) { bounds.size.width = kMaxResolution; bounds.size.height = bounds.size.width / ratio; } else { bounds.size.height = kMaxResolution; bounds.size.width = bounds.size.height * ratio; } } CGFloat scaleRatio = bounds.size.width / width; CGSize imageSize = CGSizeMake(CGImageGetWidth(imgRef), CGImageGetHeight(imgRef)); CGFloat boundHeight; UIImageOrientation orient = image.imageOrientation; switch(orient) { case UIImageOrientationUp: //EXIF = 1 transform = CGAffineTransformIdentity; break; case UIImageOrientationUpMirrored: //EXIF = 2 transform = CGAffineTransformMakeTranslation(imageSize.width, 0.0); transform = CGAffineTransformScale(transform, -1.0, 1.0); break; case UIImageOrientationDown: //EXIF = 3 transform = CGAffineTransformMakeTranslation(imageSize.width, imageSize.height); transform = CGAffineTransformRotate(transform, M_PI); break; case UIImageOrientationDownMirrored: //EXIF = 4 transform = CGAffineTransformMakeTranslation(0.0, imageSize.height); transform = CGAffineTransformScale(transform, 1.0, -1.0); break; case UIImageOrientationLeftMirrored: //EXIF = 5 boundHeight = bounds.size.height; bounds.size.height = bounds.size.width; bounds.size.width = boundHeight; transform = CGAffineTransformMakeTranslation(imageSize.height, imageSize.width); transform = CGAffineTransformScale(transform, -1.0, 1.0); transform = CGAffineTransformRotate(transform, 3.0 * M_PI / 2.0); break; case UIImageOrientationLeft: //EXIF = 6 boundHeight = bounds.size.height; bounds.size.height = bounds.size.width; bounds.size.width = boundHeight; transform = CGAffineTransformMakeTranslation(0.0, imageSize.width); transform = CGAffineTransformRotate(transform, 3.0 * M_PI / 2.0); break; case UIImageOrientationRightMirrored: //EXIF = 7 boundHeight = bounds.size.height; bounds.size.height = bounds.size.width; bounds.size.width = boundHeight; transform = CGAffineTransformMakeScale(-1.0, 1.0); transform = CGAffineTransformRotate(transform, M_PI / 2.0); break; case UIImageOrientationRight: //EXIF = 8 boundHeight = bounds.size.height; bounds.size.height = bounds.size.width; bounds.size.width = boundHeight; transform = CGAffineTransformMakeTranslation(imageSize.height, 0.0); transform = CGAffineTransformRotate(transform, M_PI / 2.0); break; default: [NSException raise:NSInternalInconsistencyException format:@"Invalid image orientation"]; } UIGraphicsBeginImageContext(bounds.size); CGContextRef context = UIGraphicsGetCurrentContext(); if (orient == UIImageOrientationRight || orient == UIImageOrientationLeft) { CGContextScaleCTM(context, -scaleRatio, scaleRatio); CGContextTranslateCTM(context, -height, 0); } else { CGContextScaleCTM(context, scaleRatio, -scaleRatio); CGContextTranslateCTM(context, 0, -height); } CGContextConcatCTM(context, transform); CGContextDrawImage(UIGraphicsGetCurrentContext(), CGRectMake(0, 0, width, height), imgRef); UIImage *imageCopy = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return imageCopy; }
Статью можно найти в службе поддержки Apple по адресу: http://discussions.apple.com/message.jspa?messageID=7276709#7276709.
источник
Ответы Шафали и JRV расширены и включают в себя панорамирование и масштабирование:
#define MINIMUM_SCALE 0.5 #define MAXIMUM_SCALE 6.0 @property CGPoint translation; - (void)pan:(UIPanGestureRecognizer *)gesture { static CGPoint currentTranslation; static CGFloat currentScale = 0; if (gesture.state == UIGestureRecognizerStateBegan) { currentTranslation = _translation; currentScale = self.view.frame.size.width / self.view.bounds.size.width; } if (gesture.state == UIGestureRecognizerStateEnded || gesture.state == UIGestureRecognizerStateChanged) { CGPoint translation = [gesture translationInView:self.view]; _translation.x = translation.x + currentTranslation.x; _translation.y = translation.y + currentTranslation.y; CGAffineTransform transform1 = CGAffineTransformMakeTranslation(_translation.x , _translation.y); CGAffineTransform transform2 = CGAffineTransformMakeScale(currentScale, currentScale); CGAffineTransform transform = CGAffineTransformConcat(transform1, transform2); self.view.transform = transform; } } - (void)pinch:(UIPinchGestureRecognizer *)gesture { if (gesture.state == UIGestureRecognizerStateEnded || gesture.state == UIGestureRecognizerStateChanged) { // NSLog(@"gesture.scale = %f", gesture.scale); CGFloat currentScale = self.view.frame.size.width / self.view.bounds.size.width; CGFloat newScale = currentScale * gesture.scale; if (newScale < MINIMUM_SCALE) { newScale = MINIMUM_SCALE; } if (newScale > MAXIMUM_SCALE) { newScale = MAXIMUM_SCALE; } CGAffineTransform transform1 = CGAffineTransformMakeTranslation(_translation.x, _translation.y); CGAffineTransform transform2 = CGAffineTransformMakeScale(newScale, newScale); CGAffineTransform transform = CGAffineTransformConcat(transform1, transform2); self.view.transform = transform; gesture.scale = 1; } }
источник
Самый простой способ сделать это, если все, что вам нужно, - это масштабирование щипком, - это разместить изображение внутри
UIWebView
(напишите небольшой объем кода оболочки html, сделайте ссылку на свое изображение, и в основном все готово). Более сложный способ сделать это - использоватьtouchesBegan
,touchesMoved
иtouchesEnded
отслеживать пальцы пользователя, и соответствующим образом настраивать свойство преобразования вашего представления.источник
Имейте в виду, что вы не хотите увеличивать / уменьшать масштаб UIImage. Вместо этого попробуйте увеличить / уменьшить масштаб представления, который содержит контроллер представления UIImage.
Я нашел решение этой проблемы. Взгляните на мой код:
@IBAction func scaleImage(sender: UIPinchGestureRecognizer) { self.view.transform = CGAffineTransformScale(self.view.transform, sender.scale, sender.scale) sender.scale = 1 } override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. view.backgroundColor = UIColor.blackColor() }
NB: не забудьте подключить PinchGestureRecognizer.
источник