2016-02-25 71 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被「凍結」,因爲它的內容的看法是不超過滾動視圖本身更長更大。這是因爲,當您從一個滾動視圖中取出一個視圖時,您需要添加新的約束,以便自動佈局可以重新計算內容視圖的大小。