我正在尝试建立各种时间表。我有一个包含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
}
目前,所有内容都显示为可以从右向左滚动的灰色月份单元格。即使我的控制台告诉我它的发现与颜色匹配,但它似乎并没有给它们着色。我在这种方法/实施中做错了什么?
答案 0 :(得分:2)
如果您遇到“我看不到我希望看到的视图”的情况,请在模拟器中运行您的应用程序,然后返回Xcode,启动View Debugger。
在这种情况下,当你这样做时,你会立即看到你的错误:你所有的“滴答”都是不可见的,因为你将零尺寸的普通香草UIViews发送到你的“填充分布”堆栈视图作为安排的子视图。堆栈视图不知道这些是怎么做的。所以他们最终没有大小,这使他们看不见。
在xib编辑器中将“Fill distribution”更改为“Fill Equally distribution”,再次运行应用程序,然后,您将开始看到一些滴答声!