2011-08-11 6 views
4

reeder 앱 제작자가 pinch-to-expand 사진을 전체 화면으로 사용하여 iphone/ipad 앱에서하는 것과 똑같은 작업을 수행하는 방법을 찾고 있습니다.Reeder 앱처럼 전체 화면으로 사진 찍기 pinch

핀치가 열린 상태에서 전체 화면보기로 전환하려는 표 셀에 uiimageview가 있거나 두 번 살짝 누르십시오. 비슷한 애니메이션을 사용하고 싶습니다.

팁을 보내 주시면 감사하겠습니다.

답변

13

좋아요. 나는이 문제를 직접 해결할 수있었습니다. 전환 방법을 사용하는 방법을 잘 모르겠지만 동일한 위치에서보기를 복제 한 다음이를 폭파해야했습니다.

http://screencast.com/t/MLTuGkIYh

그래서 큰 이미지를 포함하는 내 셀에 둘 다 핀치 및 탭 제스처 인식기를 연결.

self.imageView.contentMode = UIViewContentModeScaleAspectFit; 
    self.imageView.autoresizingMask = (UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight); 
    UIPinchGestureRecognizer *pinchGesture = [[[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(handlePinchGesture:)] autorelease]; 
    UITapGestureRecognizer *tapGesture = [[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)] autorelease]; 
    tapGesture.numberOfTapsRequired = 2; 
    self.imageView.userInteractionEnabled = YES; 
    self.imageView.multipleTouchEnabled = YES; 
    [self.imageView addGestureRecognizer:pinchGesture]; 
    [self.imageView addGestureRecognizer:tapGesture]; 
    [cell.contentView addSubview:self.imageView]; 

다음은 나머지 코드입니다. 기본적으로 나는 제스처를 인식했을 때 (그리고 집어 넣을 때, 완료되었는지 확인) 동일한 위치 (convertRect 물건을 통해 얻음)에 복제보기를 배치 한 다음 프레임과 배경색을 애니메이션으로 만듭니다. 그것에서 돌아 왔을 때, 나는 반대를한다. 확대하면서 실제 크기를 조정하려면 사진을 원하는 경우

- (void)handlePinchGesture:(id)sender 
{ 
    if (((UIPinchGestureRecognizer *)sender).state == UIGestureRecognizerStateEnded) { 
     if(((UIPinchGestureRecognizer *)sender).view == self.imageView) 
     { 
      if (((UIPinchGestureRecognizer *)sender).scale > 1) { 
       [self showFloorPlanFullScreen]; 
      } 
     } else { 
      if (((UIPinchGestureRecognizer *)sender).scale < 1) { 
       [self closeFloorPlanFullScreen]; 
      } 
     } 
    } 
} 
- (void)handleTap:(id)sender 
{ 
    if (((UITapGestureRecognizer *)sender).view == self.imageView) { 
     [self showFloorPlanFullScreen]; 
    } else { 
     [self closeFloorPlanFullScreen]; 
    } 
} 

- (void)showFloorPlanFullScreen 
{ 
    CGRect newRect = [self.imageView convertRect:self.imageView.bounds toView:[self.splitViewController.view superview]]; 
    UIImage *image = self.imageView.image; 
    self.fullScreenImageView = [[[UIImageView alloc] initWithImage:image] autorelease]; 

    UIPinchGestureRecognizer *pinchGesture = [[[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(handlePinchGesture:)] autorelease]; 
    UITapGestureRecognizer *tapGesture = [[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)] autorelease]; 
    tapGesture.numberOfTapsRequired = 2; 
    self.fullScreenImageView.userInteractionEnabled = YES; 
    self.fullScreenImageView.multipleTouchEnabled = YES; 
    [self.fullScreenImageView addGestureRecognizer:pinchGesture]; 
    [self.fullScreenImageView addGestureRecognizer:tapGesture]; 

    self.fullScreenImageView.contentMode = UIViewContentModeScaleAspectFit; 
    self.fullScreenImageView.frame = newRect; 
    self.fullScreenImageView.backgroundColor = [UIColor clearColor]; 
    [[self.splitViewController.view superview] addSubview:self.fullScreenImageView]; 

    CGRect splitViewRect = self.splitViewController.view.frame; 
    [UIView animateWithDuration:0.5 animations:^{ 
     self.fullScreenImageView.backgroundColor = [UIColor blackColor]; 
     self.fullScreenImageView.frame = splitViewRect; 
    }]; 
} 


- (void)closeFloorPlanFullScreen 
{ 
    CGRect newRect = [self.imageView convertRect:self.imageView.bounds toView:[self.splitViewController.view superview]]; 
    [UIView animateWithDuration:0.5 
        animations:^{ 
     self.fullScreenImageView.backgroundColor = [UIColor clearColor]; 
     self.fullScreenImageView.frame = newRect; 
        } 
        completion:^(BOOL finished) { 
         [self.fullScreenImageView removeFromSuperview]; 
         self.fullScreenImageView = nil; 
        }]; 
} 

, 나는 곤란이 시작되는 즉시 중복보기를 추가하는 것이 좋습니다 (그리고만큼의 스케일링 등> 1) 다음 변환 적용됩니다 :

CGAffineTransform myTransformation = CGAffineTransformMakeScale(((UIPinchGestureRecognizer *)sender).scale, ((UIPinchGestureRecognizer *)sender).scale); 
self.fullScreenImageView.transform = myTransformation; 

꼬집음이 끝나면 검은 색으로 페이드되고 프레임이 조정됩니다. 나는이 방법을 사용하지 않기로 결정했는데 핀치를 인식하거나 더블 탭만으로 충분할 것이라고 생각합니다.

+0

멋지다! 당신은 당신 자신의 질문에 대답했습니다. 그것을 표시하십시오, 다른 사람들이 도움이 될 것입니다 .. –

+0

네. 2 시간을 기다려야했다. :) –

+0

당신은 선생님, 학자와 신사입니다. – MrTristan

0

UIControl에 UIImageView를 포함하고 IBAction을 UIControl 이벤트에 연결해야합니다.

0

이미지보기에서 UIPinchGestureRecognizer을 사용하여 이미지보기를 전체 크기로 날려 버리는 핀치 및 UIView 전환 방법을 인식합니다.

+0

UIView 전환 방법은 무엇을 의미합니까? –

+0

@Bob : 이름이 "transition"으로 시작하는 UIView 클래스 메서드. 예 : [transitionWithView : duration : options : animations : completion :] (http://developer.apple.com/library/ios/documentation/uikit/reference/UIView_Class/UIView/UIView.html#//apple_ref/occ/) clm/UIView/transitionWithView : 기간 : 옵션 : 애니메이션 : 완료 :). – Jesper

+0

나는 아직도 어떻게 할 것인지 잘 모르겠다. 어떤예요? 따라서 테이블보기에서 사진의 작은 버전을 가지고 있다면 전체 화면을 표시하고 두 화면 사이를 전환 한 새로운보기를 만들 수 있습니까? 테이블이 분할 된 뷰에있는 경우, 새로 만든 전체 화면보기가 제대로 작동하려면 (수퍼바이저가 현명하게) 살아야합니까? –

관련 문제