Как рисовать на ячейках collectionView, используя selectItem UICollectionView? - PullRequest
0 голосов
/ 02 октября 2018

Я добавил репо, с которым я работаю:

https://github.com/AlexMarshall12/singleDayTimeline/tree/master/singleDayTimeline

В основном у меня 900 ячеек collectionView (с пользовательским макетом XIB).

    let cellIdentifier = "DayCollectionViewCell"
class ViewController: UIViewController, UICollectionViewDataSource,UICollectionViewDelegate {

    @IBOutlet weak var button: UIButton!
    var dates = [Date?]()
    var startDate: Date?
    @IBOutlet weak var daysCollectionView: UICollectionView!
    override func viewDidLoad() {
        super.viewDidLoad()
        daysCollectionView.register(UINib.init(nibName: "DayCollectionViewCell", bundle: nil), forCellWithReuseIdentifier: cellIdentifier)

        let allDates = Helper.generateRandomDate(daysBack: 900, numberOf: 10)
        self.dates = allDates.sorted(by: {
            $0!.compare($1!) == .orderedAscending
        })
        startDate = self.dates.first! ?? Date()

        daysCollectionView.delegate = self
        daysCollectionView.dataSource = self
        // Do any additional setup after loading the view, typically from a nib.
    }

    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return 900
    }

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = daysCollectionView.dequeueReusableCell(withReuseIdentifier: cellIdentifier, for: indexPath) as! DayCollectionViewCell

        let cellDate = Calendar.current.date(byAdding: .day, value: indexPath.item, to: self.startDate!)

        if Calendar.current.component(.day, from: cellDate!) == 15 {
            let dateFormatter = DateFormatter()
            dateFormatter.dateFormat = "MMM"
            let monthString = dateFormatter.string(from: cellDate!)
            cell.drawMonth(month: monthString)
        }
        if Calendar.current.component(.day, from: cellDate!) == 1 && Calendar.current.component(.month, from: cellDate!) == 1 {
            print("drawYEAR")
            cell.drawYear(year:Calendar.current.component(.year, from: cellDate!))
        }
        if self.dates.contains(where: { Calendar.current.isDate(cellDate!, inSameDayAs: $0!) }) {
            print("same")
            cell.backgroundColor = UIColor.red
        } else {
            print("not me")
            //cell.backgroundColor = UIColor.lightGray
        }
        return cell
    }

//    func collectionView(_ collectionView: UICollectionView,
//                        layout collectionViewLayout: UICollectionViewLayout,
//                        sizeForItemAt indexPath: IndexPath) -> CGSize {
//        return CGSize(width: 2, height: daysCollectionView.bounds.size.height/2 )
//    }
    @IBAction func buttonPressed(_ sender: Any) {

        let randomIndex = Int(arc4random_uniform(UInt32(self.dates.count)))
        let randomDate = self.dates[randomIndex]
        let daysFrom = randomDate?.days(from: self.startDate!)
        let indexPath = IndexPath(row: daysFrom!, section: 0)
//        if let cell = daysCollectionView.dequeueReusableCell(withReuseIdentifier: cellIdentifier, for: indexPath) as DayCollectionViewCell? {
//            print("found it")
//        } else {
//            print("didn't find it")
//        }
        daysCollectionView.selectItem(at: indexPath, animated: false, scrollPosition: .centeredHorizontally)
        daysCollectionView.scrollToItem(at: indexPath, at: .centeredHorizontally, animated: true)
    }
    }

Тогда вот ячейка:

   class DayCollectionViewCell: UICollectionViewCell {

    @IBOutlet weak var arrowImage: UIImageView!

    override var isSelected: Bool{
        didSet{
            arrowImage.isHidden = !isSelected
        }
    }
    override func awakeFromNib() {
        super.awakeFromNib()
        arrowImage.isHidden = true
    }

    override func prepareForReuse() {
        self.backgroundColor = UIColor.clear
    }

    func drawMonth(month: String){

    }
    func drawYear(year: Int){

    }

}

Это выглядит так:

enter image description here

Таким образом, план такой, когда эта кнопкаНажав, вы можете увидеть в функциональной кнопке @IBActionПресс, что случайная дата выбрана и прокручена до, затем эта ячейка выбрана в collectionView.Затем стрелка ячейки рисуется с помощью arrowImage.isHidden = !isSelected в функции переопределения var isSelected.

В настоящее время это работает почти идеально.Стрелка перерисовывается под выбранной ячейкой, ЗА ИСКЛЮЧЕНИЕМ, когда новый индекс, который выбирается случайным образом, находится достаточно далеко от текущего индекса.Моя теория состоит в том, что если разница в индексе достаточно велика, следующая ячейка еще не была загружена / удалена, и поэтому isSelected никогда не вызывается.Однако я все еще не уверен, почему он не работает должным образом

1 Ответ

0 голосов
/ 03 октября 2018

1 - добавить функцию reloadCell для изменения пользовательского интерфейса ячейки.Затем вы должны удалить override var isSelected и arrowImage.isHidden = true из функции awakeFromNib.

func reloadCell(_ isSelected:Bool){
   arrowImage.isHidden = !isSelected
}

2- Вы должны определить переменную для ViewController.swift class private var selectedIndexPath: IndexPath?, а затем добавить этот код дляпроверьте, если стрелка скрыта или нет.

 if let selectedRow = selectedIndexPath {
     cell.reloadCell(selectedRow == indexPath)
 } else {
     cell.reloadCell(false)
 } 

3- И если вы измените свою функцию действия кнопки, как показано ниже, она будет работать.

@IBAction func buttonPressed(_ sender: Any) {

    let randomIndex = Int(arc4random_uniform(UInt32(self.dates.count)))
    let randomDate = self.dates[randomIndex]
    let daysFrom = randomDate?.days(from: self.startDate!)
    let indexPath = IndexPath(row: daysFrom!, section: 0)
    self.selectedIndexPath = indexPath;

    daysCollectionView.scrollToItem(at: indexPath, at: .centeredHorizontally, animated: true)
    daysCollectionView.reloadData()
}
  • Все кодыздесь.

ViewController.swift

import UIKit
let cellIdentifier = "DayCollectionViewCell"
class ViewController: UIViewController, UICollectionViewDataSource,UICollectionViewDelegate {

@IBOutlet weak var button: UIButton!
var dates = [Date?]()
var startDate: Date?
private var selectedIndexPath: IndexPath?

@IBOutlet weak var daysCollectionView: UICollectionView!

override func viewDidLoad() {
    super.viewDidLoad()
    daysCollectionView.register(UINib.init(nibName: "DayCollectionViewCell", bundle: nil), forCellWithReuseIdentifier: cellIdentifier)

    let allDates = Helper.generateRandomDate(daysBack: 900, numberOf: 10)
    self.dates = allDates.sorted(by: {
        $0!.compare($1!) == .orderedAscending
    })
    startDate = self.dates.first! ?? Date()

    daysCollectionView.delegate = self
    daysCollectionView.dataSource = self
}

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    return 900
}

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = daysCollectionView.dequeueReusableCell(withReuseIdentifier: cellIdentifier, for: indexPath) as! DayCollectionViewCell

    let cellDate = Calendar.current.date(byAdding: .day, value: indexPath.item, to: self.startDate!)

    if let selectedRow = selectedIndexPath {
        cell.reloadCell(selectedRow == indexPath)
    } else {
        cell.reloadCell(false)
    }

    if Calendar.current.component(.day, from: cellDate!) == 15 {
        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = "MMM"
        let monthString = dateFormatter.string(from: cellDate!)
        cell.drawMonth(month: monthString)
    }
    if Calendar.current.component(.day, from: cellDate!) == 1 && Calendar.current.component(.month, from: cellDate!) == 1 {
        print("drawYEAR")
        cell.drawYear(year:Calendar.current.component(.year, from: cellDate!))
    }
    if self.dates.contains(where: { Calendar.current.isDate(cellDate!, inSameDayAs: $0!) }) {
        print("same")
        cell.backgroundColor = UIColor.red
    } else {
        print("not me")
        //cell.backgroundColor = UIColor.lightGray
    }
    return cell
}

@IBAction func buttonPressed(_ sender: Any) {

    let randomIndex = Int(arc4random_uniform(UInt32(self.dates.count)))
    let randomDate = self.dates[randomIndex]
    let daysFrom = randomDate?.days(from: self.startDate!)
    let indexPath = IndexPath(row: daysFrom!, section: 0)
    self.selectedIndexPath = indexPath;

    //daysCollectionView.selectItem(at: indexPath, animated: false, scrollPosition: .centeredHorizontally)
    daysCollectionView.scrollToItem(at: indexPath, at: .centeredHorizontally, animated: true)
    daysCollectionView.reloadData()
}

}

DayCollectionViewCell.swift

import UIKit

class DayCollectionViewCell: UICollectionViewCell {

@IBOutlet weak var arrowImage: UIImageView!

override func awakeFromNib() {
    super.awakeFromNib()
}

override func prepareForReuse() {
    self.backgroundColor = UIColor.clear
}

func drawMonth(month: String){

}
func drawYear(year: Int){

}

func reloadCell(_ isSelected:Bool){
    arrowImage.isHidden = !isSelected
}

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