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?


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.


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]];


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)

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 !!!


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%.


Ó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


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 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.


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.


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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.