【问题标题】:crash while scrolling through the TableView which haves a Collectionview in it滚动浏览其中包含 Collectionview 的 UITableView 时崩溃
【发布时间】:2016-06-13 16:49:46
【问题描述】:

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

在尝试了几种互联网上可用的解决方案后,我使用了这个@Pablo Romeu's answer 我尝试了他的解决方案,现在我得到了一个带有 collectionView 单元格的 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

【问题讨论】:

    标签: ios uitableview swift2 uicollectionview


    【解决方案1】:

    你的问题停留在这一行

    return self.collectionView.collectionViewLayout.collectionViewContentSize()
    

    我已经替换为

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

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

    【讨论】:

    • @Rienier 感谢您的回复,我对此感到厌烦,但它使应用程序崩溃,并带有 n 邀请循环的 NSLog 错误
    • 我正在审查是否可以解决此问题,我将通过编辑在我的答案中分享任何结果
    猜你喜欢
    • 2011-07-10
    • 2011-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多