Прежде всего, я знаю, что есть несколько других вопросов StackOverflow по этой теме, но я прочитал их все, и я все еще не понимаю, что делать в моей ситуации. Я, наверное, упускаю что-то очевидное здесь, если бы вы могли помочь прояснить это, будет очень признателен!
У меня есть приложение, которое выполняет большую работу по анимированию изображений в представлении, в основном состоящее из нескольких изображений, движущихся по прямой линии в течение одной или двух секунд за один раз. Сначала я решил сделать их простыми, отключив анимацию, используя UIView animateWithDuration
на все время движения. Но я обнаружил, что это не дает мне много сил, чтобы перехватить движение, остановить его или проверить, где оно было, поэтому я отказался от него. Мой новый подход состоит в том, чтобы использовать NSTimer, стреляя 20 раз в секунду, делая дополнительные движения. Таким образом, я также могу вмешаться (почти) мгновенно, чтобы изменить анимацию, остановить ее или обновить метку состояния в зависимости от того, как далеко она прошла, и т. Д., И т. Д.
Прежде всего ... возможно, есть лучший способ, чем этот. Не стесняйтесь предложить что-то лучшее!
Предполагая, что это приемлемо, теперь моя проблема заключается в том, что, хотя эти анимации происходят, я не могу щелкнуть ни один из других элементов управления в пользовательском интерфейсе. Я не получил ответа. Это не так просто, это просто медленно или с задержкой - щелчок никогда не приходит. Кажется, что обработка NSTimer полностью блокирует пользовательский интерфейс - но только от новых взаимодействий. Изменения, вносимые в пользовательский интерфейс в методе обработки таймера, происходят очень хорошо и очень быстро.
Из того, что я прочитал, этого не должно произойти. Однако я также видел комментарий к этому вопросу , в котором говорилось, что если обработка таймера интенсивна, то может заблокировать поток пользовательского интерфейса. Я не вижу, чтобы моя обработка была такой интенсивной - конечно, без запросов ресурсов, просто немного данных, манипулирующих и анимирующих некоторые объекты - но я мог бы преуменьшать это.
Какие у меня есть варианты? Сначала я подумал, что мог бы создать новую тему, чтобы запустить таймер. Но я помню, что читал, что обновления пользовательского интерфейса в любом случае должны происходить в основном потоке. Почему это? И плюс, это действительно решило бы проблему? Я просто прошу слишком много устройства для обработки этого таймера, а также взаимодействия пользовательского интерфейса? Что-то еще мне не хватает?
Буду признателен за любой совет.
Edit:
Я только что нашел причину моей проблемы блокировки пользовательского интерфейса. Я использовал animateWithDuration
с блоками, но не устанавливал параметры. Поэтому UIViewAnimationOptionAllowUserInteraction
не было установлено. Я изменил его, чтобы установить эту опцию, и мой пользовательский интерфейс теперь радостно реагирует.
Тем не менее, я все равно оставлю этот вопрос открытым для конкретных предложений относительно моего общего подхода. Спасибо.