Estou tentando desenhar algumas imagens em miniatura em um tamanho fixo (100x100) usando UIImageView
. Eu definir o tamanho do quadro de meu ponto de vista para ser 100x100, e definir o contentMode
que UIViewContentModeScaleAspectFill
.
Meu entendimento é que isso deve fazer com que a imagem seja desenhada no tamanho definido, e a imagem preencherá a área da imagem e recortará todas as partes da imagem que estiverem fora do tamanho definido para a visualização da imagem. No entanto, a imagem ainda é desenhada maior ou menor que o tamanho de 100 x 100 definido por ela.
Se eu definir contentMode
como UIviewContentModeScaleToFill
, a imagem será desenhada exatamente 100x100, mas será distorcida para caber nessas dimensões. Alguma idéia de por que o preenchimento de aspecto não está aparando como esperado?
Aqui está o meu código:
_photoView = [[UIImageView alloc] initWithImage:photoImage];
_photoView.contentMode = UIViewContentModeScaleAspectFill;
[self addSubview:_photoView];
CGRect photoFrame = _photoView.frame;
photoFrame.size = CGSizeMake(100, 100);
_photoView.frame = photoFrame;
Para ilustrar melhor, aqui está uma captura de tela do que estou vendo. Os quadrados verdes são os UIView
que UIImageView
eu estou trabalhando. Defina a cor do plano de fundo para verde e o quadro da vista para 100x100. Como teste, eles UIImageViews
são dimensionados para 50x50. Como você pode ver, ao usar o ...AspectFill
, as imagens não são dimensionadas para 50x50 e, em alguns casos, são deslocadas de onde eu gostaria. Ao usar ...ScaleToFill
, eles são dimensionados corretamente, mas a imagem está distorcida.
fonte
Se você deseja expandir seu conhecimento, há um artigo realmente bom sobre como a pilha do iOS UIView é renderizada . Há também um artigo mais aprofundado sobre todo o pipeline de desenho .
Em suma:
Rasterização - Todo o conteúdo da visualização é rasterizado (desenhado ou um buffer de pixel fora da tela) no espaço coordenado dos limites da Visualização. Podem ser dados de imagem ou desenho personalizado (por exemplo
drawRect:
), mas conteúdo de subvisualização. Essa rasterização leva em conta acontentMode
propriedade.Qualquer coisa fora dos limites de uma vista é descartada.
Composição - Os resultados são compostos (desenhados uns sobre os outros) da subvisão às supervisões. Isso usa a propriedade de quadro da subvisão.
Se a
clipsToBounds
propriedade estiverYES
na superview, ela descartará o conteúdo da subview fora de seus limites.fonte
teve o mesmo problema e foi resolvido marcando "Clip Subviews".
A imagem estava aparecendo corretamente para todas as visualizações (3,5,4,4,7,5,5, ipad) na visualização do storyboard, mas não no simulador.
Depois de marcar "Subvisões de clipe", o problema foi resolvido. :)
fonte
Verificar "Subvisões de clipe" diretamente no Storyboard / Xib também funcionou para mim.
fonte
Minhas sub-visualizações foram redimensionadas e eu percebi que era porque o xib tinha o layout automático definido:
fonte
Se tudo falhar,
faça os clipes nos limites do método viewDidLayoutSubviews.
Exemplo:
fonte