2013-01-03 10 views
15

Mam dwa różne UIImageViews. Chciałbym, aby top UIImageView zmieszał się, używając trybu mieszania ekranu z dolnym UIImageView.Układanie UIViews z trybami mieszania w iOS

Znam własności CALayer: compositingFilter i wiem, że to nie działa w iOS. Dużo szukałem rozwiązań i odkryłem, jak należy podklasę UIView zastąpić drawRect.

Próbowałem ustawić kontekst w drawRect w trybie mieszania ekranu, mimo że nadal rysuje każdy z obrazów w normalny sposób. Być może robię coś złego, inaczej podejście powinno być inne. Może potrzebuję OpenGL lub CALayer, aby to osiągnąć. Czy ktoś może pomóc?

+0

Zamieść swój kod. Ponadto będziesz musiał narysować oba obrazy w jednym widoku; nie można mieszać jednego widoku z zawartością innego widoku. –

+0

@KurtRevis Wiem, że mogę narysować dwa obrazy w jednym UIView przy użyciu ekranu, czyli podstawowy rysunek w drawRect. Musiałem to zrobić między poglądami. Jeśli na razie nie istnieje, opublikuj to jako odpowiedź, abym mógł zamknąć pytanie. –

Odpowiedz

17

Niestety, nie ma sposobu, aby wykonać mieszankę nie złożoną między UIViews na iOS. UIKit nie zapewnia funkcjonalności, a już zauważyliście, CALayer też nie może tego zrobić.

Generalnie implementacja -drawRect w UIView nie pomoże. Rysujesz pustą bitmapę - nie zawiera ona bitów widoków za nią, ponieważ te mogą się w każdej chwili zmienić (dowolny widok lub warstwa może być animowana). CA zasadniczo zakłada, że ​​zawartość warstw powinna być od siebie niezależna.

Ty mógłby spróbować, w -drawRect:

  1. tworzyć kontekście wyświetlanego obrazu
  2. uchwycić widoki pod widoku wykorzystujące -[CALayer renderInContext:] dla każdego
  3. utworzyć obraz z kontekstu obrazu
  4. dobieranego ten obraz na swój widok
  5. ustaw tryb mieszania i narysuj na nim

Ale to będzie powolne i delikatne i nie zadziała, jeśli animujesz któryś z widoków. Nie polecałbym tego.

Jeśli naprawdę musisz to zrobić, będziesz musiał zmienić całą scenę, aby renderować za pomocą OpenGL, where you've got more freedom.

+1

Czy byłby jakiś sposób dodania widoku OpenGL do sceny, która pozwoliłaby na łączenie z nią treści? A może mógłbyś wyrenderować poza ekranem, uchwycić to jako teksturę, a następnie użyć OpenGL, aby narysować swoją scenę? – nielsbot

+0

Renderowanie poza ekranem UIViews musiałoby używać '- [CALayer renderInContext:]' jak opisałem. Ale tak, możesz następnie narysować to w kontekście OpenGL, a następnie połączyć z nim różne rzeczy. Ta sama lista wad. –

+1

Może to być interesujące: http://stackoverflow.com/questions/3410350/mixing-opengl-and-uikit – nielsbot

Powiązane problemy