2017-06-12 87 views
2

我試圖在UITableViewController中的兩個元素之間添加約束,到目前爲止,我還沒有做到。在UITableViewController裏面,但在UITableView Cell之外的UIImage視圖。在UIImageView和UITableViewCell之間添加NSLayoutConstraint

我既不能使用StoryBoard,也不能用編程方式添加約束,因爲Xcode告訴我,我無法在要重用的對象上添加約束。

我試圖添加約束的原因是因爲UIImageView動態調整大小的下載圖像的大小。無論何種原因無法下載圖像時,都會使用默認圖像,整個版面會分開。

這裏是我的tableView的樣子:

enter image description here

+0

你有沒有考慮加入您的UIImageView到的UITableViewCell和將它作爲tableView中的第一個單元格,並在每次從服務器獲取圖像時更改單元格的高度? –

+0

@noir_eagle,不,我沒有,但這是一個好主意。我會給它一個鏡頭。謝謝。 – Sicypher

+0

@noir_eagle你應該發表你的評論作爲答案。我會接受它作爲最好的答案,因爲它最適合我。 – Sicypher

回答

1

您可以考慮來包裝你UIImageViewUITableViewCell,並把它作爲UITableView第一個單元格。此外,您可以將表格視圖中的單元格層次細分爲兩部分,這樣可以簡化對單元格的跟蹤。所以第一部分將只包含UIImageView單元格,第二部分將包含您的主單元格。

每當你會得到從網絡請求表示該圖像獲取的響應,你可以調用tableView.reloadSections(IndexSet(integer: 0), with: .none)和委託方法返回正確的高度

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) { 
    if indexPath.section == 0 { 
    return imageHeight 
    } 
} 
1

的問題是,限制設置兩個對象之間的關係。由於您的tableViewCell將被重用,因此您無法將約束設置爲在單元格外對象。

實際上,您可以獲取單元格上圖像的大小,並根據cellImageView大小以編程方式將約束設置到ImageView外部。

例如,如果下載的圖像寬度是imageCellWidth,並且您的超大圖像應該是2倍大。

NSLayoutConstraint *imageViewWidth = [NSLayoutConstraint 
            constraintWithItem:imageView 
            attribute:NSLayoutAttributeWidth 
            relatedBy:NSLayoutRelationEqual 
            toItem:nil 
            attribute:NSLayoutAttributeNonAnAttribure 
            multiplier:1.0f 
          constant:imageCellWidth*2]; 
[imageView addConstraint: imageViewWidth]; 

如果您需要動態改變這個約束,只是改變恆定值

imageViewWidth.constant = newWidth; 
相關問題