Укладка UIViews с режимами смешивания в iOS

У меня есть два разных UIImageViews. Я хотел бы сделать верхнюю форму UIImageView в использовании режима наложения экрана с нижней UIImageView.

Я знаю свойство CALayer: compositingFilter, и я знаю, что он не работает в iOS. Я много искал для решений, и я нашел способ подкласса UIView и переопределить drawRect.

Я попытался установить контекст в drawRect в режим наложения экрана, хотя он по-прежнему рисует каждое изображение обычным образом. Возможно, я делаю что-то неправильно, или подход должен быть другим. Может быть, мне нужно OpenGL или CALayer для этого. Может ли кто-нибудь помочь?

Ответы

Ответ 1

К сожалению, нет способа сделать некомпозиционную смесь между UIViews на iOS. UIKit не обеспечивает функциональность, и вы уже отметили, что CALayer тоже не может этого сделать.

В общем, реализация -drawRect в UIView вам не поможет. Вы рисуете пустую растровую карту - она ​​не содержит битов за ней, поскольку они могут меняться в любое время (любой вид или слой могут быть анимированы). CA принципиально предполагает, что содержание слоев должно быть независимым друг от друга.

Вы можете попробовать в своем -drawRect:

  • создать контекст изображения
  • захватить представления под вашим видом, используя -[CALayer renderInContext:] для каждого
  • создать изображение из контекста изображения
  • нарисуйте это изображение в своем представлении
  • установите режим наложения и нарисуйте поверх этого

Но это будет медленным и хрупким и не будет работать, если вы будете анимировать любое из видов. Я бы не рекомендовал его.

Если вам действительно нужно это сделать, вам придется переключить всю сцену, чтобы рендерить с OpenGL, где у вас больше свободы.