如何在collectionView Cell的cellForItemAt中为SubView设置颜色?

时间:2018-06-18 18:56:20

标签: ios swift uicollectionview uistackview

我正在尝试建立各种时间表。我有一个包含collectionView的视图控制器。每个collectionView单元格代表一个月的数据。在每个单元格中,我有一个stackView。此stackView包含30个子视图,每个子视图代表一天的数据。

如果您想尝试一下,完整的项目就在这里:https://github.com/AlexMarshall12/iOS-timeline

我目前为每天着色子视图的方法是最初在自定义单元格的awakeFromNib中创建单元格中的所有子视图。

class MonthCollectionViewCell: UICollectionViewCell {

    @IBOutlet weak var stackView: UIStackView!
    var dayViews: [Int:UIView] = [:]

    override func awakeFromNib() {
        super.awakeFromNib()
        for i in 1...30 {
            let tick = UIView()
            dayViews[i] = tick
            self.stackView?.addArrangedSubview(tick)
        }
    }

}

请注意,我还构建了一个字典,用于索引1-30中单元格中的每个子视图。

然后在我的viewController中,在我的collectionView的cellForItemAt方法中,我希望看到那个月使用我的"日期"功能。然后我用我之前构建的字典查找此视图并将其着色为红色。

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "MonthCollectionViewCell", for: indexPath) as! MonthCollectionViewCell
    cell.backgroundColor = UIColor.gray
    let dayViews = cell.dayViews
    let firstDate = dates.first
    let index = indexPath.item
    let monthDate = Calendar.current.date(byAdding: .month, value: index, to: firstDate as! Date)
    let monthInt = Calendar.current.component(.month, from: monthDate!)
    let yearInt = Calendar.current.component(.year, from: monthDate!)
    let monthDates = dates(self.dates as! [Date], withinMonth: monthInt, withinYear: yearInt)
    for date in monthDates {
        let dayInt = date.interval(ofComponent: .day, fromDate: (monthDate?.startOfMonth())!)
        let tick = dayViews[dayInt]
        print(tick,"tick")
        tick?.backgroundColor = UIColor.red
        }
    return cell
}

func dates(_ dates: [Date], withinMonth month: Int, withinYear year: Int) -> [Date] {
    let calendar = Calendar.current
    let components: Set<Calendar.Component> = [.month,.year]
    print(components,"components")
    let filtered = dates.filter { (date) -> Bool in
        let monthAndYear = calendar.dateComponents(components, from: date)
        return (monthAndYear.month == month && monthAndYear.year == year)
    }
    return filtered
}

目前,所有内容都显示为可以从右向左滚动的灰色月份单元格。即使我的控制台告诉我它的发现与颜色匹配,但它似乎并没有给它们着色。我在这种方法/实施中做错了什么?

1 个答案:

答案 0 :(得分:2)

如果您遇到“我看不到我希望看到的视图”的情况,请在模拟器中运行您的应用程序,然后返回Xcode,启动View Debugger。

在这种情况下,当你这样做时,你会立即看到你的错误:你所有的“滴答”都是不可见的,因为你将零尺寸的普通香草UIViews发送到你的“填充分布”堆栈视图作为安排的子视图。堆栈视图不知道这些是怎么做的。所以他们最终没有大小,这使他们看不见。

在xib编辑器中将“Fill distribution”更改为“Fill Equally distribution”,再次运行应用程序,然后,您将开始看到一些滴答声!