Estou usando o SnapKit para layout automático no meu aplicativo iOS.
Preciso mostrar uma visualização de imagem no topo da tela. Ela terá uma imagem de altura e largura dinâmicas. Preciso que sua borda superior esteja alinhada com o topo da visualização. Preciso que ela esteja centralizada horizontalmente. Preciso que ela tenha uma margem esquerda e direita da tela maior ou igual a 10. Preciso que sua altura seja dinâmica com base no conteúdo com altura máxima igual a 300. Preciso que ela mantenha sua proporção e reduza sua largura ou altura conforme necessário automaticamente usando o layout automático.
Achei que o código abaixo deveria fazer o trabalho:
let padding = 10.0
let preview = UIImageView()
preview.setContentHuggingPriority(.required, for: .vertical)
preview.setContentHuggingPriority(.required, for: .horizontal)
preview.backgroundColor = .red
preview.contentMode = .scaleAspectFit
let image = UIImage(named: "demo3")!
preview.image = image
preview.clipsToBounds = true
view.addSubview(preview)
preview.snp.makeConstraints { make in
make.top.equalTo(view.safeAreaLayoutGuide.snp.top)
make.centerX.equalToSuperview()
make.left.right.greaterThanOrEqualToSuperview().inset(padding).priority(.required)
make.height.lessThanOrEqualTo(300).priority(.required)
make.width.equalTo(preview.snp.height).multipliedBy(image.size.width / image.size.height).priority(.required)
}
Isso parece funcionar bem para imagens de paisagem (largura maior que altura), mas não funciona em imagens de retrato:
Trabalhos em imagens de paisagens:
Falha em imagens de retrato. Observe como a altura não é mais lessThanOrEqualTo(300)
:
Isso ocorre porque o Xcode imprime um aviso de que não foi possível satisfazer as restrições e foi necessário quebrar a restrição de altura:
Unable to simultaneously satisfy constraints.
Probably at least one of the constraints in the following list is one you don't want.
Try this:
(1) look at each constraint and try to figure out which you don't expect;
(2) find the code that added the unwanted constraint or constraints and fix it.
(
"<SnapKit.LayoutConstraint:[email protected]#54 UIImageView:0x7f81b19101e0.centerX == UIView:0x7f81b183dc30.centerX>",
"<SnapKit.LayoutConstraint:[email protected]#55 UIImageView:0x7f81b19101e0.right >= UIView:0x7f81b183dc30.right - 12.0>",
"<SnapKit.LayoutConstraint:[email protected]#56 UIImageView:0x7f81b19101e0.height <= 300.0>",
"<SnapKit.LayoutConstraint:[email protected]#57 UIImageView:0x7f81b19101e0.width == UIImageView:0x7f81b19101e0.height * 0.666748046875>",
"<NSLayoutConstraint:0x600003e37a20 'UIView-Encapsulated-Layout-Width' UIView:0x7f81b183dc30.width == 430 (active)>"
)
Will attempt to recover by breaking constraint
<SnapKit.LayoutConstraint:[email protected]#56 UIImageView:0x7f81b19101e0.height <= 300.0>
Eu esperava que ele reduzisse sua largura, mantendo a proporção de aspecto para satisfazer as condições. Mas não faz isso.
Acho que o que você precisa aqui é substituir
com
Para mim funciona perfeitamente agora!