2013-06-01 2 views
15

Я использую раскадровку (iOS 6.0), чтобы создать просмотрщик фотогалерей для моего приложения. Это как мой imageViewController устанавливается в раскадровке:Pinch To Zoom Эффект на UIImageView внутри scrollView?

enter image description here

Я удостоверился, чтобы включить userInteraction и несколько штрихов на обоих ImageView и Scrollview. То, что я хочу сделать, - это то, что я хочу изменить масштаб изображения (максимальный масштаб 3) и иметь возможность передвигаться. Тем не менее, это то, что я имею в настоящее время, несмотря на то, что жест щепотки обнаружен, масштаб не меняется.

- (IBAction)imagePinched:(id)sender { 

if (pinchRecognizer.state == UIGestureRecognizerStateEnded || pinchRecognizer.state == UIGestureRecognizerStateChanged) { 

    NSLog(@"gesture.scale = %f", pinchRecognizer.scale); 

    CGFloat currentScale = self.fullScreenView.frame.size.width/self.fullScreenView.bounds.size.width; 
    CGFloat newScale = currentScale * pinchRecognizer.scale; 

    if (newScale < 1) { 
     newScale = 1; 
    } 
    if (newScale > 3) { 
     newScale = 3; 
    } 

    CGAffineTransform transform = CGAffineTransformMakeScale(newScale, newScale); 
     self.fullScreenView.transform = transform; 
     pinchRecognizer.scale = 1; 
    } 

} 

Большинство вопросов и обучающие онлайн дело с программным создания мнения и делать это, но меньше кода, тем лучше (в моих глазах). Каков наилучший способ заставить это работать с раскадрой? Заранее спасибо!!!


ОБНОВЛЕНО:

Вот мой полный код .m файл:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    //Assign an image to this controller's imageView 
    fullScreenView.image = [UIImage imageNamed:imageString]; 

    //Allows single and double tap to work 
    [singleTapRecognizer requireGestureRecognizerToFail: doubleTapRecognizer]; 
} 

- (IBAction)imageTapped:(id)sender { 

    NSLog(@"Image Tapped."); 

    //On tap, fade out viewController like the twitter.app 
    [self dismissViewControllerAnimated:YES completion:nil]; 
} 

- (IBAction)imageDoubleTapped:(id)sender { 

    NSLog(@"Image Double Tapped."); 

    //On double tap zoom into imageView to fill in the screen. 
    [fullScreenView setContentMode:UIViewContentModeScaleAspectFill]; 
} 

- (IBAction)imagePinched:(id)sender { 

    if (pinchRecognizer.state == UIGestureRecognizerStateEnded || pinchRecognizer.state == UIGestureRecognizerStateChanged) { 

     NSLog(@"gesture.scale = %f", pinchRecognizer.scale); 

     CGFloat currentScale = self.fullScreenView.frame.size.width/self.fullScreenView.bounds.size.width; 
     CGFloat newScale = currentScale * pinchRecognizer.scale; 

     if (newScale < 1) { 
      newScale = 1; 
     } 
     if (newScale > 3) { 
      newScale = 3; 
     } 

     CGAffineTransform transform = CGAffineTransformMakeScale(newScale, newScale); 
     self.fullScreenView.transform = transform; 
     pinchRecognizer.scale = 1; 
    } 
} 

- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView 
{ 
    return self.fullScreenView; 
} 


-(void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(float)scale { 

} 

- (void)didReceiveMemoryWarning 
{ 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 

@end 
+1

Я решил свои сомнения, используя ваш вопрос. Спасибо –

+0

у вас есть ответ? – YaBoiSandeep

ответ

0

Here как Apple, recomends делать то, что вы хотите сделать. Я использовал код, предоставленный Apple, и он работал как шарм! Если вы хотите оптимизировать управление памятью, вы можете использовать iCarousel (сделанные nicklockwood), которые имеют управление кешем для неиспользуемых просмотров dealloc!

+0

Спасибо lucaslt89. Я обязательно посмотрю, как снова появится сайт разработчика (в настоящее время появляется сообщение «в обслуживании»). Это образец кода ScrollView Suite случайно? – KingPolygon

+0

Несомненно, вы можете скачать все примеры WWDC 2010 здесь: [link] (http://connect.apple.com/cgi-bin/WebObjects/MemberSite.woa/wa/getSoftware?wosid=CB3fDiRN7qTm2k83u941h1gXUgA&fileID=26713&code= y & source = x) – lucaslt89

+0

Можете ли вы указать номер года и сеанса. Ссылки, которые вы опубликовали, не работают. –

2

Первый шаг - убедиться, что ваши представления выполнены правильно. Например, в файле .m

@interface myRootViewController() <.., UIGestureRecognizerDelegate, UIScrollViewDelegate, ...> 

Из документации, убедитесь, что у вас есть это реализовано:

класс

UIScrollView может иметь делегат, который должен принять протокол UIScrollViewDelegate. Для масштабирования и панорамирования для работы делегат должен реализовать как viewForZoomingInScrollView: и scrollViewDidEndZooming: withView: atScale:; кроме того, максимальная (максимальная шкала ZoomScale) и минимальная шкала (minimumZoomScale) должны быть разными.

- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView 
{ 
    return self.fullScreenView; 
} 


-(void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(float)scale 
{} 

Метод scrollViewDidEndZooming теперь может оставаться пустым. Если вы уже это сделали или все еще не работаете, отправьте больше своего кода, а затем более легко помочь более конкретно.

+0

Я добавил Делегаты в ImageViewController и добавили эти два метода в мой код, но он все еще не вызывает эффект масштабирования. Я обновил свой код с большим количеством кода. Благодарим за терпение и помощь! – KingPolygon

+0

Было бы полезно узнать, вызваны ли эти методы scrollView, когда распознает распознаватель жестов – ceekay

1

Вам необходимо сделать то, что предложил Вади, но также установить, что setMinimumZoomScale отличается от setMaximumZoomScale. По умолчанию они равны 1.0f.

После этого UIImageView должен быть pinchable

33

Я думаю, что лучшим решением в компании Apple документации

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

{ 

    return self.imageView; 

} 
- (void)viewDidLoad { 

    [super viewDidLoad]; 

    self.scrollView.minimumZoomScale=0.5; 

    self.scrollView.maximumZoomScale=6.0; 

    self.scrollView.contentSize=CGSizeMake(1280, 960); 

    self.scrollView.delegate=self; 

} 

Check Apple Documentation

0

Я создал полностью рабочую демо-приложение (сходный по природе умолчанию Facebook, фотогалерею), которая демонстрирует щепотку, чтобы увеличить масштаб изображения, вложенного в прокрутку с помощью AutoLayout и раскадровки. Посмотреть мой проект здесь: http://rexstjohn.com/facebook-like-ios-photo-modal-gallery-swipe-gestures/.

Он также включает в себя асинхронную загрузку фотографий через MKNetworkKit и запись на основе жестов через фотогалерею. Наслаждайтесь, и я надеюсь, что это спасет все время, пытаясь понять это, потому что это несколько раздражает.

0

Я создал класс для обработки масштабирования UIImageViews, аналогичного Instagram. Мог бы быть тем, что вы ищете, иначе вы можете посмотреть, как я его достиг. https://github.com/twomedia/TMImageZoom