How to increase the UICollectionview Cell Size equal to Screen Size in swift 4.2?
You need to change your cell size to fit the collectionview
. Add this in viewDidLoad
if let flow = self.collectionView.collectionViewLayout as? UICollectionViewFlowLayout {
flow.itemSize = self.collectionView.frame.size
}
how to set collection view cell as equal row cell for all screen
From the storyboard set CollectionViews Section Inset from size inspector as Top = 8, Bottom = 8, Left = 8 and Right = 8, it should look like as
And return size for cell as
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath {
//If you want your cell should be square in size the return the equal height and width, and make sure you deduct the Section Inset from it.
return CGSizeMake((self.view.frame.size.width/3) - 16, (self.view.frame.size.width/3) - 45);
}
Thats it, Nothing more. You should see the result as mine:
How to change CollectionView cell width according to label text in swift
All items in your collectionView are taking the exact same size because you have specified layout.itemSize
for your collectionView's flow layout
remove layout.itemSize = CGSize(width: self.collectionView.frame.size.width / 2, height: 80)
Other issues in code:
layout.invalidateLayout()
is unnecessary inViewDidLoad
if let layout = self.collectionView.collectionViewLayout as? UICollectionViewFlowLayout {
to setminimumInteritemSpacing
andminimumLineSpacing
is unnecessary, in a statement just above it you have createdlet layout = UICollectionViewFlowLayout()
why dont you simply setminimumInteritemSpacing
andminimumLineSpacing
there itself? Why use additionalif let
?
Simply write
let layout = UICollectionViewFlowLayout()
layout.scrollDirection = .horizontal
layout.minimumInteritemSpacing = 0
layout.minimumLineSpacing = 5
self.collectionView.collectionViewLayout = layout
You need not specify item size, Collection view flow layout is set to be horizontal in nature, so by default each item will take the same height as the collection view height and if you have only one label inside the cell and if you have set autolayout constraint properly, label's intrinsic content size will ensure cell gets proper width
And forwhatever reason if you decide to wrap the label inside a UIView
logic above holds good, as long as you set the label's autolayout constraint right, lablel's intrinsic content size will set the width of the containerView and which will in turn contribute to set the cell's width appropriately,
Here cell has background color of red, container view has orange and label has no background color, I have added leading and trailing spacing between cell and view as 10, and label and container view has leading and trailing space as 5
EDIT:
As OP is asking for constraints between container view, label and cell, I am updating answer to reflect the same
Clearly
- - - - - - - - - - - - Cell - - - - - - - - - - - - - - - -
| - - - - - - - - Container View - - - - - - - - |
| | |5 | |
|-10- |-5- Label -5-| -10- |
| | |5 | |
| - - - - - - - - - - - - - - - - - - - - - - - - - |
| |
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
You can add top and bottom constraint between cell and conatiner if you need, but I have kept container view vertically center to cell
How it works?
Label has intrinsic content-size which it gets from the text set to it, View does gets its intrinsic size based on the size of its subview, because there are no subviews in your container view, it gets its size from label and clearly whatever the size label returns view adds 10 to width and 10 to height ( 5 leading, 5 trailing, 5 top and 5 bottom) finally cell gets its size from its subviews, because there is only one subview (container view) it gets width from container view and for height it gets its height from collection view (as subviews dont provide enough data to calculate its height)
And if for some reason (might be because of some other constraints you have set knowingly / unknowingly like adding width constraint on container view) label is not taking its intrinsic content size correctly, you can always set setContentCompressionResistancePriority
and setContentHuggingPriority
on label to high in your cell's awake from nib
override func awakeFromNib() {
super.awakeFromNib()
self.label.setContentCompressionResistancePriority(.defaultLow, for: .horizontal)
self.label.setContentHuggingPriority(.defaultHigh, for: .horizontal)
}
Though this shouldnt be needed in usual case, if this is needed to get correct intrinsic size, there must be some other constraints which are preventing the label to take its proper implicit intrinsic content size, if I were in your position would rather check and fix it first. Nonetheless cant debug further with limited code you have provided.
EDIT 2:
Did not realize that OP is using custom instance of UICollectionViewFlowLayout
and has not set estimatedItemSize
property to automaticSize
let layout = UICollectionViewFlowLayout()
layout.scrollDirection = .horizontal
layout.minimumInteritemSpacing = 0
layout.minimumLineSpacing = 5
layout.estimatedItemSize = UICollectionViewFlowLayout.automaticSize
self.collectionView.collectionViewLayout = layout
How to dynamically size CollectionViewCell as per UILabel
You don't need to calculate the size of the strings that you want to display. Do the following:
- Set
collectionView
's height equal to the expected height of tags. - Set
tagLabel
'sleading
,trailing
,top
andbottom
constraints equal to the corresponding cell'scontentView
constraints. - Remove your implementation of
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize
. The cell size will be calculated automatically if you don't use a custom value forestimatedItemSize
. If you want to be sure, add(collectionView.collectionViewLayout as? UICollectionViewFlowLayout)?.estimatedItemSize = UICollectionViewFlowLayout.automaticSize
to the function where you setup all views.
You will see the following result:
How to set UICollectionViewCell Width and Height programmatically
Use this method to set custom cell height width.
Make sure to add this protocols
UICollectionViewDelegate
UICollectionViewDataSource
UICollectionViewDelegateFlowLayout
If you are using swift 5 or xcode 11 and later you need to set Estimate Size
to none
using storyboard in order to make it work properly. If you will not set that than below code will not work as expected.
Swift 4 or Later
extension YourViewController: UICollectionViewDelegate {
//Write Delegate Code Here
}
extension YourViewController: UICollectionViewDataSource {
//Write DataSource Code Here
}
extension YourViewController: UICollectionViewDelegateFlowLayout {
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
return CGSize(width: screenWidth, height: screenWidth)
}
}
Objective-C
@interface YourViewController : UIViewController<UICollectionViewDelegate,UICollectionViewDataSource,UICollectionViewDelegateFlowLayout>
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath
{
return CGSizeMake(CGRectGetWidth(collectionView.frame), (CGRectGetHeight(collectionView.frame)));
}
How to resize the collection view cells according to device screen size?
Implement sizeForItemAt
method according to the view's frame size
Swift
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
let height = view.frame.size.height
let width = view.frame.size.width
// in case you you want the cell to be 40% of your controllers view
return CGSize(width: width * 0.4, height: height * 0.4)
}
Objective C
- (CGSize)collectionView:(UICollectionView *)collectionView
layout:(UICollectionViewLayout *)collectionViewLayout
sizeForItemAtIndexPath:(NSIndexPath *)indexPath {
CGFloat height = self.view.frame.size.height;
CGFloat width = self.view.frame.size.width;
// in case you you want the cell to be 40% of your controllers view
return CGSizeMake(width * 0.4, height * 0.4);
}
Related Topics
Swift Bridging Header File Won't Work with Use_Frameworks
Swift: Obtain and Save the Updated Scnnode Over Time Using Projectpoint in Scenekit
How to Update Particular Value of Child in Firebase Db
Swift: Sort Array by Sort Descriptors
Drag Uibutton Without It Shifting to Center [Swift 3]
Nsurlsession/Nsurlconnection Http Load Failed (Kcfstreamerrordomainssl, -9802) on a Subdomain
Problems with Cropping a Uiimage in Swift
Wkwebview Decidepolicyfornavigationaction Being Call After the Long Press Recogniser Ended
Ios-Charts How to Put Uiimage Beside a Point
How to Pass Values from a Pop Up View Controller to the Previous View Controller
Uibezierpath + Cashapelayer - Animate a Circle Filling Up
Modeling Sub-Collections in Mongodb Realm Sync
Storyboard Localization in Swift 4.0
How to Update a Sent Message in Quickblox iOS
Pausing Timer When App Is in Background State Swift
How to Create an Image of Specific Size from Uiview
Iad Interstitials Not Showing Consistently? and Not at All on the Simulator