Вы думаете о решении неправильно.Однако, по вашим собственным словам, ответ «позади всех представлений».
Как вы заметили, применение тени к каждому представлению будет иметь перекрывающиеся тени из-за каждого представления z-index.
Выупомянуто создание дополнительного представления для каждого окна, которое близко к другому решению, но не совсем.Вы можете создать один контейнерный вид и поместить все блоки внутри этого одного контейнерного вида.Затем примените свою тень к виду контейнера.Это даст вам ваш результат, но будет иметь ужасную производительность!Каждый раз, когда вызывается layoutSubviews
, например, когда изменяется рамка просмотра, тени пересчитываются.Как вы упомянули, вы используете жест панорамирования, поэтому, слегка перемещая прямоугольник, вы разметите подпредставления несколько десятков раз.
Решение, с которым вы должны пойти, - создать 2 контейнерных представления, которые являются родственными представлениями.Для каждого цветного представления, которое вы создаете, добавьте его в представление верхнего контейнера и создайте другое представление, которое будет добавлено в представление нижнего контейнера, назовем его представлением теневого контейнера.Используйте ограничения для представлений внутри теневого контейнера, чтобы их верх, ведущий, нижний и конечный были равны их эквивалентному представлению в представлении верхнего контейнера.Затем добавьте тень к видам внутри теневого контейнера и убедитесь, что вы применили layer.shadowPath
!Этот путь тени является ключом для предотвращения перерисовки тени при панорамировании.
Если вы не понимаете и нуждаетесь в примере, дайте мне знать, и я дам вам один.