Gostaria de verificar a cor definida para um plano de fundo em um UIImageView. Eu tentei:
if(myimage.backgroundColor == [UIColor greenColor]){
...}
else{
...}
mas isso não funciona, mesmo quando eu sei que a cor é verde, ela sempre cai na outra parte.
Além disso, existe uma maneira de produzir a cor atual no console de depuração.
p [myimage backgroundColor]
e
po [myimage backgroundColor]
não trabalha
ios
objective-c
cocoa-touch
uiimageview
uicolor
4thSpace
fonte
fonte
ffffff
não é igual[UIColor whiteColor]
.Como zoul apontou nos comentários,
isEqual:
retornaráNO
ao comparar cores que estão em diferentes modelos / espaços (por exemplo,#FFF
com[UIColor whiteColor]
). Eu escrevi esta extensão UIColor que converte as duas cores no mesmo espaço de cores antes de compará-las:fonte
UIColor *(^convertColorToRGBSpace)(UIColor*) = ^(UIColor *color) ...
está declarando ablock
. Ele usa mais tarde comconvertColorToRGBSpace(self)
. Para obter uma introdução aos bloqueios no iOS, consulte raywenderlich.com/9328/creating-a-diner-app-using-blocks-part-1Isso pode ser um pouco tarde demais, mas o CoreGraphics tem uma API mais fácil para conseguir isso:
Como a documentação diz:
Isso resolve muitos problemas e vazamentos / algoritmos personalizados.
fonte
[UIColor isEqual:]
faz a mesma coisa que isso, não é? A resposta de Mark ainda é a única que verifica a equivalência apesar do espaço de cores.UIColor isEqual:
se as cores estivessem em diferentes espaços de cores.A solução de samvermette traduzida para rápida:
fonte
fonte
Essa extensão UIColor funciona bem, desde que as cores comparadas possam ser convertidas para o formato RGB, que deve ser a maioria dos casos.
Pelo menos com esta extensão:
Ambas as comparações retornariam false se comparadas usando o UColor.isEqual nativo (...)
fonte
Eu escrevi esta categoria. Se
isEqual:
retornar NÃO, ele testará se outras comparações de diferentes componentes ainda podem corresponder. Se possível, modelos diferentes ainda são comparados.fonte
Eu tive o mesmo problema no meu jogo de cores e resolvi que, usando a equação da diferença simples em cores RGB, você pode dar uma olhada rápida nesse pequeno exemplo de código ColorProcess daqui
é como vencedores responder
Em vez desse exemplo de código, você pode usar
e, claro, se retornar 0, significa que você está comparando cores muito semelhantes. faixa de retorno é algo como (0.0f - 1.5f) ..
fonte
Alguns erros de arredondamento estranhos podem ocorrer. Esse pode ser o motivo pelo qual um objeto foi definido como uma cor e a cor que você definiu para não corresponder exatamente.
Foi assim que eu resolvi:
Esse código pode ser aprimorado não apenas comparando 1, mas também comparando todos os componentes. Por exemplo, vermelho + verde + azul + alfa == vermelho2 + verde2 + azul2 + alfa2
fonte
Estou usando esta extensão que está funcionando para mim em todos os casos.
A esperança ajuda alguém.
Nota:
#ffffff
é igual a[UIColor whiteColor]
esta extensãofonte
As outras soluções não funcionaram corretamente. Aqui está uma abordagem que funciona no Swift:
fonte
A respeito:
fonte
-1
e, se algum ainda tiver esse valor após a chamadagetRed:green:blue:alpha:
, você sabe que a comparação falhou. (ou não omitir o boolean retornado como ele vai dizer se ele foi chamado com êxito.)getRed:free:blue:alpha:
não será bem-sucedido em uma cor monocromática. Portanto, seu código não produzirá outro resultado além deis equal:
. por favor, veja minha resposta sobre como lidar com isso.Aqui está uma extensão para mudar para o RGC Space Color no Swift:
}
fonte
Extensão para o UIColor, usando os recursos do Swift 2.2. Observe no entanto que, como os valores RGBA são comparados e são CGFloat, os erros de arredondamento podem fazer com que as cores não sejam retornadas iguais se não forem exatamente iguais (por exemplo, elas não foram criadas originalmente usando exatamente as mesmas propriedades no init (...)!)
fonte
Extensão UIColor
fonte
Eu converti a resposta do raf para o Swift 4 (muitas alterações na
CGColor
API), removi o desembrulhamento forçado e diminuiu o recuo graças ao uso generoso deguard
:fonte
Por que não adicionar a extensão com protocolo equável? Esta resposta está usando a solução de Nicolas Miari. Então, se você gosta desta resposta, seja bem-vindo a gostar da resposta dele (a segunda do topo)
O comentário de Zoul: Tenha cuidado ao comparar cores dessa maneira, pois elas precisam estar no mesmo modelo de cores para serem consideradas iguais. Por exemplo, #ffffff não é igual a [UIColor whiteColor]
fonte
Enquanto resposta de @ samvermette é muito bom, eu descobri que às vezes pode levar a falsos negativos quando se comparam os tipos de cores diferentes (no meu caso
UIDeviceRGBColor
aUICachedDeviceWhiteColor
). Corrigi-o criando explicitamente a cor no `else 'também:fonte
Você tem que usar
Documentação aqui .
fonte
fonte