2011-02-28 83 views
0

我需要模擬照片庫效果。照片庫功能

我有uiimageview,我需要放大和縮小,規模和 - 如果我雙抽頭(或震動了iPad的 - 我想要的圖像返回到它的實際大小

我嘗試了很多,但所有可用的例子是越野車和不完整的,我不希望使用uiwebview

任何建議,請

這裏是鑑於代碼

做負載 :?

holderView = [[UIView alloc] initWithFrame:CGRectMake(0,0,self.view.bounds.size.width,self.view.bounds.size.height)]; 


    imageview = [[UIImageView alloc] initWithFrame:[holderView frame]]; 
    [imageview setImage:myimage]; 
    imageview.contentMode = UIViewContentModeScaleAspectFit; 
    //holderView.contentMode = UIViewContentModeScaleAspectFit ; 
    [holderView addSubview:imageview]; 

    UIPinchGestureRecognizer *pinchRecognizer = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(scale:)]; 
    [pinchRecognizer setDelegate:self]; 
    [holderView addGestureRecognizer:pinchRecognizer]; 

    UIRotationGestureRecognizer *rotationRecognizer = [[UIRotationGestureRecognizer alloc] initWithTarget:self action:@selector(rotate:)]; 
    [rotationRecognizer setDelegate:self]; 
    [holderView addGestureRecognizer:rotationRecognizer]; 

    UIPanGestureRecognizer *panRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(move:)]; 
    [panRecognizer setMinimumNumberOfTouches:1]; 
    [panRecognizer setMaximumNumberOfTouches:1]; 
    [panRecognizer setDelegate:self]; 
    [holderView addGestureRecognizer:panRecognizer]; 

    UITapGestureRecognizer *tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapped:)]; 
    [tapRecognizer setNumberOfTapsRequired:1]; 
    [tapRecognizer setDelegate:self]; 
    [holderView addGestureRecognizer:tapRecognizer]; 

和下面是我使用的功能

-(void)scale:(id)sender { 

    [self.view bringSubviewToFront:[(UIPinchGestureRecognizer*)sender view]]; 

    if(zooming) 
    { 
     if([(UIPinchGestureRecognizer*)sender state] == UIGestureRecognizerStateEnded) { 

      lastScale = 1.0; 
      return; 
     } 

     CGFloat scale = 1.0 - (lastScale - [(UIPinchGestureRecognizer*)sender scale]); 

     CGAffineTransform currentTransform = [(UIPinchGestureRecognizer*)sender view].transform; 
     CGAffineTransform newTransform = CGAffineTransformScale(currentTransform, scale, scale); 

     [[(UIPinchGestureRecognizer*)sender view] setTransform:newTransform]; 

     lastScale = [(UIPinchGestureRecognizer*)sender scale]; 

     OldTransform = newTransform; 
     OldCenter = [(UIPinchGestureRecognizer*)sender view].center; 

     Does_Panned = YES ; 
     Does_transformed = YES ; 


    } 
    else { 


    } 

} 

-(void)rotate:(id)sender { 
    if(zooming) 
    { 

     [self.view bringSubviewToFront:[(UIRotationGestureRecognizer*)sender view]]; 

     if([(UIRotationGestureRecognizer*)sender state] == UIGestureRecognizerStateEnded) { 

      lastRotation = 0.0; 
      return; 
     } 

     CGFloat rotation = 0.0 - (lastRotation - [(UIRotationGestureRecognizer*)sender rotation]); 

     CGAffineTransform currentTransform = [(UIPinchGestureRecognizer*)sender view].transform; 
     CGAffineTransform newTransform = CGAffineTransformRotate(currentTransform,rotation); 

     [[(UIRotationGestureRecognizer*)sender view] setTransform:newTransform]; 

     lastRotation = [(UIRotationGestureRecognizer*)sender rotation]; 
     OldTransform = newTransform ; 
     OldCenter = [(UIPinchGestureRecognizer*)sender view].center; 

     Does_Panned = YES ; 
     Does_transformed = YES ; 


    } 
} 

-(void)move:(id)sender { 

    if(zooming) 
    { 

     [[[(UITapGestureRecognizer*)sender view] layer] removeAllAnimations]; 

     [self.view bringSubviewToFront:[(UIPanGestureRecognizer*)sender view]]; 
     CGPoint translatedPoint = [(UIPanGestureRecognizer*)sender translationInView:self.view]; 

     if([(UIPanGestureRecognizer*)sender state] == UIGestureRecognizerStateBegan) { 

      firstX = [[sender view] center].x; 
      firstY = [[sender view] center].y; 
     } 

     translatedPoint = CGPointMake(firstX+translatedPoint.x, firstY+translatedPoint.y); 

     [[sender view] setCenter:translatedPoint]; 

     OldCenter = translatedPoint ; 

     Does_Panned = YES ; 
     Does_transformed = NO ; 

     if([(UIPanGestureRecognizer*)sender state] == UIGestureRecognizerStateEnded) { 

      CGFloat finalX = translatedPoint.x + (.35*[(UIPanGestureRecognizer*)sender velocityInView:self.view].x); 
      CGFloat finalY = translatedPoint.y + (.35*[(UIPanGestureRecognizer*)sender velocityInView:self.view].y); 

      if(UIDeviceOrientationIsPortrait([[UIDevice currentDevice] orientation])) { 

       if(finalX < 0) { 

        finalX = 0; 
       } 

       else if(finalX > 768) { 

        finalX = 768; 
       } 

       if(finalY < 0) { 

        finalY = 0; 
       } 

       else if(finalY > 1024) { 

        finalY = 1024; 
       } 
      } 

      else { 

       if(finalX < 0) { 

        finalX = 0; 
       } 

       else if(finalX > 1024) { 

        finalX = 768; 
       } 

       if(finalY < 0) { 

        finalY = 0; 
       } 

       else if(finalY > 768) { 

        finalY = 1024; 
       } 
      } 

      [UIView beginAnimations:nil context:NULL]; 
      //[UIView setAnimationDelay: 1.0]; 
      [UIView setAnimationDuration:.20]; 
      [UIView setAnimationCurve:UIViewAnimationCurveEaseOut]; 
      //[[sender view] setCenter:CGPointMake(finalX, finalY)]; 
      [UIView commitAnimations]; 
     } 
    } 
    else{ 

     if([(UIPanGestureRecognizer*)sender maximumNumberOfTouches] == 1) 
     { 



      UIPanGestureRecognizer* recognize = (UIPanGestureRecognizer*)sender; 
      //change the current window width and level 

      if([recognize state] == UIGestureRecognizerStateBegan) { 

       Bigen =[recognize translationInView:recognize.view ];// [[sender view] center]; 
       BeginX = Bigen.x; 
       BeginY = Bigen.y; 
      } 
      else if(

        ([recognize state] == UIGestureRecognizerStateChanged)|| 
        (recognize.state == UIGestureRecognizerStateEnded) ) 
      { 



       CGPoint translation = [recognize translationInView:recognize.view ]; 

       End = translation ; 

       EndX = End.x ; 
       EndY = End.y ; 

       double offsetw=0; 


       double offsetl=0; 

       if(EndX>BeginX) 
       { 
        offsetw=50*(EndX-BeginX); 

       } 
       else if(EndX<BeginX) 
       { 
        offsetw=50*(EndX-BeginX); 

       } 
       else 
       { 
        offsetw=0; 
       } 


       if(EndY>BeginY) 
       { 
        offsetl=50*(EndY-BeginY); 
       } 
       else if(EndY<BeginY) 
       { 
        offsetl=50*(EndY-BeginY); 
       } 
       else 
       { 
        offsetl=0; 
       } 


       ChangeWW_Wl(offsetw, offsetl); 


       [self AddImage]; 

      } 
      //if([(UIPanGestureRecognizer*)sender state] == UIGestureRecognizerStateEnded) { 

      /* CGPoint translatedPoint = [(UIPanGestureRecognizer*)sender translationInView:self.view]; 

      EndX = translatedPoint.x; 
      EndY = translatedPoint.y;*/ 
      //} 




     } 



    } 
} 

(void)tapped:(id)sender { 
    if(zooming) 
    { 

     [[[(UITapGestureRecognizer*)sender view] layer] removeAllAnimations]; 
    } 
} 

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer { 

    return ![gestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]]; 
} 

如何更新它在晃動或雙擊

的圖像到原來的大小重新怎麼到這兒來的代碼不適當的縮放(第一次放大因子很大)

+0

我已經更新了我的問題,代碼和問題讓我知道如何更新它以在抖動或雙擊時將圖像重置爲原始大小 如何克服不適當的縮放(第一個放大因子很大時間 ) – Ali 2011-02-28 11:48:31

回答

0

您應該觀看WWDC2010的「設計帶有滾動視圖的應用程序」視頻,它會告訴您如何做到這一點ING。