Как получить прямоугольник UICollectionViewCell?

UITableView имеет метод rectForRowAtIndexPath:, но его нет в UICollectionView. Я ищу хороший чистый способ захватить ограничивающий прямоугольник ячейки, возможно, тот, который я мог бы добавить в качестве категории на UICollectionView.


person akaru    schedule 20.09.2012    source источник


Ответы (5)


Лучший способ, который я нашел для этого, заключается в следующем:

Цель-C

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

Свифт

let attributes = collectionView.layoutAttributesForItem(at: indexPath)

Затем вы можете получить доступ к местоположению через attributes.frame или attributes.center

person simon    schedule 24.09.2012
comment
Это даст абсолютную позицию ячейки, связанную с супервизором 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
comment
Это то, что я искал, это дает вам обновленный кадр при прокрутке. - 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
comment
Это работает, но дает кадр ячейки, как он находится в своей собственной иерархии представлений (это означает, что каждая ячейка будет иметь начало {0,0}). Мне нужно знать, что такое прямоугольник в представлении таблицы. - person akaru; 23.09.2012
comment
Используйте метод convertRect:toView: UIView для преобразования прямоугольника относительно представления коллекции. - person TimD; 24.09.2012
comment
Путь cellForItemAtIndexPath возвращает значение только для видимых ячеек. Если ячейка в indexPath находится за пределами экрана, она возвращает nil. - person Ashley Mills; 10.10.2013
comment
Отлично работает для видимых ячеек, и OP не указал видимые ячейки или нет. - person phatmann; 16.04.2014
comment
Работает только для видимых ячеек! - person skywinder; 15.05.2014
comment
Ваше решение в порядке; однако я бы изменил его с помощью метода convertRect:toView:, как было предложено. Это по двум причинам: 1) это единственная причина для получения прямоугольника ячейки таким образом; 2) это неотъемлемая часть функциональности быстрого просмотра. То, что это работает только для видимых ячеек, является хромой критикой по причине № 2; вам никогда не понадобится прямоугольник внеэкранной ячейки, поэтому средства для этого не предусмотрены никаким другим фреймворком. Я проголосовал за ваш ответ и сегодня намерен использовать его в своем текущем проекте. - person James Bush; 15.12.2016
comment
@JamesBush, я не согласен с вашим комментарием. Во-первых, я бы не стал дополнять его методом convertRect:toView:, так как он слишком специфичен и не всем нужен. Или, может быть, кому-то нужно преобразовать его в superview of the superview` представления коллекции, но вы, по сути, говорите, что нужно принять иерархию представления. Во-вторых, вы также предполагаете варианты использования людей. Мне, например, действительно нужен прямоугольник внеэкранной ячейки. - person Iulian Onofrei; 07.05.2019
comment
это прямоугольник для ячейки с родителем, а не для collectionView, вы увидите x, y = 0 - person famfamfam; 03.04.2021