Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Programmatically setting the height of a UIView subview inside a cell of a UICollectionViewController?

Inside the reusable view of my cell, I have a UIView.

Then, I have this method in the controller

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {

    // .. set value for CGFloat backgroundHeight

    [cell addSubview:cell.backgroundView];

    CGRect f = cell.backgroundView.frame;
    f.size.height = backgroundHeight;
    cell.backgroundView.frame = f;

}

But the UIView's height remains the same as specified in the Layout Rectangle.

What should I try next?

like image 406
Zack Burt Avatar asked Mar 20 '14 04:03

Zack Burt


People also ask

How do I set the height and width of a collectionView cell?

Here's a WWDC video demoing this technique. class MyLayout: UICollectionViewFlowLayout { override func prepare() { super. prepare() guard let collectionView = collectionView else { return } itemSize = CGSize(width: ..., height: ...) } }

How do I change my collectionView height?

The approach for making this working is pretty simple, which involves adding a height constraint with the constant value set to collection view content height. Content height can be retrieved from the layout object. The constraint's constant value can be updated in viewWillLayoutSubviews.


2 Answers

Your problem here lies in the fact that you are attempting to use the cell's backgroundView.

Firstly, you cannot add the cell's backgroundView as a subview. You simply assign a UIView to it with :

cell.backgroundView = yourView;

Secondly, if you read the docs, it clearly states :

Use this property to assign a custom background view to the cell. The background view is placed behind the content view and its frame is automatically adjusted so that it fills the bounds of the cell.

This means, no matter what frame you try to set for the backgroundView it will automatically adjust and fill the entire cell. Now, I haven't actually tried it, but you might be able to override this by subclassing. Though, i'll mention here, I am unsure.

Back to your problem, if you really want a UIView that you can control, you will need to create a UIView and then add it as a subview. Using the cell's backgroundView is not the solution.

like image 151
n00bProgrammer Avatar answered Oct 27 '22 20:10

n00bProgrammer


It just seems like useless, what you'r approaching with the UICollectionViewCell's backgroundView . By the Doc

backgroundView The view that provides the background appearance.

@property (nonatomic, retain) UIView *backgroundView; Discussion The view (if any) in this property is positioned underneath all of the other content and sized automatically to fill the entire bounds of the collection view. The background view does not scroll with the collection view’s other content. The collection view maintains a strong reference to the background view object.

This property is nil by default, which displays the background color of the collection view.

the backgroundView is just nothing but the cell, so what you'r upto do is doesn't effect . seems like directly changing the Cell's height.

the best solution is to just ignore the backgroundView property all together. Instead, make the collection view’s background clear, and implement your own View; just throw a view behind the collection view.

Kindly check this blog, this would be helpful for you.

like image 28
Kumar KL Avatar answered Oct 27 '22 22:10

Kumar KL