Definir alfa no UIView define o alfa em suas subvisualizações, o que não deveria acontecer

86

De acordo com a documentação para UIVIew @property(nonatomic) CGFloat alpha

O valor dessa propriedade é um número de ponto flutuante no intervalo de 0,0 a 1,0, onde 0,0 representa totalmente transparente e 1,0 representa totalmente opaco. Este valor afeta apenas a visualização atual e não afeta nenhuma de suas subvisualizações incorporadas.

Eu tenho uma visualização de contêiner configurada da seguinte maneira:

self.myView.backgroundColor = [UIColor blackColor];
self.myView.alpha = 0.5;
[self addSubview:self.myView];

E então adicione subvisualizações a 'myView'

[myView addSubView anotherView];
anotherView.alpha = 1;
NSLog(@"anotherView alpha = %f",anotherView.alpha); // prints 1.0000 as expected

Mas ' anotherView ' tem alfa na tela (não é opaco como esperado)

Como pode ser e o que pode ser feito?

Avner Barr
fonte
Talvez a ordem de adição de subvisualizações e configuração de alfa seja importante. Experimente jogar com sequências diferentes.
Joride,
Adicione todo o código de criação de anotherView :) e também acho que é erro de digitação, mas tem certeza que inicializou self.myView? e adicionar outra visualização , como[self.self addSubview:self.myView];
iPatel
1
na verdade, a documentação está correta: isso não afetará as subvisualizações embutidas e as subvisualizações alfa são sempre as mesmas - mas as visões renderizadas têm um alphavalor que é o valor de todas as subvisualizações alpha, multiplicado. por exemplo, se o alfa do subviews 0.8e o alfa do superview eram 1.0, mas você alterou para 0.6, o alfa do subviews ainda é o mesmo 0.8,. o valor alfa da subvisualização renderizada é alterado apenas de 0.8para 0.48.
holex

Respostas:

117

Acho que é um bug na documentação. Você deve registrá-lo em bugreport.apple.com.

Tudo o que posso ver depois de um pouco de pesquisa rápida sugere que o que você está vendo é como sempre se comportou, e meus próprios testes mostram isso também.

O alfa de uma visualização é aplicado a todas as subvisualizações.

Talvez tudo de que você precise é, [[UIColor blackColor] colorWithAlphaComponent:0.5]mas caso contrário, você precisará tornar a vista um irmão em vez de uma criança.

Abhi Beckert
fonte
21
+1. FWIW, acho que os documentos são indiscutivelmente corretos, embora extremamente confusos (ao ponto de serem incorretos para todos os efeitos práticos). O alfa das subvisualizações é afetado, mas não o valor alfa. Esse é o mesmo comportamento, eu acho, para a propriedade oculta. Definir oculto oculta as subvisualizações, mas não faz com que a propriedade oculta das subvisualizações seja definida.
Bjorn Roche
2
Tive a necessidade de mostrar uma visão algo como uipopover, mas no iphone. Eu tenho que criar um uiviewcontroller com [[UIColor blackColor] colorWithAlphaComponent: 0.5]. Obrigado, funcionou
Alok
2
Não acredito que os documentos sejam "indiscutivelmente corretos". No mundo real, os desenvolvedores lerão os documentos e acreditarão que os alfas filhos não são afetados. Quando, na realidade, o resultado composto será como se os alfas tivessem sido modificados. É apenas um caso de documentação ruim.
Womble
43

Não defina o alfa diretamente na visualização pai. Em vez disso, use a linha de código abaixo que aplicará transparência à visão pai sem afetar suas visões filho.

[parentView setBackgroundColor: [[UIColor clearColor] colorWithAlphaComponent: 0,5]];

Anooj VM
fonte
este código não está funcionando com os mais recentes ios e xcode. alguém tem ideias diferentes?
Moxarth
1
Excelente!! Para swift 4, use: parentView.backgroundColor = UIColor.black.withAlphaComponent (0,5)
Rakesh Yembaram
Ótima solução.
iLearner
27

Em rapidez

view.backgroundColor = UIColor.whiteColor().colorWithAlphaComponent(0.5)

ATUALIZADO PARA SWIFT 3

view.backgroundColor = UIColor.white.withAlphaComponent(0.5)
Nazarii Stadnytskyi
fonte
2
Isso não responde à pergunta feita.
David Berry
Isso me dá um erro de: "Valor do tipo 'UIColor' não tem membro 'colorWithAlphaComponent'".
Krivvenz
1
Olá @Krivvenz, 'colorWithAlphaComponent' foi renomeado para 'withAlphaComponent'. Veja minha resposta editada.
Nazarii Stadnytskyi
este código não está funcionando. não podemos ver a visualização empurrada como transparente. alguém tem alguma outra ideia?
Moxarth
21

Definir opacidade da cor de fundo em vez de alfa não afetará suas visualizações filhas.

  1. selecione a vista.
  2. vá para o inspetor de atributos e depois a cor de fundo
  3. clique em "outros"
  4. defina a opacidade para 30%

Ou você pode definir por programaticamente

var customView:UIView = UIView()
customView.layer.opacity = 0.3

É isso aí. Happy Coding !!!

MRizwan33
fonte
Existe alguma maneira de fazer isso programaticamente?
DCIndieDev
@DCIndieDev Desculpe, não encontrei opacidade como propriedade do UIView. Então, definido pelo storyboard.
MRizwan33
Esta é uma ótima resposta. Funcionou muito bem.
Joe Susnick
Esta deve ser a resposta aceita, trabalhada conforme necessário. Obrigado.
Missa
1
@ MRizwan33 Você pode acessar a propriedade opacity em [your UIView] .layer.opacity
Missa
16

Se você gosta de Storyboards, coloque um User Defined Runtime Attributepara sua visualização no Identity Inspector:

Key Path: backgroundColor, por exemplo Type: Color, Value:cor branca com opacidade 50%.

Ralf Hundewadt
fonte
Ótima resposta! No Attributes Inspector, defino o alfa da visualização como um. No Inspetor de identidade, insiro o caminho da chave como acima com opacidade 50%. A opacidade da visualização agora é de 50%, mas a opacidade das subvisualizações ainda é de 100%. Suponho que alfa e opacidade NÃO sejam a mesma coisa.
etayluz
6

A solução mais simples, conforme discutido, é alterar o alfa da seguinte maneira: A versão atualizada do Xcode 8 Swift 3 é:

yourParentView.backgroundColor = UIColor.black.withAlphaComponent(0.4)

Objetivo C:

yourParentView.backgroundColor = [[UIColor blackColor] colorWithAlphaComponent:0.5];

Consulte Apple Developer Docs aqui: https://developer.apple.com/reference/uikit/uiview/1622417-alpha

Ankit Kumar Gupta
fonte
sim eu apliquei isso, mas a visão não ficou transparente. Eu usei esse código anteriormente muitas vezes. mas desta vez não está funcionando. e mostrando minha visão como uma cor preta sólida. então, algum método alternativo ou mudou com novas atualizações do iOS?
Moxarth
Muito provavelmente, a visualização por trás de yourParentView deve ser totalmente preta, verifique se há xib em seu storyboard e também se o código está definido como preto de qualquer outro lugar. Espero que isso ajude
Ankit Kumar Gupta
estou apenas empurrando outra visão de uma visão. a visualização enviada pareceria transparente após esse código. eu usei muitas vezes antes. é tão simples quanto isso. -> configurações * set = [[configurações aloc] initWithNibName: @ pacote "configurações": nulo]; -> set.view.backgroundColor = [[UIColor blueColor] colorWithAlphaComponent: 0.3f]; -> [self.navigationController pushViewController: definir animado: SIM];
Moxarth
você está usando xib ou storyboard?
Ankit Kumar Gupta
mas agora estou usando este código e não está funcionando. a visualização empurrada aparecerá com uma cor sólida, qualquer que seja a cor que fornecemos, e não transparente.
Moxarth de
4

Em Swift 4.2 e Xcode 10.1

Não adicione cor e valor alfa por meio do storyboard. Apenas a abordagem programática funcionará neste caso.

transparentView.backgroundColor = UIColor.black.withAlphaComponent(0.5)
iOS
fonte
@iOS Obrigado, esse aqui me ajudou.
Raghuram
2

Aqui está uma solução um pouco complexa:

UIView *container;
UIView *myView;
UIView *anotherView;

myView.alpha = 0.5;
[container addSubview:myView];

anotherView.alpha = 1;
[container addSubview:anotherView];

Use uma containervisualização como supervisão, anotherViewe myViewambas são subvisualizações em container, anotherViewnão é uma subvisualização em myView.

likid1412
fonte
2

Por enquanto, há apenas uma maneira de tornar a visão pai transparente e não colocar nenhuma visão filha dentro (não coloque nenhuma visão como subvisão) da visão pai, coloque as visões filho fora da visão pai. Para tornar a visão dos pais transparente, você pode fazer isso por meio do storyboard.

//Transparent the parentView

parentView.backgroundColor = UIColor(red: 0, green: 0, blue: 0, alpha: 0.8)

Coloque a outra visão fora da visão pai. Vai funcionar como um encanto.

Purnendu roy
fonte
0

Consulte a descrição em negrito da documentação do Xcode.

O valor dessa propriedade é um número de ponto flutuante no intervalo de 0,0 a 1,0, onde 0,0 representa totalmente transparente e 1,0 representa totalmente opaco. Alterar o valor desta propriedade atualiza o valor alfa da vista atual apenas. No entanto, a transparência transmitida por esse valor alfa afeta todo o conteúdo da visualização, incluindo suas subvisualizações. Por exemplo, uma subvisualização com valor alfa de 1,0 que está incorporada em uma visualização pai com valor alfa de 0,5 aparece na tela como se seu valor alfa também fosse 0,5.

Danyun Liu
fonte