【发布时间】:2019-03-12 18:32:24
【问题描述】:
我正在使用 Kingfisher 加载许多远程图像,并且很难将它们正确加载到具有动态高度单元格的 Tableview 中。 我的目标是让图像始终是屏幕的全宽和动态高度,如何实现?
我之前问了一个相关问题,这导致使用堆栈视图了解基本布局:SnapKit: How to set layout constraints for items in a TableViewCell programatically
所以我构建了如下内容:
使用以下代码(为简洁起见,删除了一些部分):
// CREATE VIEWS
let containerStack = UIStackView()
let header = UIView()
let headerStack = UIStackView()
let title = UILabel()
let author = UILabel()
var previewImage = UIImageView()
...
// KINGFISHER
let url = URL(string: article.imageUrl)
previewImage.kf.indicatorType = .activity
previewImage.kf.setImage(
with: url,
options: [
.transition(.fade(0.2)),
.scaleFactor(UIScreen.main.scale),
.cacheOriginalImage
]) { result in
switch result {
case .success(_):
self.setNeedsLayout()
UIView.performWithoutAnimation {
self.tableView()?.beginUpdates()
self.tableView()?.endUpdates()
}
case .failure(let error):
print(error)
}
}
...
// LAYOUT
containerStack.axis = .vertical
headerStack.axis = .vertical
headerStack.spacing = 6
headerStack.addArrangedSubview(title)
headerStack.addArrangedSubview(author)
header.addSubview(headerStack)
containerStack.addArrangedSubview(header)
containerStack.addSubview(previewImage)
addSubview(containerStack)
headerStack.snp.makeConstraints { make in
make.edges.equalToSuperview().inset(20)
}
containerStack.snp.makeConstraints { make in
make.edges.equalToSuperview()
}
没有imageView 的约束,图像不会出现。
使用以下约束,图像也不会出现:
previewImage.snp.makeConstraints { make in
make.leading.trailing.bottom.equalToSuperview()
make.top.equalTo(headerView.snp.bottom).offset(20)
}
通过其他尝试,图像完全倾斜或与标签/其他单元格和图像重叠。
最后,遵循此评论:With Auto Layout, how do I make a UIImageView's size dynamic depending on the image? 和此要点:https://gist.github.com/marcc-orange/e309d86275e301466d1eecc8e400ad00 以及这些约束 make.edges.equalToSuperview() 我能够让图像以正确的比例显示,但它们完全覆盖了标签。
理想情况下应该是这样的:
【问题讨论】:
-
你没有做正确的约束。
-
@ElTomato 是的,我认为这是约束的问题,再加上远程图像的一些复杂性等,您对如何最好地进行有什么建议吗?我还认为 StackViews 应该减少对大多数约束的需求。
-
用你的约束代码替换你显示的代码。翠鸟与你的问题没有任何关系。一般来说,您可以摆脱外部堆栈视图和标题视图。您可能还想阅读有关内容拥抱和抗压缩优先级的文档。
-
@MartinM 对不起,我不完全确定您所说的“用约束代码替换您显示的代码”是什么意思。我觉得我尝试的所有限制都是有问题的。 (或者你的意思是隐藏翠鸟代码,因为它不相关)。在链接的线程中,提到使用StackView的人,否则,它怎么知道在单元格内排列项目?
-
在您的服务中添加
aspect ratio或width字段