viewforsupplementaryelementofkind section collection ios uitableview ios6 uicollectionview

ios - section - uicollectionview supplementary view



¿Cómo obtener el rect de un UICollectionViewCell? (6)

UITableView tiene el método rectForRowAtIndexPath: pero esto no existe en UICollectionView. Estoy buscando una manera bonita y limpia de agarrar el rectángulo delimitador de una celda, tal vez una que pueda agregar como categoría en UICollectionView .


En Swift 4:

override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) NotificationCenter.default.addObserver(self, selector: #selector(deviceRotated), name: NSNotification.Name.UIDeviceOrientationDidChange, object: nil) } override func viewWillDisappear(_ animated: Bool) { NotificationCenter.default.removeObserver(self, name: NSNotification.Name.UIDeviceOrientationDidChange, object: nil) } @objc func deviceRotated() { if UIDeviceOrientationIsLandscape(UIDevice.current.orientation) { print("Landscape") } if UIDeviceOrientationIsPortrait(UIDevice.current.orientation) { print("Portrait") } }

Elimina al observador para evitar problemas de pérdida de memoria y rendimiento.


La mejor manera que he encontrado para hacer esto es la siguiente:

UICollectionViewLayoutAttributes *attributes = [self.collectionView layoutAttributesForItemAtIndexPath:indexPath];

Luego puede acceder a la ubicación a través de attributes.frame o attributes.center


Qué tal si

-(CGRect)rectForCellatIndexPath:(NSIndexPath *)indexPath { UICollectionViewCell *cell = [self cellForItemAtIndexPath:indexPath]; if (!cell) { return CGRectZero; } return cell.frame; }

como una categoría en UICollectionView ?

#import <UIKit/UIKit.h> @interface UICollectionView (CellFrame) -(CGRect)rectForCellatIndexPath:(NSIndexPath *)indexPath; @end #import "UICollectionView+CellFrame.h" @implementation UICollectionView (CellFrame) -(CGRect)rectForCellatIndexPath:(NSIndexPath *)indexPath { UICollectionViewCell *cell = [self cellForItemAtIndexPath:indexPath]; if (!cell) { return CGRectZero; } return cell.frame; } @end


Solo se requieren dos líneas de código para obtener el marco perfecto:

UICollectionViewLayoutAttributes * theAttributes = [collectionView layoutAttributesForItemAtIndexPath:indexPath]; CGRect cellFrameInSuperview = [collectionView convertRect:theAttributes.frame toView:[collectionView superview]];


de manera rápida, solo puede hacer:

//for any cell in collectionView let rect = self.collectionViewLayout.layoutAttributesForItemAtIndexPath(clIndexPath).frame //if you only need for visible cells let rect = cellForItemAtIndexPath(indexPath)?.frame


en veloz 3

let theAttributes:UICollectionViewLayoutAttributes! = collectionView.layoutAttributesForItem(at: indexPath) let cellFrameInSuperview:CGRect! = collectionView.convert(theAttributes.frame, to: collectionView.superview)