Я хотел бы иметь кнопку, которая при нажатии выбирает случайный элемент в UICollectionView
, а затем прокручивается до него.Выделите и выделите случайную ячейку в UICollectionView
До сих пор, у меня есть этот код:
@IBAction func randomClicked(sender: UIButton) {
self.randomItem = Int(arc4random_uniform(UInt32(self.members.count)))
dispatch_async(dispatch_get_main_queue(), {
self.collectionView.reloadData()
self.collectionView.scrollToItemAtIndexPath(NSIndexPath(forRow: self.randomItem, inSection: 0), atScrollPosition: UICollectionViewScrollPosition.CenteredHorizontally, animated: true)
})
}
Это выдвигает на первый план ячейки, как я хочу (как я настроил стили в cellForIndexAtItem)
, однако вид не прокручивать все, я уверен. Я что-то очевидное отсутствует, но я не могу увидеть, что это
Я попытался более простую версию, просто чтобы проверить немного прокрутки:!.
@IBAction func randomClicked(sender: UIButton) {
self.collectionView.scrollToItemAtIndexPath(NSIndexPath(forRow: 30, inSection: 0), atScrollPosition: UICollectionViewScrollPosition.CenteredHorizontally, animated: true)
}
но опять-таки, нет скроллинг
Обновление: 27 февраля С тех пор я воссоздал весь вид, но проблема все еще сохраняется - без прокрутки! Вот полный код:
import Foundation
import UIKit
class GroupViewController : UIViewController, UICollectionViewDelegate, UICollectionViewDataSource {
@IBOutlet weak var collectionView: UICollectionView!
var random = -1
// pick a single random student to scroll to
@IBAction func randomClicked(sender: UIButton) {
self.random = Int(arc4random_uniform(UInt32(200)))
self.collectionView.reloadData() // reloads the visible cells, highlighting the random one
self.collectionView.scrollToItemAtIndexPath(NSIndexPath(forItem: self.random, inSection: 0), atScrollPosition: UICollectionViewScrollPosition.CenteredHorizontally, animated: true)
}
// 200 example cells
func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return 200
}
// draw the cells
func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCellWithReuseIdentifier("myCell", forIndexPath: indexPath) as! MyCollectionViewCell
cell.title.text = "Title"
cell.subtitle.text = "\(indexPath.row)"
cell.title.textColor = UIColor.whiteColor()
cell.subtitle.textColor = UIColor.whiteColor()
if(random == indexPath.row) {
cell.backgroundColor = UIColor.purpleColor()
} else {
cell.backgroundColor = UIColor.lightGrayColor()
}
return cell
}
// 4 columns per row
func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize {
let size = collectionView.frame.width
return CGSize(width: (size/4)-(24/4), height: (size/4)-(24/4))
}
}
Почему вы называете 'reloadData' первым? – Wain
Это приводит к перезагрузке ячеек - в cellForIndexAtItem, он проверяет, соответствует ли текущая ячейка случайным образом, и соответствующим образом задает цвет. Возможно, это не лучший способ сделать это (открыть предложения!). Однако, даже без этой строки, он не работает, поэтому я предполагаю, что это не проблема здесь? – Ben
перезагрузка асинхронна, поэтому она, вероятно, повлияет на прокрутку, я ожидаю, что она будет работать без этого, если вы не перезагружаетесь в другом месте. зарегистрируйте методы делегата, чтобы проверить, что вызвано, и когда при попытке прокрутки – Wain