在第一次缩放后,将UIView移动到UIScrollView不起作用

时间:2012-11-18 20:21:56

标签: ios uiscrollview uiimageview zoom catiledlayer

我正在尝试使用CATiledLayer和UIScrollView显示大而高质量的可缩放图像。我的代码基于iOS Large image downsizing sample code

我的UIScrollView的层次结构如下:

  • 的UIScrollView
    • UIImageView:表示大图像的第一个缩略图
    • Old 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;
}

感谢。

1 个答案:

答案 0 :(得分: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];
}