2016-02-25 105 views
0

我试图检查传递给ViewController的字典是否有指向图像的链接。 如果它有一个链接,我想显示图片,使用AlamofireImage从UIScrollView中删除子视图并更新视图

如果没有,那么简单地从滚动视图中删除的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能够滚动。即使滚动条指示灯显示,视图“尝试”滚动,但一切都会被冻结!

回答

0

在自动布局环境中,以编程方式添加或删除视图是不好的,如果有必要,那么您必须照顾各自的约束。在你的情况下,出现问题的是,你已经将第一个标签的顶部空间设置为它上面的imageView,并且根据需要,完全移除viewDidLoad中的imageView,这是不正确的处理自动布局的方式。

我可以建议你不要删除你的imageView从它的超级查看,而只是设置高度约束到imageView,并将其初始高度约束常数设置为0,所以你现在无法看到imageView。只需更新constraits和创建高度约束的出口与如下修改代码 -

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

+0

您的回答有效。即使没有图像,将初始高度约束设置为低优先级也会执行该作业。我试图在设置图像之前和之后打印ScrollView和UIImageView的contentSize和约束。我在那里感兴趣的是,如果你没有在ImageView中放置图像,ImageView和ScrollView将不会有任何contentSize约束。你知道为什么会这样吗?即使我的ImageView的纵横比为1:1? – Mehrdadmaskull

+0

其全部归因于内在内容大小。就像UILabel和UIButton根据其内容调整自己的大小一样,UIImageView也根据它将要保存的图像的大小自行调整大小。 内在内容大小对于标签和按钮非常有用,但对于UIImageView来说不太好。因为要设置为UIImageView的图像实际上可能大于屏幕大小,因此我们不希望图像视图与图像本身一样大。 –

1

UIScrollView被“冻结”,因为它的内容的看法是不超过滚动视图本身更长更大。这是因为,当您从一个滚动视图中取出一个视图时,您需要添加新的约束,以便自动布局可以重新计算内容视图的大小。