UIPanGestureRecognizer.maximumNumberOfTouches не соблюдаются во вложенных представлениях прокрутки? - PullRequest
5 голосов
/ 13 января 2012

У меня есть корень UIScrollView, который прокручивается только вертикально, этот вид прокрутки представляет строки в моей зубчатой ​​сетке.Я сконфигурировал распознаватель жестов панорамирования в этом представлении прокрутки для двух касаний как для минимального, так и для максимального количества требуемых касаний.

В этом представлении прокрутки у меня есть один или несколько экземпляров UIScrollView, которые прокручиваются только горизонтально, каждый из этих прокруток представляетединственная строка в моем зубчатом виде сетки.Я настроил распознаватели жестов панорамирования для всех этих видов прокрутки как минимум за одно касание, и максимум за два касания.

Пока все работает, я получаю хороший вид с неровной сеткой, где я могу прокручивать по вертикали между рядами, ипо горизонтали, чтобы прокрутить каждый ряд независимо.Я намеренно установил минимальное число касаний равным 2, чтобы не бояться прокрутки, если я добавлю пример UITableView в качестве подпредставления для любой из ячеек в этом зубчатом виде сетки (ячейка == позиция, определенная строкойи столбец в этой строке).

Используя UITableView в качестве ячейки, табличное представление работает так, как ожидалось.Но прокрутка двумя пальцами также прокручивается внутри табличного представления, а не в корневом представлении прокрутки для вертикальной прокрутки между строками.

Я попытался настроить средство распознавания жестов панорамирования табличных представлений, чтобы в надежде было максимум одно касаниечто два прикосновения пальца будут игнорироваться.Это не работает, свойство maximumNumberOfTouches швов распознавателя жестов панорамирования табличного представления следует игнорировать.

Что я мог сделать неправильно?

Снимок экрана с отображением макета, чтобы уточнить, чтоЯ сделал: Jagged Grid View http://i44.tinypic.com/33u96yv.png

Ответы [ 4 ]

0 голосов
/ 21 января 2012

Попробуйте эту ссылку и обратите внимание на то, как они решают вложенные представления.

Запомните лучшие рекомендации по обработке событий Multitouch:

При обработке событий оба события касанияи события движения, есть несколько рекомендуемых методов и шаблонов, которым вы должны следовать.

  • Всегда реализуйте методы отмены событий.

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

  • Если вы обрабатываете события в подклассе UIView, UIViewController или (в редких случаях) UIResponder,

    • Вы должны реализовать все методы обработки событий (даже если это нулевая реализация).

    • Не вызывать реализацию методов суперкласса.

  • Если вы обрабатываете события в подклассе любого другого класса респондента UIKit,

    • Вам не нужно реализовывать всеметоды обработки событий.

    • Но в методах, которые вы реализуете, обязательно вызовите реализацию суперкласса.Например,

[super touchesBegan: theTouches withEvent: theEvent];

  • Не пересылать событиядругим объектам респондента платформы UIKit.

Респонденты, которым вы пересылаете события, должны быть экземплярами ваших собственных подклассов UIView, и все эти объекты должны знать, что происходит переадресация событийи что в случае событий касания они могут получать касания, которые не связаны с ними.

  • Пользовательские представления, которые перерисовывают себя в ответ на события, должны только устанавливать состояние рисования в событии-обработать методы и выполнить все рисование в методе drawRect:

  • Не отправлять явным образом события на респондента (через nextResponder);вместо этого вызовите реализацию суперкласса и позвольте UIKit обрабатывать обход цепочки респондента.

0 голосов
/ 18 января 2012

TableViews в представлениях Scroll, как правило, не очень хорошая идея. Когда TableView получает прикосновения, даже если с ним ничего не нужно делать, он не отправляет их в свой superView.

Возможно, вы захотите попробовать любую из этих двух вещей:

  1. В вашем TableView вы должны отправить штрихи в superView вручную и позволить им обрабатывать их соответствующим образом. Я видел, как этот метод используется в одном из моих сайд-проектов, но я не могу опубликовать пример этого в настоящее время.

  2. Второе может быть проще в реализации. Поскольку TableView является подклассом ScrollView, вы можете вызвать delaysContentTouches этих TableViews. Это свойство будет задерживать приземление даже на этом TableView, пока не сможет определить, является ли прокруткой намерение, как написано в AppleDocs: http://developer.apple.com/library/ios/#documentation/uikit/reference/UIScrollView_Class/Reference/UIScrollView.html#//apple_ref/occ/cl/UIScrollView

Дайте мне знать, если какой-то из двух способов работает для вас, мне довольно любопытен этот вопрос вообще.

0 голосов
/ 18 января 2012

Но не пытайтесь использовать некоторые хитрости вместо реализации всех таких изменений:

1) По умолчанию отключает прокрутку TableView при создании представления.

2) Как только представление будет сгенерировано, Распознает жесты независимо от того, выполняется ли его прокрутка с помощью одного или нескольких касаний, если пользователь касается Child Scrollview. Изучив тег на основе жестов, вы можете включить прокрутку.of Tableview.

- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
   //Get the tag of ScrollView 
   // Check for the Parent as well as Child SCrollview.
   // If its child, just enable the scrolling of tableView.
}

- (void)tapAction:(UIGestureRecognizer *)gestureRecognizer
{

//  CGPoint *poit = [Tile locationInView:gestureRecognizer.view];
/// [[[gestureRecognizers.view] objectAtIndex:0] removeFromSuperview];
//  imageContent = [[UIImageView alloc]initWithFrame:CGRec  tMake(0, 0, 200, 250)];
//  [imageContent setImage:[UIImage imageNamed:@"Default.png"]];

    NSLog(@"You tapped @ this :%d",gestureRecognizer.view.tag);
    //Regonize the gestures
}

Там может быть какой-то ненужный код, поскольку в вашем вопросе нет фрагмента кода. Я попробовал и показал хитрость, если это сработает для вас и решит проблему.;)

0 голосов
/ 13 января 2012

Многократная прокрутка имеет тенденцию становиться хитрой, и я не уверен, но я думаю, что Apple не поощряет это.Несмотря на это, я все еще думаю, что это возможно.Возможно, вертикальная прокрутка в табличном представлении смешивается с вертикальной прокруткой в ​​представлении прокрутки или чем-то еще.

Попробуйте проверить, правильно ли установлены делегаты для распознавателей жестов.Другой способ обойти это: - иметь представление Scroll с кнопками, из которого вы можете открывать всплывающие окна с помощью пользовательских контроллеров (вставляйте туда, что хотите).- создать большой UITableViewController и установить содержимое ячейки в виде прокрутки и т. д. Я думаю, вы можете получить тот же результат.

Мой совет не зацикливаться только на одном методе, когда другие могут быть прощеи более интуитивно понятный.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...