Я ищу, чтобы выполнить перспективное преобразование на UIView (например, видно в coverflow)
Кто-нибудь знает, возможно ли это?
Я исследовал использование CALayer
и пробежался по всем прагматичным подкастам Core Animation для программиста, но до сих пор не знаю, как создать такой вид трансформации на iPhone.
Любая помощь, указатели или примеры фрагментов кода будут очень благодарны!
ios
cocoa-touch
uiview
core-animation
calayer
Ник Картрайт
источник
источник
Ответы:
Как сказал Бен, вам нужно работать со
UIView's
слоем, используяCATransform3D
для выполненияlayer's
rotation
. Хитрость , чтобы получить перспективную работу, так как описано здесь , является непосредственно доступ к одному из матрицыcells
изCATransform3D
(m34). Математическая математика никогда не была моей вещью, поэтому я не могу точно объяснить, почему это работает, но это работает. Вам нужно будет установить это значение в отрицательную дробь для вашего первоначального преобразования, а затем применить к нему преобразования вращения слоя. Вы также должны быть в состоянии сделать следующее:Objective-C
Swift 5.0
который восстанавливает слой преобразования с нуля для каждого поворота.
Полный пример этого (с кодом) можно найти здесь , где я реализовал ротацию на основе касания и масштабирование для пары на
CALayers
основе примера Билла Дадни. В самой последней версии программы, в самом низу страницы, реализована такая перспективная операция. Код должен быть достаточно простым для чтения.sublayerTransform
Вы ссылаетесь в вашем ответе есть преобразование , которое применяется к подслоя из вашихUIView's
CALayer
. Если у вас нет подслоев, не беспокойтесь об этом. Я использую sublayerTransform в моем примере просто потому, чтоCALayers
в одном слое, который я вращаю, содержатся два элемента.источник
Вы можете использовать только преобразования Core Graphics (Quartz, 2D), непосредственно примененные к свойству transform UIView. Чтобы получить эффекты в coverflow, вы должны будете использовать CATransform3D, которые применяются в трехмерном пространстве, и, следовательно, могут дать вам перспективный вид, который вы хотите. Вы можете применять CATransform3D только к слоям, а не к видам, поэтому для этого вам придется переключиться на слои.
Проверьте образец "CovertFlow", который идет с XCode. Это только для Mac (т.е. не для iPhone), но многие концепции хорошо переносятся.
источник
Чтобы добавить ответ Брэда и привести конкретный пример, я заимствую свой ответ в другом посте на аналогичную тему. В своем ответе я создал простую игровую площадку Swift, с которой вы можете скачать и поиграть , где я демонстрирую, как создавать перспективные эффекты UIView с простой иерархией слоев, и показываю разные результаты между использованием
transform
иsublayerTransform
. Проверьте это.Вот некоторые изображения из поста:
источник
Вы можете получить точный эффект Карусели, используя iCarousel SDK.
Вы можете получить мгновенный эффект Cover Flow на iOS с помощью великолепной и бесплатной библиотеки iCarousel. Вы можете скачать его с https://github.com/nicklockwood/iCarousel и довольно легко добавить его в свой проект Xcode, добавив соединительный заголовок (он написан на Objective-C).
Если вы ранее не добавляли код Objective-C в проект Swift, выполните следующие действия:
Образец кода Swift 3:
источник