3D Touch заглянуть и поп-проблема

Я пытаюсь реализовать функцию peek и pop в своем приложении. Но поскольку я не могу ее протестировать, я хотел бы знать, правильно ли я делаю это, я чувствую, что что-то не так?

- (UIViewController *)previewingContext:(id<uiviewcontrollerpreviewing>)previewingContext viewControllerForLocation:(CGPoint)location 
{
 NSLog(@"TEST");
 NSIndexPath *indexPath = [self.myTableView indexPathForRowAtPoint:location];
 if (indexPath) {
 UITableViewCell *cell = [self.myTableView cellForRowAtIndexPath:indexPath];
 NSDictionary *dict = [self.array objectAtIndex:indexPath.row];
 cell.textLabel.text = [dict objectForKey:@"name"];
 DetailViewController *previewController = [[DetailViewController alloc] init];
 // previewController.content = content;
 previewingContext.sourceRect = cell.frame;
 return previewController;
 }
return nil;
}
</uiviewcontrollerpreviewing>
3 ответа

В настоящее время я реализую это в нашем приложении, и это выглядит в основном правильно. Проблема, с которой я столкнулся, состоит в том, что координаты, данные вам в местоположении, относятся к представлению UIViewController, а не UITableView. В зависимости от вашей установки они могут быть одинаковыми, но в моем случае мне нужно было преобразовать местоположение в координаты UITableView.

CGPoint convertedLocation = [self.view convertPoint:location toView:self.tableView];

Конечно, ваш пробег может отличаться.


Единственная проблема с вашим кодом - это способ получить convertLocation не прав.

Ниже код получит правильное расположение даже после прокрутки вида таблицы.

CGPoint convertedLocation = [self.tableView convertPoint:location fromView:self.view];
NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:convertedLocation];


Вам не нужно корректировать местоположение, если вы зарегистрировали PreviewDelegate с правильным исходным кодом. Поэтому вместо

[self registerForPreviewingWithDelegate:self sourceView:self.view];

вы должны зарегистрировать его следующим образом:

[self registerForPreviewingWithDelegate:self sourceView:self.tableView];

Затем местоположение, которое вы получаете от вызова делегата, учитывает прокрутку/contentOffset.

licensed under cc by-sa 3.0 with attribution.