#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. (кроме того, вам придется написать кучу шаблонного кода для рендеринга текста и загрузки изображений в текстуры и т. Д.)