Проблемы с касаниями в представлениях прокрутки OpenFeint на iOS

#cocoa-touch #ios #uiscrollview #openfeint

#cocoa-touch #iOS #uiscrollview #openfeint

Вопрос:

Я искал и спрашивал везде, пока безрезультатно. У меня есть игра, в которую я добавляю OpenFeint, и у меня проблемы с представлениями прокрутки на панели управления OpenFeint. Есть представления прокрутки для списков лидеров и достижений (и других, которые в настоящее время не актуальны), и в каждом из них можно прокручивать, но создается впечатление, что он никогда не получает никаких событий, завершенных касанием. Когда вы отпускаете, содержимое просто остается там, где оно было, даже если оно находится за пределами представления — оно не возвращается обратно. При повторном касании он мгновенно возвращается назад и снова доступен для прокрутки.

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

Соответствующие детали: приложение использует SDL (снимок git из версии 1.3, который мне пришлось скомпилировать самостоятельно и из которого я могу предоставить любой соответствующий источник), OpenGL и почти полностью C . Я использую OpenFeint 2.10 (новейший), XCode 4.0.2 (новейший) и iOS 4.3.2 (в симуляторе; немного более старые версии на моих реальных устройствах). Я думаю, что я сделал так, чтобы игра не проверяла наличие событий во время работы панели управления на случай, если это было проблемой, но либо я потерпел неудачу, либо это не имело никакого эффекта.

Вот скриншот зависшего вида прокрутки в симуляторе:
(источник:happyspork.com )

Ответ №1:

Хотя это руководство предназначено для интеграции Cocos2D с Openfeint, в нем рассматривается аналогичная проблема, из-за которой ввод на панель управления OpenFeint искажается:

Обратите особое внимание на методы dashboardDidAppear и dashboardDidDisappear. Вы увидите, что мы на мгновение приостанавливаем Cocos2D director, а затем повторно включаем его, как только панель мониторинга исчезнет. Это критический шаг, потому что в противном случае возможно, что ввод будет непоследовательным или даже не будет зафиксирован при отображении панели мониторинга. Но, приостановив director, мы гарантируем, что весь пользовательский ввод фиксируется на панели мониторинга.

Я не знаю, имеет ли SDL аналогичную функцию «паузы», но вызов ее аналогичным образом может решить вашу проблему.

Вот соответствующий код из этого примера:

 - (void)dashboardDidAppear
   {
    [[Director sharedDirector] pause];
    [[Director sharedDirector] stopAnimation];
   }
- (void)dashboardDidDisappear
   {
    [[Director sharedDirector] resume];
    [[Director sharedDirector] startAnimation];
   }
  

Комментарии:

1. Хм, ну, SDL работает по-другому; вы создаете свои собственные циклы событий с помощью SDL, и он выполняет что-либо с событиями только тогда, когда вы об этом просите. Однако из-за того, как работает Cocoa, все приложение запускается в событии, и поэтому, если вы не вызовете функцию CFRunLoopRunInMode (SDL выполняет, когда вы запрашиваете события), никакое другое событие не может быть обработано. Это немного сбивает с толку. В любом случае, я не думаю, что это помогает, но я ценю ответ.

2. Ах, ну тогда такое решение не сработало бы. Если вы решите эту проблему, пожалуйста, опубликуйте ответ здесь.

Ответ №2:

На случай, если у кого-то еще есть эта проблема, эта ссылка по существу исправила ее для меня: http://forums.libsdl.org/viewtopic.php?t=5678amp;sid=99aa9531656e0aa398ce35a7c348fe88

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