Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Auto Layout in UICollectionViewCell not working

I have a simple UICollectionView with cells that have a single UITextView. The UITextView is constrained to the edges of the cell, so they should stay the same size as the cell size.

The problem I'm having is that for some reason these constraints are not working when I specify the cell size via collectionView:layout:sizeForItemAtIndexPath:.

I have the cell size set to 320x50 in the Storyboard. If I return a size with 2 times the height of the cell size with sizeForItemAtIndexPath:, the UITextView stays the same height despite the constraints I set. I am using Xcode 6 GM.

My view controller code is:

@implementation TestViewController  - (void)viewDidLoad {     [super viewDidLoad];      self.collectionView.delegate = self;     self.collectionView.dataSource = self; }  - (void)viewDidAppear:(BOOL)animated {     [super viewDidAppear:animated];      UICollectionViewCell *c = [self.collectionView cellForItemAtIndexPath:[NSIndexPath indexPathForItem:0 inSection:0]];      NSLog(@"%f", c.frame.size.height);      UITextView *tv = (UITextView *)[c viewWithTag:9];     NSLog(@"%f", tv.frame.size.height);  }  - (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {     return 1; }  - (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {     UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"cell" forIndexPath:indexPath];      return cell; }  - (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath {     UICollectionViewFlowLayout *flowLayout = (UICollectionViewFlowLayout *)collectionView.collectionViewLayout;      CGSize size = flowLayout.itemSize;      size.height = size.height * 2;      return size; }  @end 

Those logs in viewDidAppear: give me an output of:
100.00000
50.00000
As you can see, the UITextView height doesn't change with the cell height.


Here's a screenshot of the storyboard I set up with a UITextView constrained in the UICollectionViewCell:

enter image description here

I know using auto layout constraints works fine with UITableViewCells and dynamic resizing. I have no idea why it's not working in this case. Does anyone have any ideas?

like image 779
ryanthon Avatar asked Sep 12 '14 09:09

ryanthon


People also ask

How do I enable auto layout in Xcode?

Create a new Xcode project. Select Single view app and name it AutoLayout. Leave the defaults unchecked: Use core data.

What is Uicollectionviewflowlayout?

A layout object that organizes items into a grid with optional header and footer views for each section.


2 Answers

Well, I just looked on the iOS developer forums. Apparently, this is a bug with the iOS 8 SDK running on iOS 7 devices. The workaround is to add the following to your subclass of UICollectionViewCell:

- (void)setBounds:(CGRect)bounds {     [super setBounds:bounds];     self.contentView.frame = bounds; } 
override var bounds: CGRect {     didSet {       contentView.frame = bounds     } } 
like image 143
ryanthon Avatar answered Sep 28 '22 08:09

ryanthon


Equivalent Swift Code :

override var bounds: CGRect {     didSet {       contentView.frame = bounds     } } 
like image 26
HamzaGhazouani Avatar answered Sep 28 '22 09:09

HamzaGhazouani