手势识别器未激活 - UIScrollView中的UIImageView

5

我已经看了一段时间的代码,仍然不明白它为什么不能工作。基本上: 1. 用户选择一个表视图单元格 2. 调用包含高分辨率图像或UIImage的UIScrollView。 3. 以下是调用的Map.m。

#import "Map.h"

#define ZOOM_VIEW_TAG 100
#define ZOOM_STEP 1.5


@interface Map (UtilityMethods)
- (CGRect)zoomRectForScale:(float)scale withCenter:(CGPoint)center;
@end


@implementation Map

@synthesize imageScrollView, imageView;

- (void)loadView {
    NSLog(@"beginning of loadView in map.m");
    [super loadView];

    // set the tag for the image view
    [imageView setTag:ZOOM_VIEW_TAG];
    imageScrollView.scrollEnabled = NO;

    // add gesture recognizers to the image view
    UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTap:)];
    UITapGestureRecognizer *doubleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleDoubleTap:)];
    UITapGestureRecognizer *twoFingerTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTwoFingerTap:)];

    [doubleTap setNumberOfTapsRequired:2];
    [twoFingerTap setNumberOfTouchesRequired:2];

    [imageView addGestureRecognizer:singleTap];
    [imageView addGestureRecognizer:doubleTap];
    [imageView addGestureRecognizer:twoFingerTap];

    [singleTap release];
    [doubleTap release];
    [twoFingerTap release];

    // calculate minimum scale to perfectly fit image width, and begin at that scale
    float minimumScale = [imageScrollView frame].size.width  / [imageView frame].size.width;
    [imageScrollView setMinimumZoomScale:minimumScale];
    [imageScrollView setZoomScale:minimumScale];
}


- (void)viewDidUnload {
    self.imageScrollView = nil;
    self.imageView = nil;
}


- (void)dealloc {
    [imageScrollView release];
    [imageView release];
    [super dealloc];
}

#pragma mark UIScrollViewDelegate methods

- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView {
    return [imageScrollView viewWithTag:ZOOM_VIEW_TAG];
}

/************************************** NOTE **************************************/
/* The following delegate method works around a known bug in zoomToRect:animated: */
/* In the next release after 3.0 this workaround will no longer be necessary      */
/**********************************************************************************/
- (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(float)scale {
    [scrollView setZoomScale:scale+0.01 animated:NO];
    [scrollView setZoomScale:scale animated:NO];
}

#pragma mark TapDetectingImageViewDelegate methods

- (void)handleSingleTap:(UIGestureRecognizer *)gestureRecognizer {
    // single tap does nothing for now
}

- (void)handleDoubleTap:(UIGestureRecognizer *)gestureRecognizer {
    // double tap zooms in
    NSLog(@"beginning handleDoubleTap to zoom");
    float newScale = [imageScrollView zoomScale] * ZOOM_STEP;
    CGRect zoomRect = [self zoomRectForScale:newScale withCenter:[gestureRecognizer locationInView:gestureRecognizer.view]];
    [imageScrollView zoomToRect:zoomRect animated:YES];
}

- (void)handleTwoFingerTap:(UIGestureRecognizer *)gestureRecognizer {
    // two-finger tap zooms out
    float newScale = [imageScrollView zoomScale] / ZOOM_STEP;
    CGRect zoomRect = [self zoomRectForScale:newScale withCenter:[gestureRecognizer locationInView:gestureRecognizer.view]];
    [imageScrollView zoomToRect:zoomRect animated:YES];
}

#pragma mark Utility methods

- (CGRect)zoomRectForScale:(float)scale withCenter:(CGPoint)center {

    CGRect zoomRect;

    // the zoom rect is in the content view's coordinates. 
    //    At a zoom scale of 1.0, it would be the size of the imageScrollView's bounds.
    //    As the zoom scale decreases, so more content is visible, the size of the rect grows.
    zoomRect.size.height = [imageScrollView frame].size.height / scale;
    zoomRect.size.width  = [imageScrollView frame].size.width  / scale;

    // choose an origin so as to get the right center.
    zoomRect.origin.x    = center.x - (zoomRect.size.width  / 2.0);
    zoomRect.origin.y    = center.y - (zoomRect.size.height / 2.0);

    return zoomRect;
}

@end

手势在图像中没有被识别出来?请帮忙。
1个回答

19

UIImageView 默认情况下禁用触摸和多点触控交互。要检测其上的触摸事件,需要手动启用它。因此,若要使手势识别器生效,需要在 loadView 中添加以下代码。

请尝试将以下代码添加到您的项目中 -

[imageView setUserInteractionEnabled:YES];
[imageView setMultipleTouchEnabled:YES];

你可以在XCode的xib文件中启用这个特殊操作。为此,请转到包含imageViewxib,并检查提到user interaction/multi touch的复选框。

输入图片描述


所以它能够获取事件,但无法通过缩放来响应它们。它还显示: - Melanie Ann Tarr
它能够检测手势,但没有对图像进行缩放、旋转等任何操作。当我在图像上按Ctrl键单击时,它还会显示:忽略调用[UIPanGestureRecognizer setTranslation:inView:],因为手势识别器未激活。 - Melanie Ann Tarr
2
你的问题是 - uiimageview上的手势无法识别,我认为我已经回答了。如果你有其他疑问,我建议你写另一个问题。这样就不会有关于问题和答案的混淆了。 - Srikar Appalaraju

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接