2017-01-15 180 views
1

在Xcode 8.2.1和Swift 3中,我在UITableViewCell中有一個UICollectionView,但是我無法獲得正確的佈局。基本上我希望能夠看到所有的明星。我可以調整恆星的大小,但我想解決潛在的問題,擴大藍帶。UITableViewCell動態佈局中的Swift UICollectionView無法更改單元格高度

這是一個視圖的鏡頭紅色帶是contentView,藍色帶是collectionView。乍一看,它看起來像collectionView的高度是問題,但它實際上被其他東西隱藏。我無法找到或更改隱藏collectionView單元格的任何內容。

collectionView inside tableView cell

我不使用情節提要超越嵌入導航視圖控制器。

以下是所有相關的代碼。

class WishListsViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { 

var tableView: UITableView = UITableView()   
let tableCellId = "WishListsCell" 
let collectionCellId = "WishListsCollectionViewCell" 

override func viewDidLoad() { 
    super.viewDidLoad() 

    tableView.delegate = self   
    tableView.dataSource = self 
    tableView.backgroundColor = .white 
    tableView.register(WishListsCell.self, forCellReuseIdentifier: tableCellId) 
    self.view.addSubview(tableView) 
    tableView.translatesAutoresizingMaskIntoConstraints = false 

    tableView.topAnchor.constraint(equalTo: view.topAnchor).isActive = true 
    tableView.leadingAnchor.constraint(equalTo: view.leadingAnchor).isActive = true 
    tableView.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true 
    tableView.trailingAnchor.constraint(equalTo: view.trailingAnchor).isActive = true 
    } 

     func numberOfSections(in tableView: UITableView) -> Int {   
      return wishLists.count 
     } 

     func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
      return 1 
     } 

     func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell{   
      let cell = tableView.dequeueReusableCell(withIdentifier: tableCellId, for: indexPath) as! WishListsCell  
      return cell 
     } 

     func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {  
      return 100 
     } 

    func tableView(_ tableView: UITableView,willDisplay cell: UITableViewCell,forRowAt indexPath: IndexPath) { 

    guard let tableViewCell = cell as? WishListsCell else { return } 
    //here setting the uitableview cell contains collectionview delgate conform to viewcontroller 
     tableViewCell.setCollectionViewDataSourceDelegate(dataSourceDelegate: self, forSection: indexPath.section) 
    tableViewCell.collectionViewOffset = storedOffsets[indexPath.row] ?? 0 
} 

func tableView(_ tableView: UITableView,didEndDisplaying cell: UITableViewCell,forRowAt indexPath: IndexPath) { 

    guard let tableViewCell = cell as? WishListsCell else { return } 
    storedOffsets[indexPath.row] = tableViewCell.collectionViewOffset 
} 
} 

extension WishListsViewController: UICollectionViewDelegate , UICollectionViewDataSource, UICollectionViewDelegateFlowLayout { 

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: collectionCellId, for: indexPath) as! WishListsCollectionViewCell 
    return cell 
    } 

func collectionView(_ collectionView: UICollectionView, 
        layout collectionViewLayout: UICollectionViewLayout, 
        sizeForItemAt indexPath: IndexPath) -> CGSize { 
    return CGSize(width: 100, height: 100) 
} 

func collectionView(_ collectionView: UICollectionView, 
        layout collectionViewLayout: UICollectionViewLayout, 
        minimumInteritemSpacingForSectionAt section: Int) -> CGFloat { 
    return 1.0 
} 

func collectionView(_ collectionView: UICollectionView, layout 
    collectionViewLayout: UICollectionViewLayout, 
        minimumLineSpacingForSectionAt section: Int) -> CGFloat { 
    return 1.0 
} 

} 

class WishListsCell: UITableViewCell { 

private var collectionView: UICollectionView! 
let cellId = "WishListsCollectionViewCell" 


    var collectionViewOffset: CGFloat { 
     get { return collectionView.contentOffset.x } 
     set { collectionView.contentOffset.x = newValue } 
    } 


    func setCollectionViewDataSourceDelegate<D: protocol<UICollectionViewDataSource, UICollectionViewDelegate>> 
     (dataSourceDelegate: D, forSection section : Int) { 

     collectionView.delegate = dataSourceDelegate 
     collectionView.dataSource = dataSourceDelegate 
     collectionView.tag = section 
     collectionView.reloadData() 
    } 

    override func awakeFromNib() { 
     super.awakeFromNib() 
     // Initialization code 
    } 

    override init(style: UITableViewCellStyle, reuseIdentifier: String?) { 
     super.init(style: style, reuseIdentifier: reuseIdentifier) 

     let layout: UICollectionViewFlowLayout = UICollectionViewFlowLayout() 
     collectionView = UICollectionView(frame: contentView.frame, collectionViewLayout: layout) 
     collectionView.translatesAutoresizingMaskIntoConstraints = false 
     collectionView.backgroundColor = .blue 
     collectionView.register(WishListsCollectionViewCell.self, forCellWithReuseIdentifier: cellId) 
     contentView.backgroundColor = .red 
     self.contentView.addSubview(collectionView)   
    } 

    required init?(coder aDecoder: NSCoder) { 
     fatalError("init(coder:) has not been implemented") 
    } 
} 

class WishListsCollectionViewCell: UICollectionViewCell { 

    var imageView: UIImageView 

    override init(frame: CGRect) { 
     imageView = UIImageView() 
     super.init(frame: frame) 
     contentView.addSubview(imageView)   
     imageView.translatesAutoresizingMaskIntoConstraints = false 
     imageView.contentMode = .scaleAspectFit 
     contentView.translatesAutoresizingMaskIntoConstraints = false 
     imageView.backgroundColor = .white 

     NSLayoutConstraint.activate([ 

      NSLayoutConstraint(item: imageView, attribute: .width, relatedBy: .equal, 
           toItem: contentView, attribute: .width, 
           multiplier: 1.0, constant: 0.0), 

      NSLayoutConstraint(item: imageView, attribute: .height, relatedBy: .equal, 
           toItem: contentView, attribute: .height, 
           multiplier: 1.0, constant: 0.0), 

      ]) 
    }  
    required init?(coder aDecoder: NSCoder) { 
     fatalError("init(coder:) has not been implemented") 
    } 
} 

回答

3

可以使用View Debugging

運行該項目,回去Xcode和點擊調試工具欄中的調試視圖層次按鈕。或者,轉到Debug \ View Debugging \ Capture視圖層次結構。現在

enter image description here

您可以選擇紅色視圖和Xcode中會顯示選擇了哪個視圖。

enter image description here

欲瞭解更多信息。退房:View Debugging in Xcode

1

具體來說,問題是收集視圖框架沒有正確設置。這只是在接受的答案中我不知道的重要提示。

這個固定:

self.collectionView.frame = CGRect(0, 0, screenWidth, (screenWidth/4) * Constants.IMAGE_ASPECT_RATIO) 
相關問題