我正在尝试使用CATiledLayer和UIScrollView显示大而高质量的可缩放图像。我的代码基于iOS Large image downsizing sample code。
我的UIScrollView的层次结构如下:
我希望滚动视图中的图像变得可移动。
我尝试了在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 :(得分: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];
}