2015-06-25 7 views
0

У меня есть просмотр коллекции с 30 элементами и вы хотите что-то сделать на прессе. Я делаю это так:didSelectItemAtIndexPath, изменяющий несколько ячеек в UICollectionView

func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) { 

    let cell = collectionView.cellForItemAtIndexPath(indexPath) as! ItemCell 

    var translucentView = ILTranslucentView(frame: CGRectMake(0, 0, cell.contentView.frame.size.width, cell.contentView.frame.size.height)) 
    translucentView.translucentAlpha = 0.9 
    translucentView.translucentStyle = UIBarStyle.BlackTranslucent 
    translucentView.translucentTintColor = UIColor.clearColor() 
    translucentView.backgroundColor = UIColor.clearColor() 
    translucentView.alpha = 0.0 
    cell.contentView.addSubview(translucentView) 
    UIView.animateWithDuration(0.4, animations: { 
     translucentView.alpha = 1.0 
    }) 
} 

Функция работает, как ожидалось, однако, похоже, не только на повернутой клетки, но и на ячейке в том же положении, что не видно на экране вид. Итак, если на экране есть 3 видимые ячейки, и я нажимаю на номер 1, затем, когда я просматриваю вид, был добавлен в ячейку 4, 7 и т. Д.

ответ

1

UICollectionView повторно использовать клетки, как к UITableView. Когда ячейка прокручивается с экрана, она добавляется в очередь и будет повторно использоваться для последующей прокрутки следующей ячейки на экране (например, ячейка 4, 7 ...).

Просто удаления translucentView будет решить эту проблему:

UIView.animateWithDuration(0.4, animations: {() -> Void in 
    translucentView.alpha = 1.0 
}) { (finish) -> Void in 
    translucentView.removeFromSuperview() 
} 

Вы можете создать translucentView в ItemCell и обновить свой статус в cellForItemAtIndexPath метода:

override func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { 
    let cell = collectionView.dequeueReusableCellWithReuseIdentifier(CellIdentifier, forIndexPath: indexPath) as! ItemCell 

    if find(collectionView.indexPathsForSelectedItems() as! [NSIndexPath], indexPath) != nil { 
     cell.translucentView.alpha = 1.0 
    } else { 
     cell.translucentView.alpha = 0.0 
    } 

    return cell 
} 

override func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) { 

    let cell = collectionView.cellForItemAtIndexPath(indexPath) as! ItemCell 

    UIView.animateWithDuration(0.4, animations: { 
     cell.translucentView.alpha = 1.0 
    }) 
} 

override func collectionView(collectionView: UICollectionView, didDeselectItemAtIndexPath indexPath: NSIndexPath) { 
    let cell = collectionView.cellForItemAtIndexPath(indexPath) as! ItemCell 

    UIView.animateWithDuration(0.4, animations: { 
     cell.translucentView.alpha = 0.0 
    }) 
} 
+0

The translucentView должен оставаться там всегда, пока пользователь не нажмет снова на ячейку. Он может исчезнуть, когда пользователь прокручивает и эта ячейка больше не видна. – Alessandro

+0

Вы разрешаете множественный выбор в 'CollectionView'? – Bannings

+0

Нет, но что это связано с тем, что представление добавляется в несколько ячеек? – Alessandro

0

Вы правильно установили numberOfSectionsInTableView?

func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int  { 
    return 1 
} 
+0

Да что правильно установлен – Alessandro

Смежные вопросы