Максимально быстрый откидной счетчик в стиле Apple в машинном коде на iOS

#objective-c #ios #opengl-es #core-graphics

#objective-c #iOS #opengl-es #ядро-графика

Вопрос:

Я хотел бы имитировать счетчик переворачивания в стиле Apple на iOS.

В частности, эта штука будет РАБОТАТЬ БЫСТРО. Это не будет будильник, подумайте о том, чтобы набрать рекорд игрока, где вы набираете очки по частям за раз. Счетчик может перейти от 0 к 100, к 5000, он не будет увеличиваться последовательно, но когда он увеличится, он анимируется до следующего числа в красивом клипе, и он будет переходить к следующему целевому значению через секунду или две. У него также не будет заданного количества разрядных разрядов, он может считать от 0 до 2 000 000, если захочет. Подобно игроку, набравшему больше очков, вы не знаете, что он в итоге получит. Поскольку он не может быть отрицательным, теоретически максимум будет UINT_MAX

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

Это подход js / css, который теоретически может выполняться внутри UIWebView:

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

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

1) Загрузите счетчик html целиком в UIWebView.

  • Очевидные преимущества: возможно, тонны повторного использования кода, быстрого и грязного
  • Очевидные недостатки: накладные расходы на a UIWebView и постоянные вызовы stringByEvaluatingJavaScriptFromString из хост-приложения, у которого есть следующий номер, просто кажутся глупыми

2) Создайте пользовательский лист спрайтов и используйте основную анимацию

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

3) Визуализация текста / округленных прямоугольников с основной графикой

  • Очевидные преимущества: 100% решение с собственным кодом, без изображений
  • Очевидные недостатки: загружает больше кода, чем некоторые экземпляры UIImage. На самом деле не знаю, смогу ли я получить правильный вид, который мне нужен, без изображений

4) Визуализируйте все это с помощью OpenGL ES 2.0

  • Очевидные преимущества: полный контроль над рендерингом, возможно, лучшая производительность
  • Очевидные недостатки: мне кажется, что мне все равно, вероятно, понадобятся некоторые изображения для привязки к текстурам, вероятно, это больше кода, чем рендеринг основной графики в # 3

С одной стороны, я могу рационализировать это и сказать, что анимация будет длиться всего полсекунды или секунду, поэтому лучшее, что можно сделать, это как-то подделать ее с помощью размытых изображений и на самом деле ничего не анимировать. С другой стороны, мне кажется, что это именно то, для чего была разработана Core Animation Core Graphics, и я должен их использовать.

Ответ №1:

В итоге я рисовал изображения с использованием спрайтов изображений.

код здесь https://github.com/reklis/flipcounter

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

1. Я решил, что это не самый быстрый из возможных способов. Лучший способ — создать одно изображение и сдвинуть границы. У меня не было времени реализовать это.

Ответ №2:

введите описание изображения здесьна коротком экране отображаются как изображения справа налево, так и исходные, и слева от большинства изображений с измененным размером. flipCounter хорошо работает в Xcode, но есть одна проблема: проблема заключается в том, как я изменяю размер представления flipCounter. когда я меняю исходное изображение на маленькое изображение, это работает плохо.![это изображение на 50% меньше, чем исходное изображение] [2] я жду положительного ответа. Спасибо, advane

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

1. Извините, я этого не понимаю. Не могли бы вы подробнее рассказать о проблеме?

2. сэр, на самом деле розовый и синий — это изображение оригинального размера (оба работают хорошо) … но когда я использую (маленькое изображение), измените размер этого изображения, это руководство не работает. я использую этот учебник github.com/reklis/flipcounter

3. вам нужно будет настроить размер изображения в #defines здесь raw.github.com/reklis/flipcounter/master/FlipCounter /…

4. Спасибо за ответ. сэр, когда я вношу изменения в #defines, это изменяется только в кадре. на изображении нет изменений. Изображение имеет исходный размер кадра. Половина изображения отображается, когда я выполняю настройку в #defines… Спасибо, сэр, за уделенное время…

5. Саван, тебе нужно создавать новые изображения, если ты хочешь, чтобы они были меньше.

Ответ №3:

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

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