从UIScrollView中删除子视图并更新视图

时间:2016-02-25 23:23:10

标签: ios swift uiscrollview autolayout

我试图检查传递给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滚动。即使滚动条指示器出现并且视图"尝试"滚动,但一切都冻结了!

2 个答案:

答案 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高度约束的优先级更改为“低”以防止违反约束

enter image description here