水平UISwipeGestureRecognizer不适用于Small UIImageView

时间:2014-06-12 10:34:13

标签: ios objective-c uiimageview uigesturerecognizer

我正在尝试将UISwipeGestureRecognizer添加到位于我的UIViewController上的UIImageView,如果UIImageView的框架设置为屏幕边界,它可以正常工作。我需要更小的UIImageView,当我将框架设置为适当的尺寸时,它不再采用水平滑动。如何在小于全屏尺寸的任何东西上使用它?

- (void)viewDidLoad
{
    [super viewDidLoad];

    UIImage *image = [UIImage imageNamed:@"Star-Rating-Stroke.png"];
    UIImageView *imageView = [[UIImageView alloc] initWithImage:image];


    imageView.frame = [[UIScreen mainScreen] bounds];  // THIS WORKS !!!
//  imageView.frame = CGRectMake(36,70,33,33);         // THIS DOESN'T !!!
    [imageView setUserInteractionEnabled:YES];

    [self.view addSubview:imageView];

   UISwipeGestureRecognizer *swipeLeft = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleLeftSwipe:)];
   UISwipeGestureRecognizer *swipeRight = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleRightSwipe:)];

   // Setting the swipe direction.
   [swipeLeft setDirection:UISwipeGestureRecognizerDirectionLeft];
   [swipeRight setDirection:UISwipeGestureRecognizerDirectionRight];

   // Adding the swipe gesture on image view
   [imageView addGestureRecognizer:swipeLeft];
   [imageView addGestureRecognizer:swipeRight];
}

- (IBAction) handleRightSwipe:(UISwipeGestureRecognizer *)swipe
{
    NSLog(@"Right Swipe");
}

- (IBAction) handleLeftSwipe:(UISwipeGestureRecognizer *)swipe
{
    NSLog(@"Left Swipe");
}

1 个答案:

答案 0 :(得分:1)

如果图像视图全屏时有效,那么它也适用于(某些)较小的帧。您应该通过逐渐减小图像视图的大小来进行实验,以查看确切的问题。

无论如何,像你正在使用的那个非常小的尺寸非常有意义。 UISwipeGestureRecognizer类将具有一些内部测量,用于确定手指是否在指定方向上已经足够平移以便识别手势。如果图像视图的帧小于此(未知)值,则手势将始终失败。

作为一种替代方法,我建议您制作自己的UIGestureRecognizer子类,其作用类似于滑动手势,但需要较少的移动进行检测。如果这不是您感兴趣的事情,您可以考虑在图像视图的超视图中添加手势并跟踪触摸事件的位置,以确定它们是否发生在图像视图的边界内。