UITableView имеет метод rectForRowAtIndexPath:, но его нет в UICollectionView. Я ищу хороший чистый способ захватить ограничивающий прямоугольник ячейки, возможно, тот, который я мог бы добавить в качестве категории на UICollectionView.
Как получить прямоугольник UICollectionViewCell?
Ответы (5)
Лучший способ, который я нашел для этого, заключается в следующем:
Цель-C
UICollectionViewLayoutAttributes *attributes = [self.collectionView layoutAttributesForItemAtIndexPath:indexPath];
Свифт
let attributes = collectionView.layoutAttributesForItem(at: indexPath)
Затем вы можете получить доступ к местоположению через attributes.frame или attributes.center
person
simon
schedule
24.09.2012
Это даст абсолютную позицию ячейки, связанную с супервизором
CGRect cellFrameInSuperview = [self.collectionView convertRect:attributes.frame toView:[self.collectionView superview]];
- person Maverick; 16.11.2015
Для получения идеального кадра требуется всего две строки кода:
Цель-C
UICollectionViewLayoutAttributes * theAttributes = [collectionView layoutAttributesForItemAtIndexPath:indexPath];
CGRect cellFrameInSuperview = [collectionView convertRect:theAttributes.frame toView:[collectionView superview]];
Свифт 4.2
let theAttributes = collectionView.layoutAttributesForItem(at: indexPath)
let cellFrameInSuperview = collectionView.convert(theAttributes.frame, to: collectionView.superview)
person
Shaik Riyaz
schedule
11.05.2015
Это то, что я искал, это дает вам обновленный кадр при прокрутке.
- person Marc; 08.01.2016
в свифт 3
let theAttributes:UICollectionViewLayoutAttributes! = collectionView.layoutAttributesForItem(at: indexPath)
let cellFrameInSuperview:CGRect! = collectionView.convert(theAttributes.frame, to: collectionView.superview)
person
Spydy
schedule
24.02.2017
быстро вы можете просто сделать:
//for any cell in collectionView
let rect = self.collectionViewLayout.layoutAttributesForItemAtIndexPath(clIndexPath).frame
//if you only need for visible cells
let rect = cellForItemAtIndexPath(indexPath)?.frame
person
Victor --------
schedule
07.05.2015
Как насчет
-(CGRect)rectForCellatIndexPath:(NSIndexPath *)indexPath {
UICollectionViewCell *cell = [self cellForItemAtIndexPath:indexPath];
if (!cell) {
return CGRectZero;
}
return cell.frame;
}
как категория на 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
person
TimD
schedule
20.09.2012
Это работает, но дает кадр ячейки, как он находится в своей собственной иерархии представлений (это означает, что каждая ячейка будет иметь начало {0,0}). Мне нужно знать, что такое прямоугольник в представлении таблицы.
- person akaru; 23.09.2012
Используйте метод
convertRect:toView: UIView для преобразования прямоугольника относительно представления коллекции.
- person TimD; 24.09.2012
Путь cellForItemAtIndexPath возвращает значение только для видимых ячеек. Если ячейка в indexPath находится за пределами экрана, она возвращает nil.
- person Ashley Mills; 10.10.2013
Отлично работает для видимых ячеек, и OP не указал видимые ячейки или нет.
- person phatmann; 16.04.2014
Работает только для видимых ячеек!
- person skywinder; 15.05.2014
Ваше решение в порядке; однако я бы изменил его с помощью метода convertRect:toView:, как было предложено. Это по двум причинам: 1) это единственная причина для получения прямоугольника ячейки таким образом; 2) это неотъемлемая часть функциональности быстрого просмотра. То, что это работает только для видимых ячеек, является хромой критикой по причине № 2; вам никогда не понадобится прямоугольник внеэкранной ячейки, поэтому средства для этого не предусмотрены никаким другим фреймворком. Я проголосовал за ваш ответ и сегодня намерен использовать его в своем текущем проекте.
- person James Bush; 15.12.2016
@JamesBush, я не согласен с вашим комментарием. Во-первых, я бы не стал дополнять его методом
convertRect:toView:, так как он слишком специфичен и не всем нужен. Или, может быть, кому-то нужно преобразовать его в superview of the superview` представления коллекции, но вы, по сути, говорите, что нужно принять иерархию представления. Во-вторых, вы также предполагаете варианты использования людей. Мне, например, действительно нужен прямоугольник внеэкранной ячейки.
- person Iulian Onofrei; 07.05.2019
это прямоугольник для ячейки с родителем, а не для collectionView, вы увидите x, y = 0
- person famfamfam; 03.04.2021