É possível modificar um UIImage
's renderingMode
de um editor de storyboard ou xib?
O objetivo é aplicar tintColor
ao UIImageView
objeto específico .
ios
ios7
xcode-storyboard
Artem Stepanenko
fonte
fonte
Você pode definir o modo de renderização da imagem não no
.xib
arquivo, mas em uma.xcassets
biblioteca.Depois de adicionar uma imagem a uma biblioteca de ativos, selecione a imagem e abra o inspetor de atributos no lado direito do Xcode. Encontre o atributo 'Renderizar como' e defina-o como 'template'.
Depois de definir o modo de renderização de uma imagem, você pode adicionar uma cor de matiz
UIImageView
em um arquivo.xib
ou.storyboard
para ajustar a cor da imagem.Isso define a propriedade na imagem onde quer que seja usada, em vez de apenas em um arquivo do construtor de interface, mas em quase todos os casos (que encontrei) este é o comportamento que você deseja.
Algumas coisas a serem observadas:
UIImageView
. Eu não olhei tão profundamente.UIKitComponents
imagens, como emUIButton
'seUIBarButtonItem
' s.fonte
UIImageView
, então a cor da tonalidade nem sempre é mostrada ao executar o aplicativo.Usar o modo de renderização de modelo com um UIImageView em um storyboard ou xib é muito problemático, tanto no iOS 7 quanto no iOS 8.
No iOS 7
O UIImage não foi decodificado corretamente do storyboard / xib. Se você inspecionar a
imageView.image.renderingMode
propriedade noviewDidLoad
método, perceberá que é sempreUIImageRenderingModeAutomatic
, mesmo se você configurá-la para Render As Template Image em seu arquivo xcassets.Para contornar o problema, você deve definir manualmente o modo de renderização:
No iOS 8
O UIImage é decodificado corretamente e sua
renderingMode
propriedade reflete o que foi escolhido no arquivo xcassets, mas a imagem não é colorida.Para contornar o problema, você tem duas opções:
tintColor
propriedade nos Atributos de Tempo de Execução Definidos pelo Usuário em vez do painel do inspetor Atributos.ou
Você pode escolher sua opção preferida, tanto tingir corretamente a imagem.
(Se você estiver compilando com o Xcode 6.2, basta fazer
self.imageView.tintColor = self.imageView.tintColor;
é suficiente, mas isso não funciona mais se você estiver compilando com o Xcode 6.3)Conclusão
Se precisar de suporte para iOS 7 e iOS 8, você precisará de ambas as soluções alternativas. Se você só precisa oferecer suporte ao iOS 8, apenas uma solução alternativa é necessária.
fonte
A configuração de imageView RenderingMode para usar a cor de matiz no storyboard pode ser reduzida a uma linha:
Então, a imagem e a cor da tonalidade podem ser definidas no Storyboard.
fonte
Você pode corrigir problemas .xib com uma extensão:
Fonte: https://gist.github.com/buechner/3b97000a6570a2bfbc99c005cb010bac
Incrível, esse bug já existe há 4-5 anos.
fonte
Você não pode definir
renderingMode
destoryboard
ouxib
. Ele pode acessar programaticamente.ex:
fonte
UIImage *selectedImage = [unSeletedImage imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
Defina tintColor e classe no Storyboard.
fonte
É muito fácil de consertar
Basta criar a classe UIImageViewPDF e usá-la em seu storyboard
fonte
Outra solução é criar uma
UIImageView
subclasse:Em seguida, defina a classe no Interface Builder como
TemplateImageView
.fonte
Maneira simples de definir a partir do Storyboard:
Funciona bem no iOS 10 e Swift 3
fonte
Na configuração do iOS 9, a
tintColor
propriedade no Interface Builder ainda apresenta erros.Observe que uma solução de trabalho além de escrever linhas que modificam diretamente as
ImageView
propriedades é definir Render As: Template Image no catálogo de ativos e chamar, por exemplo:fonte
Resolvi esse problema adicionando o atributo runtime
tintColor
no construtor de interface.NOTA: Você ainda precisará definir sua imagem para ser renderizada como uma imagem de modelo em seu arquivo Images.xcassets.
fonte
Se você criar um IBOutlet, você pode alterá-lo em seu método awakeFromNib assim ...
Embora a resposta de @Moby seja mais correta - pode ser mais sucinta.
fonte
Louco esse bug ainda está no iOS 12.1! Para storyboards / xibs: Adicionar uma tag ao UIImageView pode ser uma solução rápida.
Swift 4.2
fonte
No storyboard, selecione UIImageView e selecione o inspetor, defina a propriedade
renderModeTemplate
=On
No Storyboardfonte