Estou tentando replicar esse fundo desfocado da tela de exemplo do iOS 7, publicamente lançada pela Apple:
Esta pergunta sugere a aplicação de um filtro de IC ao conteúdo abaixo, mas essa é uma abordagem totalmente diferente. É óbvio que o iOS 7 não captura o conteúdo das visualizações abaixo, por vários motivos:
- Fazer alguns testes, capturar uma captura de tela das visualizações abaixo e aplicar um filtro CIGaussianBlur com um raio grande o suficiente para imitar o estilo de desfoque do iOS 7 leva 1-2 segundos, mesmo em um simulador.
- A exibição de desfoque do iOS 7 pode desfocar as visualizações dinâmicas, como um vídeo ou animações, sem atraso perceptível.
Alguém pode sugerir quais estruturas eles poderiam estar usando para criar esse efeito e se é possível criar um efeito semelhante com as APIs públicas atuais?
Edit: (from comment) Não sabemos exatamente como a Apple está fazendo isso, mas existem suposições básicas que podemos fazer? Podemos assumir que eles estão usando hardware, certo?
O efeito é independente em cada visualização, de modo que o efeito não saiba realmente o que está por trás dele? Ou deve, com base em como os borrões funcionam, o conteúdo por trás do borrão deve ser levado em consideração?
Se o conteúdo por trás do efeito for relevante, podemos supor que a Apple esteja recebendo um "feed" do conteúdo abaixo e processando-o continuamente com um borrão?
fonte
Respostas:
Por que se preocupar em replicar o efeito? Basta desenhar uma barra UITool atrás da sua visualização.
fonte
frame
outransform
desta barra de ferramentas / exibição ou algo assim, ou coisas ruins acontecerão. Ele também sugeriu fortemente arquivar relatórios de erros do Radar sobre isso, para construir um caso internamente para que possamos obter uma API pública real para esse efeito!UITabBar
si próprio.A Apple lançou o código na WWDC como uma categoria na UIImage que inclui essa funcionalidade. Se você possui uma conta de desenvolvedor, pode pegar a categoria UIImage (e o restante do código de exemplo) acessando este link: https://developer.apple. com / wwdc / schedule / e navegando para a seção 226 e clicando em detalhes. Ainda não brinquei com ele, mas acho que o efeito será muito mais lento no iOS 6, há algumas melhorias no iOS 7 que tornam mais rápida a captura da captura de tela inicial usada como entrada para o desfoque.
Link direto: https://developer.apple.com/downloads/download.action?path=wwdc_2013/wwdc_2013_sample_code/ios_uiimageeffects.zip
fonte
Na verdade, eu aposto que isso seria bastante simples de conseguir. Provavelmente não funcionaria ou se pareceria exatamente com o que a Apple está acontecendo, mas poderia estar muito próximo.
Primeiro de tudo, você precisa determinar o CGRect do UIView que você apresentará. Depois de determinar que você precisaria apenas pegar uma imagem da parte da interface do usuário para que ela fique embaçada. Algo assim...
Gaussian Blur - Recomendado
Usando a
UIImage+ImageEffects
categoria Apple fornecida aqui , você obterá um desfoque gaussiano que se parece muito com o desfoque no iOS 7.Borrão de caixa
Você também pode usar um desfoque de caixa usando a seguinte
boxBlurImageWithBlur:
categoria UIImage. Isso é baseado em um algoritmo que você pode encontrar aqui .Agora que você está calculando a área da tela para desfocar, passando-a para a categoria de desfoque e recebendo uma UIImage de volta que ficou desfocada, agora resta apenas definir essa imagem desfocada como o fundo da exibição que você apresentará. Como eu disse, isso não será uma combinação perfeita para o que a Apple está fazendo, mas ainda deve parecer bem legal.
Espero que ajude.
fonte
renderInContext
, use o novodrawViewHierarchyInRect:
ousnapshotView:
. A palestra WWDC 216 "Implementando a interface do usuário envolvente no iOS7" alega uma melhoria de desempenho de 5-15x.O iOS8 respondeu a estas perguntas.
- (instancetype)initWithEffect:(UIVisualEffect *)effect
ou Swift:
init(effect effect: UIVisualEffect)
fonte
Acabei de escrever minha pequena subclasse de UIView que tem capacidade de produzir o iOS 7 nativo blur em qualquer visualização personalizada. Ele usa o UIToolbar, mas de maneira segura para alterar seu quadro, limites, cores e alfa com animação em tempo real.
Entre em contato se notar algum problema.
https://github.com/ivoleko/ILTranslucentView
fonte
Há um boato de que os engenheiros da Apple alegaram que, para obter esse desempenho, eles estão lendo diretamente do buffer gpu, o que levanta problemas de segurança e é por isso que ainda não há uma API pública para fazer isso.
fonte
Esta é uma solução que você pode ver nos vídeos da WWDC. Você precisa fazer um Gaussian Blur; portanto, a primeira coisa a fazer é adicionar um novo arquivo .m e .h com o código que estou escrevendo aqui; depois, é necessário fazer uma captura de tela, usar o efeito desejado e adicione-o à sua visualização e, em seguida, com o UITable UIView ou o que for transparente, você pode brincar com applyBlurWithRadius. Para arquivar o efeito desejado, essa chamada funciona com qualquer UIImage.
No final, a imagem manchada será o plano de fundo e o restante dos controles acima deverá ser transparente.
Para que isso funcione, você deve adicionar as próximas bibliotecas:
Acelerate.framework, UIKit.framework, CoreGraphics.framework
Espero que você goste.
Feliz codificação.
fonte
Você pode encontrar sua solução na DEMO da apple nesta página: WWDC 2013 , descubra e faça o download do código de exemplo UIImageEffects.
Depois, com o código de Jeremy Fox. Eu mudei para
Espero que isso ajude você.
fonte
Aqui está uma maneira realmente fácil de fazer isso: https://github.com/JagCesar/iOS-blur
Basta copiar a camada do UIToolbar e pronto, o AMBlurView faz isso por você. Ok, não é tão embaçado quanto o centro de controle, mas é embaçado o suficiente.
Lembre-se de que o iOS7 está sob NDA.fonte
Toda resposta aqui está usando o vImageBoxConvolve_ARGB8888. Essa função é muito, muito lenta, tudo bem, se o desempenho não for um requisito de alta prioridade, mas se você o estiver usando para fazer a transição entre dois View Controllers (por exemplo), essa abordagem significa vezes mais de 1 segundo ou talvez mais, isso é muito ruim para a experiência do usuário do seu aplicativo.
Se você preferir deixar todo esse processamento de imagem para a GPU (você deveria), poderá obter um efeito muito melhor e também tempos impressionantes em torno de 50ms (supondo que você tenha um tempo de 1 segundo na primeira abordagem), então vamos fazê-lo .
Primeiro faça o download do GPUImage Framework (BSD Licensed) aqui .
Em seguida, adicione as seguintes classes (.m e .h) da GPUImage (não tenho certeza de que sejam o mínimo necessário apenas para o efeito de desfoque)
GPUImageTwoPassTextureSamplingFilter
iOS / GPUImage-Prefix.pch
Em seguida, crie uma categoria no UIImage, que adicionará um efeito de desfoque a um UIImage existente:
E por último, adicione as seguintes estruturas ao seu projeto:
AVFoundation CoreMedia CoreVideo OpenGLES
Sim, me diverti com essa abordagem muito mais rápida;)
fonte
Você pode tentar usar meu modo de exibição personalizado, que tem a capacidade de desfocar o fundo. Ele faz isso fingindo tirar um instantâneo do fundo e desfocá-lo, assim como o do código WWDC da Apple. É muito simples de usar.
Também fiz algumas melhorias para fingir o borrão dinâmico sem perder o desempenho. O plano de fundo da minha visualização é um scrollView que rola com a visualização, fornecendo assim o efeito de desfoque para o restante da superview.
Veja o exemplo e o código no meu GitHub
fonte
O Core Background implementa o efeito desejado do iOS 7.
https://github.com/justinmfischer/core-background
Disclaimer: Eu sou o autor deste projeto
fonte