滚动浏览TableView时会崩溃,其中包含一个Collectionview

时间:2016-06-13 16:49:46

标签: ios uitableview swift2 uicollectionview

我遇到了这个问题(UICollectionView inside of UITableViewCell - AutoLayout

在尝试了几个可用于互联网的解决方案后,我来了@Pablo Romeu's answer我尝试了他的解决方案,现在我得到了一个带有collectionView单元格的TableView(它可以根据其中的内容动态改变其大小) )  但是当我滚动浏览我的tableview时,它会因此错误而崩溃:

    2016-06-13 22:05:51.546 WishMeluck[3507:425240] the behavior of the UICollectionViewFlowLayout is not defined because:
2016-06-13 22:05:51.546 WishMeluck[3507:425240] the item height must be less than the height of the UICollectionView minus the section insets top and bottom values, minus the content insets top and bottom values.
2016-06-13 22:05:51.546 WishMeluck[3507:425240] Please check the values return by the delegate.
2016-06-13 22:05:51.547 WishMeluck[3507:425240] The relevant UICollectionViewFlowLayout instance is <UICollectionViewFlowLayout: 0x7fb83c05de90>, and it is attached to <UICollectionView: 0x7fb83a0c7c00; frame = (0 82.5; 375 179); clipsToBounds = YES; autoresize = RM+BM; tag = 4; gestureRecognizers = <NSArray: 0x7fb83c05cf00>; layer = <CALayer: 0x7fb83c055fb0>; contentOffset: {0, 0}; contentSize: {539, 179}> collection view layout: <UICollectionViewFlowLayout: 0x7fb83c05de90>.
2016-06-13 22:05:51.547 WishMeluck[3507:425240] Make a symbolic breakpoint at UICollectionViewFlowLayoutBreakForInvalidSizes to catch this in the debugger.
2016-06-13 22:05:51.548 WishMeluck[3507:425240] the behavior of the UICollectionViewFlowLayout is not defined because:
2016-06-13 22:05:51.548 WishMeluck[3507:425240] the item height must be less than the height of the UICollectionView minus the section insets top and bottom values, minus the content insets top and bottom values.
2016-06-13 22:05:51.548 WishMeluck[3507:425240] Please check the values return by the delegate.
2016-06-13 22:05:51.548 WishMeluck[3507:425240] The relevant UICollectionViewFlowLayout instance is <UICollectionViewFlowLayout: 0x7fb83c05de90>, and it is attached to <UICollectionView: 0x7fb83a0c7c00; frame = (0 82.5; 375 179); clipsToBounds = YES; autoresize = RM+BM; tag = 4; gestureRecognizers = <NSArray: 0x7fb83c05cf00>; layer = <CALayer: 0x7fb83c055fb0>; contentOffset: {0, 0}; contentSize: {539, 179}> collection view layout: <UICollectionViewFlowLayout: 0x7fb83c05de90>.
2016-06-13 22:05:51.548 WishMeluck[3507:425240] Make a symbolic breakpoint at UICollectionViewFlowLayoutBreakForInvalidSizes to catch this in the debugger.
(lldb) 

如果有任何人知道,我无法弄清楚这个错误的原因那么请帮帮我

将此代码添加到我的TableViewCell

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

//        collectionViewContainer.frame = self.bounds;
//        collectionViewContainer.autoresizingMask = [.FlexibleWidth, .FlexibleHeight]

        let flow: UICollectionViewFlowLayout = (self.collectionView.collectionViewLayout as! UICollectionViewFlowLayout)
        // Configure the collectionView
        flow.minimumInteritemSpacing = 1
            // This enables the magic of auto layout.
            // Setting estimatedItemSize different to CGSizeZero
            // on flow Layout enables auto layout for collectionView cells.
            // https://developer.apple.com/videos/play/wwdc2014-226/
            flow.estimatedItemSize = CGSizeMake(1, 1)
        // Disable the scroll on your collection view
        // to avoid running into multiple scroll issues.
        self.collectionView.scrollEnabled = true
    }

    func bindWithModel(model: AnyObject) {
        // Do your stuff here to configure the tableViewCell
        // Tell the cell to redraw its contentView



        self.contentView.layoutIfNeeded()
    }

    // THIS IS THE MOST IMPORTANT METHOD
    //
    // This method tells the auto layout
    // You cannot calculate the collectionView content size in any other place,
    // because you run into race condition issues.
    // NOTE: Works for iOS 8 or later

    override func systemLayoutSizeFittingSize(targetSize: CGSize, withHorizontalFittingPriority horizontalFittingPriority: UILayoutPriority, verticalFittingPriority: UILayoutPriority) -> CGSize {
        // With autolayout enabled on collection view's cells we need to force a collection view relayout with the shown size (width)


        //self.collectionView.frame = CGRectMake(0, 0, targetSize.width, targetSize.height)
        self.collectionView.layoutIfNeeded()
        // If the cell's size has to be exactly the content
        // Size of the collection View, just return the
        // collectionViewLayout's collectionViewContentSize.
        return self.collectionView.collectionViewLayout.collectionViewContentSize()
    }

这在我的CollectionViewCell中:

    class CollectionViewCell: UICollectionViewCell {

    @IBOutlet var imgView: UIImageView!


    override func awakeFromNib() {

        self.contentView.setNeedsLayout()
    }


}

这也在我的TableViewController中:

    // Enable automatic row auto layout calculations
self.tableView.rowHeight = UITableViewAutomaticDimension;
// Set the estimatedRowHeight to a non-0 value to enable auto layout.
self.tableView.estimatedRowHeight = 100

我的项目file

1 个答案:

答案 0 :(得分:1)

你的问题留在这一行

return self.collectionView.collectionViewLayout.collectionViewContentSize()

我已经用

取代了
return CGSizeMake(self.collectionView.collectionViewLayout.collectionViewContentSize().width, 300);

并且不要崩溃,但我确信这不是您想要的,所以也许您可以通过此提示更好地看到问题