Eu quero esmaecer um UIVisualEffectsView com um UIBlurEffect dentro e fora:
var blurEffectView = UIVisualEffectView()
blurEffectView = UIVisualEffectView(effect: UIBlurEffect(style: .dark))
Eu uso uma animação normal dentro de uma função chamada por a UIButton
para fade in, o mesmo para fade out, mas .alpha = 0
& hidden = true
:
blurEffectView.hidden = false
UIView.animate(withDuration: 1, delay: 0, options: .curveEaseOut) {
self.blurEffectView.alpha = 1
}
Agora, desvanecendo-se em ambas as direções não funciona, mas dá-me um erro quando desaparecendo para fora :
<UIVisualEffectView 0x7fdf5bcb6e80>
está sendo solicitado a animar sua opacidade. Isso fará com que o efeito pareça interrompido até que a opacidade retorne a 1.
Questão
Como faço o fade UIVisualEffectView
in e fade out com sucesso sem quebrá- lo e ter uma transição de fading?
Nota
- Tentei colocar o
UIVisualEffectView
em umUIView
e desvanecer aquele, sem sucesso
ios
swift
fade
uiblureffect
uivisualeffectview
LinusGeffarth
fonte
fonte
Respostas:
Acho que isso é novo no iOS9, mas agora você pode definir o efeito de
UIVisualEffectView
dentro de um bloco de animação:Defina
nil
para remover.MUITO IMPORTANTE - Ao testar isso no simulador, certifique-se de definir a substituição da qualidade gráfica do simulador como Alta qualidade para que isso funcione.
fonte
A documentação da Apple (atualmente) afirma ...
e
Eu acredito que algum contexto importante está faltando aqui ...
Eu sugeriria que a intenção é evitar valores alfa menores que 1 para uma exibição persistente. Na minha humilde opinião, isso não se aplica à animação de uma visualização.
Meu ponto - sugiro que valores alfa menores que 1 são aceitáveis para animações.
A mensagem do terminal afirma:
Lendo isso com atenção, o efeito parecerá estar quebrado. Meus pontos sobre isso são:
UIVisualEffect
visão com um valor alfa menor que 1 não será apresentada conforme pretendido / projetado pela Apple; ePara estender a resposta de @jrturton acima que me ajudou a resolver meu problema, eu adicionaria ...
Para esmaecer,
UIVisualEffect
use o seguinte código (Objective-C):Eu uso com sucesso os dois métodos: definir a
effect
propriedade comonil
e definir aalpha
propriedade como0
.Observe que definir
effect
comonil
cria um "flash legal" (na falta de uma descrição melhor) no final da animação, enquanto definiralpha
como0
cria uma transição suave.(Informe quaisquer erros de sintaxe ... eu escrevo em obj-c.)
fonte
Aqui está a solução que eu acabei, que funciona tanto no iOS10 quanto em versões anteriores usando Swift 3
Você também pode verificar esta essência para encontrar um exemplo de uso.
fonte
UIViewPropertyAnimator
é a única coisa que parece funcionar no iOS 11. Obrigado por isso!Apenas uma solução alternativa - coloque
UIVisualEffectView
em uma visualização de contêiner e altere aalpha
propriedade desse contêiner. Essa abordagem funciona perfeitamente para mim no iOS 9. Parece que não funciona mais no iOS 10.fonte
Você pode alterar o alfa da visualização dos efeitos visuais sem problemas, exceto o aviso no console. A visualização pode parecer simplesmente parcialmente transparente, em vez de desfocada. Mas isso geralmente não é um problema se você estiver apenas alterando o alfa durante a animação.
Seu aplicativo não vai travar ou ser rejeitado por isso. Teste-o em um dispositivo real (ou oito). Se você está feliz com sua aparência e desempenho, tudo bem. A Apple está apenas avisando que pode não parecer ou não funcionar tão bem quanto uma visualização de efeitos visuais com um valor alfa de 1.
fonte
Você pode tirar um instantâneo de uma visão estática subjacente e aumentar e diminuir o brilho sem tocar na opacidade da visão desfocada. Supondo um ivar de blurView:
fonte
Se você quiser desaparecer UIVisualEffectView - para ios10, use UIViewPropertyAnimator
então você pode definir a porcentagem
para ios9 você pode usar o componente alfa
fonte
O alfa do UIVisualEffectView sempre deve ser 1. Acho que você pode obter o efeito definindo o alfa da cor de fundo.
Fonte: https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIVisualEffectView/index.html
fonte
colorWithAlphaComponent:
método nasUIColor
instâncias. Não tenho certeza de como obter o mesmo efeito com a configuração da cor de fundo, no entanto.Eu faço um uiview cujo alfa é 0 e adiciono blurview como subview disso. Assim, posso ocultar / mostrar ou arredondar os cantos com animação.
fonte
Acabei com a seguinte solução, usando animações separadas para o
UIVisualEffectView
e o conteúdo. Usei oviewWithTag()
método para obter uma referência aoUIView
interior doUIVisualEffectView
.Eu preferiria que a animação única alterasse o alfa, mas isso evita o erro e parece funcionar tão bem.
fonte
Eu acabei de ter esse problema e a maneira que eu resolvi foi hospedar o UIVisualEffectsView em um UIView e animar o alfa desse UIView.
Isso funcionou bem, exceto que assim que o alfa mudou abaixo de 1.0, ele se tornou um branco sólido e parecia muito chocante. Para contornar isso, você deve definir a propriedade de camada do UIView
containerView.layer.allowsGroupOpacity = false
e isso impedirá que ele pisque em branco.Agora você pode animar / fade out o UIView contendo a visualização de efeitos visuais e quaisquer outras subvisualizações usando sua propriedade alpha e não precisa se preocupar com falhas gráficas ou com o log de uma mensagem de aviso.
fonte
Para alterar o alfa de UIVisualEffectView, você deve alterar o contentView de _visualEffectView. Se você alterar o alfa de _visualEffectView, você obterá este
fonte
Normalmente, eu só quero animar um desfoque quando estou apresentando um controlador de exibição na tela e quero desfocar o controlador de exibição de apresentação. Aqui está uma extensão que adiciona blur () e unblur () a um controlador de visualização para facilitar isso:
É claro que você pode tornar isso mais robusto, permitindo que o usuário escolha o estilo do efeito, modifique a duração, chame algo quando a animação for concluída, marque a visualização do efeito visual adicionado em desfoque () para garantir que seja a única removida quando você desfocar ( ), etc., mas não descobri a necessidade de fazer essas coisas até agora, pois essa tende a ser um tipo de operação do tipo "dispare e esqueça".
fonte
com base na resposta de @ cc, modifiquei sua extensão para desfocar a visualização
fonte
Melhorando a resposta @ Tel4tel e @cc, aqui está uma extensão com parâmetros e uma breve explicação.
Então você pode usá-lo como:
view.blur(duration: 5.0, effect: .light)
ouview.unblur(duration: 3.0)
Lembre-se de NÃO usá-lo,
viewDidLoad()
pois ele substituirá a animação. Além disso, ao executar em um Simulador, gire os gráficos para o nível Superior para poder ver a animação (Depurar> Substituição da Qualidade Gráfica> Alta Qualidade).fonte