How can a get the auto layout size of the UICollec

2020-05-13 20:12发布

Since iOS 8 [UIColletionViewCell systemLayoutSizeFittingSize:UILayoutFittingCompressedSize] returns a size with height of 0.

Here's what the code does:

To determine the size for cell in a UICollectionView in iOS 7 I use systemLayoutSizeFittingSize: on a cell defined in a xib file using auto layout. The size depends on the font size of an UILabel being a subview of the UICollectionViewCell in my xib file. The label's font is set to UIFontTextStyleBody. So basically the cell's size depends on the font size setting made in iOS 7.

Here is the code itself:

+ (CGSize)cellSize {
    UINib *nib = [UINib nibWithNibName:NSStringFromClass([MyCollectionViewCell class]) bundle:nil];

    // Assumption: The XIB file only contains a single root UIView.
    UIView *rootView = [[nib instantiateWithOwner:nil options:nil] lastObject];

    if ([rootView isKindOfClass:[MyCollectionViewCell class]]) {
        MyCollectionViewCell *sampleCell = (MyCollectionViewCell*)rootView;
        sampleCell.label.text = @"foo"; // sample text without bar

        [sampleCell setNeedsLayout];
        [sampleCell layoutIfNeeded];

        return [sampleCell systemLayoutSizeFittingSize:UILayoutFittingCompressedSize];
    }

    return CGSizeZero;

}

It works perfectly fine in iOS 7 but not in iOS 8. Unfortunately I have no clue why.

How can I get the auto layout size of the UICollectionViewCells in iOS 8?

PS: Using

 return [sampleCell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize];

instead of

 return [sampleCell systemLayoutSizeFittingSize:UILayoutFittingCompressedSize];

as somebody might suggest, doesn't make any difference.

8条回答
Emotional °昔
2楼-- · 2020-05-13 20:38

What you need to do is wrap all of your content in a container view, then call:

return [sampleCell.containerView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize];

Your cell should look like this: cell -> containerView -> sub views

This works on both ios7 & ios8.

Supposedly on ios8, all you have to do is set the estimateSize & cell will automatically auto size on its own. Apparently that's not working as of beta 6.

查看更多
Animai°情兽
3楼-- · 2020-05-13 20:40

Looks like this officially a bug: I filed a report that was closed as a duplicate of this one

Will report back when Beta 6 is out.

[Update: working properly in the GM seed of iOS 8, and the bug has been closed by Apple.]

查看更多
闹够了就滚
4楼-- · 2020-05-13 20:46

maybe you have some wrong constrain, you should specify both virtical top space and bottom space between your UIView and contentView, i also had this issue before, that is because i just specified the virtical top space, and didn't specfied the virtical bottom space to contentView

查看更多
神经病院院长
5楼-- · 2020-05-13 20:52

I had the same issue for UITableViewCells and iOS 7 (ios8 works perfectly), but "Triet Luong" solution worked for me:

return [sampleCell.containerView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize];
查看更多
做自己的国王
6楼-- · 2020-05-13 20:52

It was a bug in iOS 8 beta versions. Finally it is fixed with for iOS 8 GB (Build 12A365). So for me now it works with the same code I wrote for iOS 7. (see the question)

查看更多
女痞
7楼-- · 2020-05-13 20:53

This is not a bug, I have been grappling with this issue now for some time and have tried different things, I am giving below the steps that's worked for me:

1) use contentView [sampleCell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize];

2) you can create your own contentView and have the subViews added to the contentView, don't forget to pin the top, bottom and left and right of the contentView if you are using a custom contentView to the superView, if you don't do this then height will be 0, here also depending upon your requirements you can for. e.g not pin the bottom of the contentView to the superView so that the height of the view can vary, but pinning is important and pinning which one depends on your requirements.

3) set the constraints properly in interface builder depending upon your requirements, there are certain constraints that cannot be added in interface builder, but then you can add them in viewDidLoad of the viewController.

So my 2 cents input is that constraints have to be set properly in the interface builder for systemLayoutSizeFittingSize:UILayoutFittingCompressedSize to return correct dimensions, this is the solution guys.

查看更多
登录 后发表回答