0
votes

I want to zoom out image to original size after scroll slider. I'm using REPagedScrollView library to implement slider. I have 5 images in slider. Now zoom-in 1st image and then immediately scroll slider to view 2nd image. Then go back to view 1st image. 1st image not zooming out. That image was still in zoom - in mode. How can i solved this.

Thanks in advance.

I'm using this below code.

-(void)slideShow
{
    [scrollView removeFromSuperview];
    scrollView = [[REPagedScrollView alloc] initWithFrame:self.scrollVw.bounds];
    scrollView.delegate=self;
    scrollView.pageControl.pageIndicatorTintColor=[UIColor clearColor];
    scrollView.pageControl.currentPageIndicatorTintColor=[UIColor clearColor];
    current_page=0;

    for(int i=0;i<[self.PhotoImgArr count];i++){


        // Image view
        image_scroll = [[UIScrollView alloc] initWithFrame:CGRectMake(0,0,self.scrollVw.frame.size.width,self.scrollVw.frame.size.height)];
        self.image_view = [[AsyncImageView alloc] initWithFrame:CGRectMake(0,0, image_scroll.frame.size.width, image_scroll.frame.size.height)];

        self.image_view.backgroundColor=[UIColor clearColor];
     //   self.image_view.contentMode = UIViewContentModeScaleAspectFit;
        self.image_view.clipsToBounds = true;
        self.image_view.userInteractionEnabled = YES;

        //self.image_view.image=[UIImage imageNamed:@"Stars"];
        self.image_view.imageURL =[NSURL URLWithString:[self.PhotoImgArr objectAtIndex:i]];
        doubleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleDoubleTap:)];
        [doubleTap setNumberOfTapsRequired:2];

        [self.image_view addGestureRecognizer:doubleTap];
//        twoFingerPinch = [[UIPinchGestureRecognizer alloc]
//                          initWithTarget:self
//                          action:@selector(twoFingerPinch:)];
//        [self.image_view addGestureRecognizer:twoFingerPinch];
        [image_scroll setDelegate:self];
        [image_scroll setShowsHorizontalScrollIndicator:NO];
        [image_scroll setShowsVerticalScrollIndicator:NO];

        image_scroll.tag=i+1;
        // image_scroll.backgroundColor=[UIColor purpleColor];
        image_scroll.autoresizingMask=UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight;
        self.image_view.autoresizingMask=UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight;

        image_scroll.contentSize = CGSizeMake(self.image_view.bounds.size.width-500, self.image_view.bounds.size.height-300);
        image_scroll.decelerationRate = UIScrollViewDecelerationRateFast;
        [image_scroll setMaximumZoomScale:4.0];
       // image_scroll.minimumZoomScale = 1.0;
        [image_scroll setZoomScale:[image_scroll minimumZoomScale]];
        //image_scroll.zoomScale = 1.0;
        [image_scroll addSubview:self.image_view];

        [scrollView addPage:image_scroll];

    }
    scrollView.autoresizingMask=UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight;
    scrollView.tag=0;
    [self.scrollVw addSubview:scrollView];

    [scrollView scrollToPageWithIndex:self.selected_index animated:YES];
}

- (void)twoFingerPinch:(UIPinchGestureRecognizer *)recognizer
{
    NSLog(@"twoFingerPinch");
    float newScale = [image_scroll zoomScale] / 2.0;
    CGRect zoomRect = [self zoomRectForScale:newScale withCenter:[recognizer locationInView:recognizer.view]];
    [image_scroll zoomToRect:zoomRect animated:YES];
}

- (void)handleDoubleTap:(UIGestureRecognizer *)gestureRecognizer {
    // zoom in
    NSLog(@"handleDoubleTap");
     UIScrollView *imageScroll = (UIScrollView *)[self.view viewWithTag:self.selected_index+1];

    float newScale = [imageScroll zoomScale] * 2.0;

    if (newScale > imageScroll.maximumZoomScale){
        newScale = imageScroll.minimumZoomScale;
        CGRect zoomRect = [self zoomRectForScale:newScale withCenter:[gestureRecognizer locationInView:gestureRecognizer.view]];

        [imageScroll zoomToRect:zoomRect animated:YES];

    }
    else{

        newScale = imageScroll.maximumZoomScale;
        CGRect zoomRect = [self zoomRectForScale:newScale withCenter:[gestureRecognizer locationInView:gestureRecognizer.view]];

        [imageScroll zoomToRect:zoomRect animated:YES];
    }
}

#pragma mark Utility methods

- (CGRect)zoomRectForScale:(float)scale withCenter:(CGPoint)center {
    CGRect zoomRect;

    // the zoom rect is in the content view's coordinates.
    //    At a zoom scale of 1.0, it would be the size of the imageScrollView's bounds.
    //    As the zoom scale decreases, so more content is visible, the size of the rect grows.
    zoomRect.size.height = [image_scroll frame].size.height / scale;
    zoomRect.size.width  = [image_scroll frame].size.width  / scale;

    // choose an origin so as to get the right center.
    zoomRect.origin.x    = center.x - (zoomRect.size.width  / 2.0);
    zoomRect.origin.y    = center.y - (zoomRect.size.height / 2.0);

    return zoomRect;
}

- (void)scrollViewDidScroll:(UIScrollView *)scrollView1
{
    UIScrollView *imageScroll = (UIScrollView *)[self.view viewWithTag:self.selected_index+1];
    if(scrollView1.tag ==0){
        CGFloat pageWidth = scrollView1.frame.size.width;
        current_page = floor((scrollView1.contentOffset.x - pageWidth / 2.0) / pageWidth) + 1;
        self.selected_index=current_page;
        self.lblHeader.text=[NSString stringWithFormat:@"%ld of %lu",self.selected_index+1,(unsigned long)[self.PhotoImgArr count]];

    }
    else
    {
        CGFloat offsetX = (imageScroll.bounds.size.width > imageScroll.contentSize.width)?
        (imageScroll.bounds.size.width - imageScroll.contentSize.width) * 0.5 : 0.0;
        CGFloat offsetY = (imageScroll.bounds.size.height > imageScroll.contentSize.height)?
        (imageScroll.bounds.size.height - imageScroll.contentSize.height) * 0.5 : 0.0;
        [scrollView1.subviews objectAtIndex:0].center = CGPointMake(imageScroll.contentSize.width * 0.5 + offsetX,imageScroll.contentSize.height * 0.5 + offsetY);
    }

}

-(UIView *) viewForZoomingInScrollView:(UIScrollView *)scrollView1
{
    if([scrollView1.subviews count]>0){
        return [scrollView1.subviews objectAtIndex:0];

    }
    return nil;
}
1

1 Answers

2
votes

ok first of all, don't use REPagedScrollView instead u can set the pages to scrollview by changing the view's x position, and it is useful for your zooming, if u use REPagedScrollView there are some complications that u can't get the subview's as scrollview, instead u get a UIView instance

Better u use normal UIScrollView it is good for your case, and also set the UIPageControl as they are doing in REPagedScrollView as separately in view controller's view.

first set the pages like below

- (void)viewDidLoad {
 [super viewDidLoad];
 // Do any additional setup after loading the view, typically from a nib.
 _scrollPager = [[UIScrollView alloc] initWithFrame:self.view.bounds];
 _scrollPager.delegate=self;
 _scrollPager.pagingEnabled = YES;
 _current_page=0;
 _prev_next_index = 0;

 _PhotoImgArr = [[NSMutableArray alloc] initWithObjects:@"00.jpg",@"01.jpg",@"02.jpg",@"03.jpg", nil];
 CGSize totalContentSize = CGSizeMake(self.view.bounds.size.width  [_PhotoImgArr count], self.view.bounds.size.height);
 _scrollPager.contentSize = totalContentSize;
 [self.view addSubview:_scrollPager];
 [self setUpPager];
}

- (void)setUpPager
{
       for(int i=0;i<[self.PhotoImgArr count];i++)
   {
    // Image view
    UIScrollView  *image_scroll = [[UIScrollView alloc] initWithFrame:CGRectMake(i * self.view.bounds.size.width, 0, self.view.bounds.size.width, self.view.bounds.size.height)];
    UIImageView   *image_view = [[UIImageView alloc] initWithFrame:image_scroll.bounds];
    image_view.backgroundColor=[UIColor clearColor];
    image_view.clipsToBounds = true;
    image_view.image = [UIImage imageNamed:_PhotoImgArr[i]];

    UITapGestureRecognizer *doubleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleDoubleTap:)];
    [doubleTap setNumberOfTapsRequired:2];
    [image_scroll setDelegate:self];
    [image_scroll setShowsHorizontalScrollIndicator:NO];
    [image_scroll setShowsVerticalScrollIndicator:NO];

    image_scroll.tag=i;
    image_scroll.autoresizingMask=UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight;
    image_view.autoresizingMask=UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight;

    image_scroll.contentSize = image_scroll.bounds.size;
    image_scroll.decelerationRate = UIScrollViewDecelerationRateFast;

    image_scroll.minimumZoomScale = 1.0f;
    image_scroll.maximumZoomScale = 3.0f;

    [image_scroll addSubview:image_view];
    [image_scroll addGestureRecognizer:doubleTap];
    [_scrollPager addSubview:image_scroll];
   }
   _scrollPager.autoresizingMask=UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight;
   _scrollPager.tag=100;
 }

Handle the double tap action like below in same view controller

- (void)handleDoubleTap:(UIGestureRecognizer *)gestureRecognizer
 {
  // zoom in
   NSLog(@"handleDoubleTap");
   if(gestureRecognizer.view == _scrollPager) return;
   UIScrollView *doubleTapScroll = [self getImageScroller];
   if(doubleTapScroll)
   {
      //zoom
      CGPoint pointInView = [gestureRecognizer locationInView:self.view];

      CGFloat newZoomScale = doubleTapScroll.zoomScale * 1.5f;

      newZoomScale = MIN(newZoomScale, doubleTapScroll.maximumZoomScale);
      CGRect rectToZoomTo = CGRectZero;
      CGFloat currentZoomScale = doubleTapScroll.zoomScale;
      if(currentZoomScale == 1.0f)
      {
         rectToZoomTo = [self zoomRectForScrollView:doubleTapScroll withScale:newZoomScale withCenter:pointInView];//CGRectMake(x, y, w, h);
      }
      else if (currentZoomScale >= 1.0f)
      {
          rectToZoomTo = [self zoomRectForScrollView:doubleTapScroll withScale:1 withCenter:self.view.center];
      }
      [doubleTapScroll zoomToRect:rectToZoomTo animated:YES];
   }
 }

and one thing for scrollview u don't need to handle pinch, it will automatillcay handled for zooming.

finally handling of the zoom

#pragma mark Utility methods
- (CGRect)zoomRectForScrollView:(UIScrollView *)scrollView withScale:(float)scale withCenter:(CGPoint)center
{
   CGRect zoomRect;

   zoomRect.size.height = scrollView.frame.size.height / scale;
   zoomRect.size.width  = scrollView.frame.size.width  / scale;

   zoomRect.origin.x = center.x - (zoomRect.size.width  / 2.0);
   zoomRect.origin.y = center.y - (zoomRect.size.height / 2.0);
   return zoomRect;
}

- (void)scrollViewDidScroll:(UIScrollView *)scrollView1
{
}

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
  if(scrollView == _scrollPager)
  {
     float currentPage = scrollView.contentOffset.x /scrollView.frame.size.width;
     if(currentPage != _current_page)
     {
         _prev_next_index = _current_page;
         _current_page = ceil(currentPage);
         [self resetScrollerAtViewIndex:_prev_next_index];
     }
  }
}


-(UIView *) viewForZoomingInScrollView:(UIScrollView *)scrollView1
{
  if(scrollView1 == _scrollPager)
      return nil;
  else
  {
      UIScrollView  *image_scroll = [self getImageScroller];
      if(image_scroll)
          if([image_scroll.subviews count]>0)
          {
              return [image_scroll.subviews objectAtIndex:0];
          }
   }
   return nil;
}

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

- (UIScrollView *)getImageScroller
{
  return  [_scrollPager viewWithTag:_current_page];
}

- (void)resetScrollerAtViewIndex:(NSInteger)index
{

   UIScrollView *scrollView = [_scrollPager viewWithTag:index];
   CGFloat zoomScale = scrollView.zoomScale;
  if(zoomScale != 1.0)
      [scrollView setZoomScale:1 animated:YES];
}

Edit for zoom out when return to previous or next page just replace the below method

- (void)resetScrollerAtViewIndex:(NSInteger)index
{
  //CGFloat zoomScale = 1.0;
  UIScrollView *scrollView = [_scrollPager viewWithTag:index];
  CGRect rectToZoomTo = CGRectZero;

  rectToZoomTo = [self zoomRectForScrollView:scrollView withScale:1 withCenter:self.view.center];
  [scrollView zoomToRect:self.view.bounds animated:YES];
  [scrollView setContentOffset:CGPointZero];
  [scrollView setContentSize:self.view.bounds.size];
}