Анимация 5 взглядов, скоординированных вместе - PullRequest
1 голос
/ 23 марта 2011

Я пытаюсь создать свою собственную панель загрузки; Он состоит из 5 столбцов, скользящих снизу слева направо, а затем выдвигающихся вверх в том же порядке. Между всеми ними должно быть фиксированное время (скажем, 0,2 секунды).

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

Любой данный бар движется вверх примерно за 0,3 секунды, ждет там в течение 0,2 секунды, затем движется дальше вверх через 0,3 секунды. Они начинают через 0,2 секунды после своего левого соседа, слева направо. Как только они начали, они просто повторяют это.

Итак, что я мог бы использовать, чтобы координировать их таким образом, чтобы между ними всегда было одинаковое количество времени?

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

1 Ответ

1 голос
/ 23 марта 2011

Согласно документации NSTimer , объекты NSTimer не гарантируют точность в реальном времени на iOS.

Таймер не является механизмом реального времени; он срабатывает только тогда, когда работает один из режимов цикла выполнения, к которому был добавлен таймер, и может проверить, прошло ли время срабатывания таймера. Из-за различных входных источников, которыми управляет типичный цикл выполнения, эффективное разрешение временного интервала для таймера ограничено порядка 50-100 миллисекунд. Если время срабатывания таймера происходит во время длинного вызова или когда цикл выполнения находится в режиме, который не контролирует таймер, таймер не срабатывает до следующей проверки цикла таймером. Следовательно, фактическое время, в которое таймер срабатывает, потенциально может быть значительным периодом времени после запланированного времени срабатывания.

Это проблема, которая влияет на NSTimer, а также на игры на основе OpenGL. Майкл Дейли упоминает нечто подобное в своей книге о том, как правильно настроить вещи для игры на основе openGL. Я подозреваю, что это страдает от аналогичной ситуации.

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

Приложение:

Подумав об этом, мне интересно, поможет ли вам здесь функция C wait(). Это длинный выстрел, но, возможно, стоит попробовать. Если нет, то ответ вполне может быть, что его нет.

Приложение 2:

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

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