Próbuję odtworzyć to rozmyte tło z publicznie opublikowanego przykładowego ekranu iOS 7:
To pytanie sugeruje zastosowanie filtra CI do treści poniżej, ale to zupełnie inne podejście. Oczywiste jest, że iOS 7 nie przechwytuje zawartości poniższych widoków z wielu powodów:
- Przeprowadzenie zgrubnych testów, zrobienie zrzutu ekranu poniższych widoków i zastosowanie filtra CIGaussianBlur o wystarczająco dużym promieniu, aby naśladować styl rozmycia iOS 7, zajmuje nawet 1-2 sekundy, nawet na symulatorze.
- Widok rozmycia w iOS 7 może zamazywać dynamiczne widoki, takie jak wideo lub animacje, bez zauważalnego opóźnienia.
Czy ktoś może postawić hipotezę, jakich ram mógłby użyć do stworzenia tego efektu i czy można stworzyć podobny efekt za pomocą obecnych publicznych interfejsów API?
Edycja: (z komentarza) Nie wiemy dokładnie, jak Apple to robi, ale czy możemy przyjąć jakieś podstawowe założenia? Możemy założyć, że używają sprzętu, prawda?
Czy efekt jest samowystarczalny w każdym widoku, tak że efekt tak naprawdę nie wie, co się za nim kryje? A może, biorąc pod uwagę sposób działania rozmycia, należy wziąć pod uwagę treść stojącą za rozmyciem?
Jeśli treść kryjąca się za efektem jest istotna, czy możemy założyć, że Apple otrzymuje „kanał” treści poniżej i stale renderuje je z rozmyciem?
źródło
Odpowiedzi:
Po co zawracać sobie głowę powtarzaniem efektu? Po prostu narysuj pasek narzędzi UITool za swoim widokiem.
źródło
frame
lubtransform
z tego paska / widoku lub coś podobnego, albo złych rzeczy się wydarzy. Zdecydowanie zasugerował również złożenie raportów o błędach radaru w tej sprawie, aby zbudować wewnętrzną skrzynkę, abyśmy mogli uzyskać prawdziwy publiczny interfejs API dla tego efektu!UITabBar
.Apple wydał kod w WWDC jako kategorię na UIImage, która zawiera tę funkcjonalność, jeśli masz konto programisty, możesz pobrać kategorię UIImage (i resztę przykładowego kodu), przechodząc do tego linku: https://developer.apple. com / wwdc / schedule / oraz przeglądanie sekcji 226 i klikanie szczegółów. Jeszcze się z tym nie bawiłem, ale myślę, że efekt będzie znacznie wolniejszy na iOS 6, jest kilka ulepszeń w iOS 7, które sprawiają, że chwytanie początkowego zrzutu ekranu, który jest używany jako sygnał wejściowy do rozmycia, jest znacznie szybszy.
Bezpośredni link: https://developer.apple.com/downloads/download.action?path=wwdc_2013/wwdc_2013_sample_code/ios_uiimageeffects.zip
źródło
Założę się, że osiągnięcie tego byłoby raczej proste. Prawdopodobnie nie działałby ani nie wyglądał dokładnie tak, jak dzieje się Apple, ale może być bardzo blisko.
Przede wszystkim musisz określić CGRect UIView, który będziesz prezentować. Po ustaleniu, że wystarczy uchwycić obraz części interfejsu użytkownika, aby można go było rozmazać. Coś takiego...
Rozmycie gaussowskie - zalecane
Korzystając z
UIImage+ImageEffects
podanej tutaj kategorii Apple , uzyskasz rozmycie gaussowskie, które wygląda bardzo podobnie do rozmycia w iOS 7.Rozmycie pola
Możesz także użyć rozmycia pola, używając następującej
boxBlurImageWithBlur:
kategorii UIImage. Jest to oparte na algorytmie, który można znaleźć tutaj .Teraz, gdy obliczasz obszar ekranu do rozmycia, przekazujesz go do kategorii rozmycia i otrzymujesz obraz UIImage, który został zamazany, teraz pozostaje tylko ustawić zamazany obraz jako tło widoku, który będziesz prezentować. Jak powiedziałem, nie będzie to idealne dopasowanie do tego, co robi Apple, ale nadal powinno wyglądać całkiem fajnie.
Mam nadzieję, że to pomoże.
źródło
renderInContext
, używaj nowegodrawViewHierarchyInRect:
lubsnapshotView:
. Dyskusja WWDC 216 „Implementing Engaging UI on iOS7” twierdzi, że poprawia wydajność 5-15x.iOS8 odpowiedział na te pytania.
- (instancetype)initWithEffect:(UIVisualEffect *)effect
lub Szybki:
init(effect effect: UIVisualEffect)
źródło
Właśnie napisałem moją małą podklasę UIView, która ma zdolność do generowania natywnego rozmycia w iOS 7 w dowolnym widoku niestandardowym. Korzysta z paska narzędzi UIToolbar, ale w bezpieczny sposób zmienia ramkę, obwiednie, kolor i alfa z animacją w czasie rzeczywistym.
Daj mi znać, jeśli zauważysz jakiekolwiek problemy.
https://github.com/ivoleko/ILTranslucentView
źródło
Plotka głosi, że inżynierowie Apple twierdzili, że aby zwiększyć wydajność, czytają bezpośrednio z bufora GPU, co rodzi problemy z bezpieczeństwem, dlatego nie ma jeszcze publicznego interfejsu API, aby to zrobić.
źródło
To rozwiązanie można zobaczyć w vidios WWDC. Musisz zrobić rozmycie gaussowskie, więc pierwszą rzeczą, którą musisz zrobić, to dodać nowy plik .m i .h z kodem, który tu piszę, następnie musisz zrobić i zrobić zrzut ekranu, użyć pożądanego efektu i dodaj go do swojego widoku, a następnie UITable UIView lub co jeszcze musi być przezroczyste, możesz grać z applyBlurWithRadius, aby zarchiwizować pożądany efekt, to wywołanie działa z dowolnym magiem UIImage.
Na końcu zamazany obraz będzie tłem, a pozostałe elementy sterujące powyżej muszą być przezroczyste.
Aby to zadziałało, musisz dodać kolejne biblioteki:
Acelerate.framework, UIKit.framework, CoreGraphics.framework
Mam nadzieję, że to lubisz.
Szczęśliwego kodowania.
źródło
Możesz znaleźć rozwiązanie z Apple DEMO na tej stronie: WWDC 2013 , dowiedz się i pobierz przykładowy kod UIImageEffects.
Następnie z kodem @Jeremy Fox. Zmieniłem to na
Mam nadzieję, że to ci pomoże.
źródło
Oto naprawdę prosty sposób: https://github.com/JagCesar/iOS-blur
Po prostu skopiuj warstwę UIToolbar i gotowe - AMBlurView zrobi to za Ciebie. Okej, nie jest tak rozmazany jak centrum sterowania, ale jest wystarczająco rozmazany.
Pamiętaj, że iOS7 jest objęty umową NDA.źródło
Każda odpowiedź tutaj używa vImageBoxConvolve_ARGB8888 ta funkcja jest naprawdę, bardzo powolna, to dobrze, jeśli wydajność nie jest wymogiem o wysokim priorytecie, ale jeśli używasz tego do przejścia między dwoma kontrolerami widoku (na przykład) to podejście oznacza czasy ponad 1 po drugie, a może nawet więcej, jest to bardzo niekorzystne dla wrażeń użytkownika aplikacji.
Jeśli wolisz pozostawić to przetwarzanie obrazu GPU (i powinieneś), możesz uzyskać znacznie lepszy efekt, a także niesamowite czasy zaokrąglające 50 ms (zakładając, że masz czas 1 sekundy w pierwszym podejściu), więc zróbmy to .
Najpierw pobierz ramowa GPUImage (BSD Licencjonowany) tutaj .
Następnie dodaj następujące klasy (.m i .h) z GPUImage (nie jestem pewien, czy są to minimum potrzebne tylko do efektu rozmycia)
GPUImageTwoPassTextureSamplingFilter
iOS / GPUImage-Prefix.pch
Następnie utwórz kategorię w UIImage, która doda efekt rozmycia do istniejącego UIImage:
I na koniec dodaj następujące ramy do swojego projektu:
AVFoundation CoreMedia CoreVideo OpenGLES
Tak, dobrze się bawiłem dzięki temu znacznie szybszemu podejściu;)
źródło
Możesz spróbować użyć mojego niestandardowego widoku, który ma możliwość rozmycia tła. Robi to poprzez sfałszowanie zdjęcia migawki tła i rozmycie go, tak jak w kodzie WWDC firmy Apple. Jest bardzo prosty w użyciu.
Poczyniłem też pewne udoskonalenia, aby sfałszować dynamiczne rozmycie bez utraty wydajności. Tłem mojego widoku jest scrollView, który przewija się wraz z widokiem, zapewniając w ten sposób efekt rozmycia dla reszty podglądu.
Zobacz przykład i kod na moim GitHub
źródło
Rdzeń w tle implementuje pożądany efekt iOS 7.
https://github.com/justinmfischer/core-background
Oświadczenie: Jestem autorem tego projektu
źródło