2012-11-18 3 views
0

CATILEDLayer 및 UIScrollView를 사용하여 크고 고품질의 확대/축소 가능 이미지를 표시하려고합니다. 내 코드는 iOS Large image downsizing sample code을 기반으로합니다.처음으로 확대/축소 한 후에 UIScrollView로 UIView를 이동하면 작동하지 않습니다.

내있는 UIScrollView의 계층 구조가 같다 :

  • 있는 UIScrollView
    • 있는 UIImageView : 큰 이미지의 첫 번째 썸네일을 나타냅니다
    • 올드 TiledView
    • TiledView

스크롤보기에 이미지가 움직이기를 원합니다.

나는이 StackOverflow topic에서 찾은 것을 시도하고 작동합니다. 그러나 이미지를 처음으로 확대 한 후에는 이미지를 움직일 수 없게됩니다. 왜 그런지 몰라?

-(id)initWithFrame:(CGRect)frame image:(UIImage*)_image { 
    if((self = [super initWithFrame:frame])) {  
    // Set up the UIScrollView 
     // Piece of code 

     self.canCancelContentTouches = NO; 

     UIPanGestureRecognizer* panGesture = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(move:)]; 
     [panGesture setMinimumNumberOfTouches:1]; 
     [panGesture setMaximumNumberOfTouches:1]; 
     [panGesture setDelegate:self]; 
     [frontTiledView addGestureRecognizer:panGesture]; 
     frontTiledView.exclusiveTouch = YES; 

     UIPanGestureRecognizer* panGesture2 = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(move:)]; 
     [panGesture2 setMinimumNumberOfTouches:1]; 
     [panGesture2 setMaximumNumberOfTouches:1]; 
     [panGesture2 setDelegate:self]; 
     [backgroundImageView addGestureRecognizer:panGesture2]; 
     backgroundImageView.exclusiveTouch = YES; 

     UIPanGestureRecognizer* panGesture3 = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(move:)]; 
     [panGesture3 setMinimumNumberOfTouches:1]; 
     [panGesture3 setMaximumNumberOfTouches:1]; 
     [panGesture3 setDelegate:self]; 
     [backTiledView addGestureRecognizer:panGesture3]; 
     backTiledView.exclusiveTouch = YES; 
    } 
    return self; 
} 

- (void)move:(UIGestureRecognizer*)sender { 
    CGPoint translatedPoint = [(UIPanGestureRecognizer*)sender translationInView:frontTiledView]; 

    if([(UIPanGestureRecognizer*)sender state] == UIGestureRecognizerStateBegan) { 
     positionDeplacement = frontTiledView.center; 
    } 

    translatedPoint = CGPointMake(positionDeplacement.x+translatedPoint.x, positionDeplacement.y+translatedPoint.y); 
    frontTiledView.center = translatedPoint; 
    backTiledView.center = translatedPoint; 
    backgroundImageView.center = translatedPoint; 
} 

감사 :

여기 내 코드입니다.

+0

이 조금 혼란 :

여기 내 코드입니다. 당신은 동시에 그리고 똑같이 움직이기를 바라는 세 가지 견해를 가지고 있습니다. LargeImage 예제를로드했는데 문제없이 이미지를 이동하고 확대/축소 할 수 있습니다. 당신이하려고하는 것은 무엇이 다른가? – Daniel

+0

LargeImage 예제 scrollview에는 3 개의보기가 있습니다. 그래서 그것들을 동시에 동등하게 이동하려고합니다. 어떤 하위 뷰에서 팬 제스처를 적용합니까? – Seb

+0

코드를 사용하여 설명하는 것을 재현 할 수 없습니다. 왜 UIScrollView에 UIPanGestureRecognizer를 사용하고 싶은지 잘 모르겠습니다. 스크롤 뷰에는 패닝을위한 고유의 대리자 메소드가 있습니다. – Daniel

답변

0

내 문제에 대한 해결책을 찾았습니다. 난 그냥 scrollViewDidEndZooming 위임 방법으로 다시 동작을 추가해야하고 그것이 마치 마법처럼 작동합니다 :

- (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(float)scale { 
    // set the new scale factor for the TiledImageView 
    imageScale *=scale; 
    CGRect imageRect = CGRectMake(0.0f,0.0f,CGImageGetWidth(image.CGImage) * imageScale,CGImageGetHeight(image.CGImage) * imageScale); 

    // Create a new TiledImageView based on new frame and scaling. 
    frontTiledView = [[TiledImageView alloc] initWithFrame:imageRect image:image scale:imageScale]; 
    [self addSubview:frontTiledView]; 
    [frontTiledView release]; 

    if (imageRect.size.width < 320 || imageRect.size.height < 460) 
     [self initGestures]; 
} 

- (void)initGestures { 
    self.canCancelContentTouches = NO; 
    frontTiledView.exclusiveTouch = YES; 
    backgroundImageView.exclusiveTouch = YES; 
    backTiledView.exclusiveTouch = YES; 

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

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

    UIPanGestureRecognizer* panGesture3 = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(move:)]; 
    [panGesture3 setMinimumNumberOfTouches:1]; 
    [panGesture3 setMaximumNumberOfTouches:1]; 
    [panGesture3 setDelegate:self]; 
    [backTiledView addGestureRecognizer:panGesture3]; 
} 
관련 문제