我试图检查传递给ViewController的字典是否有指向图像的链接。 如果它有链接,我想使用 AlamofireImage 显示图片。
如果没有,那么只需从scrollView中删除UIImageView,这样图像下方的其他项目就会粘在屏幕顶部。
以下是设置:
的UIScrollView
- >的UIView
- >的UIImageView
- > UILabel(标题的一些简短文本)
- > UILabel(一些用于使视图可滚动的内容的长文本)
我通过界面生成器和自动布局设置了我的视图,如下所示:
UIImageView:顶部,左侧,右侧,底部约束,高度为1:1宽高比:宽度没有特定高度/宽度
UILabel:顶部(所需优先级)图像,顶部(高优先级)顶部布局指南,右侧,左侧,底部约束
第二个UILabel:顶部,左侧,右侧,底部约束
内部ViewDidLoad
if let imageURLString = item["imageLink"] as? String {
let imageURL = NSURL(string: imageURLString)!
image.af_setImageWithURL(imageURL, placeholderImage: nil, filter: nil, imageTransition: .CrossDissolve(2), runImageTransitionIfCached: true, completion: nil)
}
else {
self.image.removeFromSuperview()
self.scrollView.setNeedsLayout()
}
使用此代码,当有链接时,它会加载图像,所有内容都会很好地显示而不会弄乱scrollView。但是从scrollView中删除它会阻止scrollView滚动。即使滚动条指示器出现并且视图"尝试"滚动,但一切都冻结了!
答案 0 :(得分:1)
你的UIScrollView
被冻结"因为它的内容视图不再大于滚动视图本身。这是因为当您从滚动视图中取出视图时,需要添加新约束,以便Auto-Layout可以重新计算内容视图的大小。
答案 1 :(得分:0)
在自动布局环境中,以编程方式添加或删除视图是不合适的,如果有必要,则必须注意相应的约束。在您的情况下,出现问题的是,您已将第一个标签的顶部空间设置为上方的imageView,并且您正在根据需求完全删除viewDidLoad中的imageView,这是处理自动布局的正确方法。
我可以建议你不要从你的superView中删除你的imageView,而只是将高度约束设置为imageView并将其初始高度约束常量设置为0,这样你就不能立即看到imageView了。只需更新约束并创建高度约束的出口并更改您的代码,如下所示 -
if let imageURLString = item["imageLink"] as? String {
let imageURL = NSURL(string: imageURLString)!
image.af_setImageWithURL(imageURL, placeholderImage: nil, filter: nil, imageTransition: .CrossDissolve(2), runImageTransitionIfCached: true, completion: nil)
imageViewHeightConstraint.constant = <heightYouWantToSet>
self.view.setLayoutIfNeeded()
} else {
imageViewHeightConstraint.constant = 0 //Hide imageView by setting its height to 0
self.view.setLayoutIfNeeded()
}
您可能还需要将imageView高度约束的优先级更改为“低”以防止违反约束