目前,我在我的UITableView
的其中一個部分中嵌入了UICollectionViewCell
在UITableViewCell
。我知道如何在我的UITableView
的另一部分動態更改單元格的高度,因爲我在另一個UITableViewCell
中有UITextView
,它根據UITextView
中文本的數量動態更改單元格的高度。如何在Swift中動態更改包含UICollectionView單元格的UITableView單元的高度?
我的問題是關於UITableViewCell
包含UICollectionViewCell
。我的UICollectionViewCell
有一排4張圖像,用戶可以使用UIImagePickerController
通過相機或照片庫添加。
目前我有它,當發生第5的圖片,UITableViewCell
的高度保持不變,但用戶可以像這樣在UICollectionViewCell
水平滾動:
而我的故事板:
漂亮的不言自明,但如果只有4張圖像,UITableViewCell
與screenshoot 1保持一致,但如果UICollectionViewCell
的高度發生變化,則單元格的高度會動態變化。
我已將UICollectionView
的滾動方向設置爲vertical。在進一步解釋,這是我的部分代碼:
class TestViewController: UITableViewController, UITextFieldDelegate, UITextViewDelegate, UIImagePickerControllerDelegate
{
override func viewDidLoad()
{
super.viewDidLoad()
....
tableView.estimatedRowHeight = 40.0
tableView.rowHeight = UITableViewAutomaticDimension
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
{
var cell: UITableViewCell = UITableViewCell()
if indexPath.section == 1
{
cell = tableView.dequeueReusableCell(withIdentifier: "TextViewCell", for: indexPath)
let textView: UITextView = UITextView()
textView.isScrollEnabled = false
textView.delegate = self
cell.contentView.addSubview(textView)
}
else if indexPath.section == 4
{
if let imagesCell = tableView.dequeueReusableCell(withIdentifier: "ImagesCell", for: indexPath) as? CustomCollectionViewCell
{
if images_ARRAY.isEmpty == false
{
imagesCell.images_ARRAY = images_ARRAY
imagesCell.awakeFromNib()
}
return imagesCell
}
}
return cell
}
....
override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat
{
if indexPath.section == 1
{
return UITableViewAutomaticDimension
}
else if indexPath.section == 4
{
//return 95.0
return UITableViewAutomaticDimension
}
return 43.0
}
....
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any])
{
if let selectedImage = info[UIImagePickerControllerOriginalImage] as? UIImage
{
if let cell = tableView.cellForRow(at: IndexPath(row: 0, section: 4)) as? CustomCollectionViewCell
{
cell.images_ARRAY.append(selectedImage)
cell.imagesCollectionView.reloadData()
}
}
picker.dismiss(animated: true, completion: nil)
}
....
func textViewDidChange(_ textView: UITextView)
{
...
// Change cell height dynamically
tableView.beginUpdates()
tableView.endUpdates()
}
}
class CustomCollectionViewCell: UITableViewCell, UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout
{
@IBOutlet var imagesCollectionView: UICollectionView!
var images_ARRAY = [UIImage]()
var images = [INSPhotoViewable]()
override func awakeFromNib()
{
super.awakeFromNib()
for image in images_ARRAY
{
images.append(INSPhoto(image: image, thumbnailImage: image))
}
imagesCollectionView.dataSource = self
imagesCollectionView.delegate = self
}
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int
{
return images_ARRAY.count
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell
{
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "CollectionViewCell", for: indexPath) as! ExampleCollectionViewCell
cell.populateWithPhoto(images[(indexPath as NSIndexPath).row]
return cell
}
....
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets
{
return UIEdgeInsetsMake(0.0, 25.0, 0.0, 25.0)
}
}
本來,我indexPath.section == 4
,其中包含UICollectionViewCell
返回的的高度,但我評論說出來和返回UITableViewAutomaticDimension
取而代之。我會假設調整了單元格的高度以適合第5個圖像,但是單元格保持靜態高度,即使UICollectionViewCell
的高度發生了變化,也允許我在該靜態高度內垂直滾動。
我知道這些都是一些問題,我發現非常相似,我的情況,但他們沒有幫我解決我的具體問題:
- Swift: Expand UITableViewCell height depending on the size of the UICollectionView inside it
- Auto Height of UICollectionView inside UITableViewCell
- UICollectionView inside a UITableViewCell — dynamic height?
隨着一些答案和建議,我添加了以下內容:
imagesCell.images_ARRAY = images_ARRAY
imagesCell.awakeFromNib()
// Added code
imagesCell.frame = tableView.bounds
tableView.setNeedsLayout()
tableView.layoutIfNeeded()
但是,這並沒有任何效果。任何人都可以在正確的方向上指出我需要什麼代碼並放置在哪裏?
謝謝!