【问题标题】:Tap Gesture Recognizer is one tap behind点击手势识别器落后一键
【发布时间】:2014-04-24 23:48:01
【问题描述】:

我有一个collectionView 的照片,当点击照片时,它应该会显示该照片的详细视图。

问题是,我点击的第一张照片没有任何作用,然后每次点击后都会显示两次之前点击过的照片。

例如:

点按照片 1... 不执行任何操作。

点按照片 2... 显示照片 1。

点按照片 6... 显示照片 2。

感谢您的帮助!

ViewController.m

@property (nonatomic) NSArray *photos;

- (void)viewDidLoad
{
    [super viewDidLoad];
    [self.collectionView registerClass:[BlissPhotoCell class] 
    forCellWithReuseIdentifier:@"photo"];

    NSURLSession *session = [NSURLSession sharedSession];
    NSString *urlString = [[NSString alloc] initWithFormat:@"https://api.instagram.com/v1/;
    NSURL *url = [[NSURL alloc]initWithString:urlString];
    NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url];
    NSURLSessionDownloadTask *task = [session downloadTaskWithRequest:request completionHandler:^(NSURL *location, NSURLResponse *response, NSError *error) {
        NSString *text = [[NSString alloc] initWithContentsOfURL:location encoding:NSUTF8StringEncoding error:nil];

        NSData *data = [[NSData alloc] initWithContentsOfURL:location];
        NSDictionary *responseDictionary = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil];

        self.photos = [responseDictionary valueForKeyPath:@"data"];
        dispatch_async(dispatch_get_main_queue(), ^{
            [self.collectionView reloadData];
        });
    }];
    [task resume];

- (void)collectionView:(UICollectionView *)collectionView didDeselectItemAtIndexPath:(NSIndexPath *)indexPath {
    NSDictionary *photo = self.photos[indexPath.row];
    BlissDetailViewController *viewController = [[BlissDetailViewController alloc] init];

    viewController.modalPresentationStyle = UIModalPresentationCustom;
    viewController.transitioningDelegate = self;

    viewController.photo = photo;
    [self presentViewController:viewController animated:YES completion:nil];
}

BlissPresentDetailTransition.h

- (void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext {
    UIViewController *detail = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];
    UIView *containerView = [transitionContext containerView];

    detail.view.alpha = 0.0;
    CGRect frame = containerView.bounds;
    frame.origin.y += 20.0;
    frame.size.height -= 20.0;
    detail.view.frame = frame;
    [containerView addSubview:detail.view];

    [UIView animateWithDuration:0.3 animations:^{
        detail.view.alpha = 1.0;
    } completion:^(BOOL finished) {
        [transitionContext completeTransition:YES];
    }];
}

- (NSTimeInterval)transitionDuration:(id<UIViewControllerContextTransitioning>)transitionContext {
    return 0.3;
}

【问题讨论】:

  • 如果您发布相关代码可能会有所帮助。设置手势识别器的代码在哪里,处理它的代码在哪里?
  • 我添加了didSelectItemAtIndexPath 代码。那是你要找的吗?对此感到抱歉。
  • 你的手势识别器的代码怎么样?
  • 为了展示BlissDetailViewController,我只使用didSelectItemAtIndexPath。所以我想也许它没有使用手势?只是我的自定义过渡?现在将发布我的自定义转换的代码。

标签: ios objective-c uicollectionview uitapgesturerecognizer


【解决方案1】:

您无意中实现了 didDeselect 而不是 didSelect。如果您在键入时使用自动完成很容易犯错误,因为 didDeselect 按字母顺序排在第一位。

【讨论】:

  • 这是一个相当普遍的问题。我想我每周至少会在 SO 上看到这个问题。 .
  • 我只是在这上面浪费了 DAYS 天。谢谢你。另一个错误归结为“编码盲区”。希望我有一个代码审查 - 我相信其他人会发现它。
猜你喜欢
  • 1970-01-01
  • 2021-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多