Как получить позицию выбранного элемента представления коллекции? - PullRequest
0 голосов
/ 05 февраля 2019

В моем проекте есть сетка пользователей.Я сделал сетку, используя вид коллекции.Когда пользователь нажимает на ячейку, мне нужно положение или кадр выбранной ячейки.Я использовал сенсорное событие просмотра, но оно не работает в случае представления коллекции.

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    let touch = touches.first!
    let location = touch.location(in: self.view)
    print(location)
}

также этот метод работает, когда вы касаетесь остальных элементов UIView и ожидаете коллекции collectionView.

Ответы [ 5 ]

0 голосов
/ 06 мая 2019

В основном вам нужно использовать:

let cPoint = collectionView.layoutAttributesForItem(at indexPath: IndexPath).center

Но после этого вам нужно преобразовать точку в систему координат вашего вида следующим образом:

let centerPoint = collectionView.convert(center ?? CGPoint.zero, to: collectionView.superview)

Вот полный кодфрагмент:

override func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {

    let attributes = self.collectionView?.layoutAttributesForItem(at:indexPath)
    let cPoint = attributes?.center

    /*
    this is nice. but when we scroll passed the visible items -
    we see that the point is given in the collectionView's coordinates.

    we need to convert the point to the collectionView.superview coordinate system
    */
    //solution:
    let centerPoint = collectionView.convert(cPoint, to: collectionView.superview)
}
0 голосов
/ 05 февраля 2019

Спасибо всем за хороший ответ, и я нашел решение для того же.

let cell = collectionView.cellForItem(at: indexPath) as! MyCollectionViewCell
let tap = CGPoint(x: 0, y: 0)
let convertedTap = cell.convert(tap, to: self.view)

Когда вы напечатаете convertedTap, вы получите точное положение ячейки элемента коллекции относительно вида.

0 голосов
/ 05 февраля 2019

indexPathsForSelectedItems возвращает массив путей индекса (так как может быть выбрано несколько элементов), поэтому вам нужно использовать:

let indexPaths : NSArray = self.collectionView!.indexPathsForSelectedItems()
let indexPath : NSIndexPath = indexPaths[0] as NSIndexPath

(вам, вероятно, следует проверить, есть ли несколькоэлементы выбираются и обрабатываются соответственно).

0 голосов
/ 05 февраля 2019

В UICollectionView делегате есть метод для достижения того, что вы хотите, и вы можете использовать его, чтобы узнать, в какой ячейке щелкнули:

- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath {
   YourCell *cell = [collectionView cellForItemAtIndexPath:indexPath];
   let frame = cell.layer.frame
   // here you can do what you want with frame
   // ...
}
0 голосов
/ 05 февраля 2019

Вы можете использовать следующий метод, чтобы получить атрибуты ячейки

func layoutAttributesForItem(at indexPath: IndexPath) -> UICollectionViewLayoutAttributes?

, а затем получить кадр, используя свойство frame

let attributes = self.collectionView.layoutAttributesForItem(at:indexPath)
let frame = attributes.frame

PS - вам может потребоваться преобразовать кадрячейка от UICollectionView до вида вашего контроллера, чтобы получить ее точное положение.

func convert(_ rect: CGRect, 
    from view: UIView?) -> CGRect

Нужно сделать трюк

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...