1

В Xcode 8.2.1 и Swift 3 У меня есть UICollectionView внутри UITableViewCell, но я не могу правильно подобрать макет. в основном я хочу видеть всю звезду. Я могу настроить размер звезды, но я хочу исправить основную проблему, расширяя синюю полосу.Swift UICollectionView в динамическом макете UITableViewCell не может изменить высоту ячейки

Вот краткий обзор красной полосы contentView, а синяя полоса - коллекцияView. На первый взгляд, похоже, что высота коллекцииView - это проблема, но на самом деле она скрыта чем-то другим. Я не могу найти или изменить то, что скрывает ячейку 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 Hierarchy в панели отладки. Кроме того, перейдите в Debug \ View Debugging \ Capture View Hierarchy.

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)