- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我对 UICollectionViewLayout
进行了子类化以创建日历。我想让用户能够更改一些设置,例如屏幕上显示的天数(默认为 7)。
我将daysToShow
保存在UserDefaults
中。每当 UIStepper
值发生更改时,它都会调用此方法:
func stepperValueChanged(sender:UIStepper){
stepperValue = String(Int(sender.value))
valueLabel.text = String(Int(sender.value))
UserDefaults.standard.set(String(Int(sender.value)), forKey: "daysToShow")
NotificationCenter.default.post(name: Notification.Name(rawValue: "calendarSettingsChanged"), object: nil, userInfo: nil)
}
因此,在将新值保存到 UserDefault
中后,我发布一条通知,然后调用 reloadForSettingsChange
(实际上,当我在此处设置断点时会调用该通知):
override func viewDidLoad() {
super.viewDidLoad()
NotificationCenter.default.addObserver(self, selector: #selector(reloadForSettingsChange(notification:)), name: NSNotification.Name(rawValue: "calendarSettingsChanged"), object: nil)
// other code.....
}
func reloadForSettingsChange(notification:NSNotification){
// here I save the user setting in a variable declared in my custom UICollectionViewLayout
self.calendarView.daysToShow = Int(UserDefaults.standard.string(forKey: "daysToShow")!)
self.calendarView.daysToShowOnScreen = Int(UserDefaults.standard.string(forKey: "daysToShow")!)
self.calendarView.forceReload(reloadEvent: true)
}
func forceReload(reloadEvent:Bool){
DispatchQueue.main.async {
if reloadEvent{
self.groupEventsByDays()
self.weekFlowLayout?.invalidateCacheLayout()
self.collectionView.reloadData()
}
}
}
func invalidateCacheLayout(){
self.needsToPopulateAttributesForAllSections = true
self.cachedDayDateComponents?.removeAllObjects()
self.cachedStartTimeDateComponents?.removeAllObjects()
self.cachedEndTimeDateComponents?.removeAllObjects()
self.cachedCurrentDateComponents?.removeAllObjects()
self.cachedEarliestHour = Int.max
self.cachedLatestHour = Int.min
self.cachedMaxColumnHeight = CGFloat.leastNormalMagnitude
self.cachedColumnHeights?.removeAllObjects()
self.cachedEarliestHours?.removeAllObjects()
self.cachedLatestHours?.removeAllObjects()
self.itemAttributes?.removeAllObjects()
self.allAttributes?.removeAllObjects()
_layoutAttributes.removeAll()
self.invalidateLayout()
}
问题是,在我旋转屏幕设备(即从横向到纵向)之前,布局不会更新(无效?)。我用于旋转的函数调用的方法与我在 reloadForSettingsChange
中调用的方法完全相同,因此我不明白为什么它在旋转屏幕时起作用,而不是在旋转屏幕之前起作用:
func rotated() {
switch UIDevice.current.orientation {
case .landscapeLeft, .landscapeRight:
calendarView.forceReload(reloadEvent: true)
default:
calendarView.forceReload(reloadEvent: true)
}
}
最佳答案
我找到了解决方案:我现在正在调用 setNeedsLayout()
:
func reloadForSettingsChange(notification:NSNotification){
self.calendarView.daysToShow = Int(UserDefaults.standard.string(forKey: "daysToShow")!)
self.calendarView.daysToShowOnScreen = Int(UserDefaults.standard.string(forKey: "daysToShow")!)
self.calendarView.forceReload(reloadEvent: true)
self.calendarView.setNeedsLayout() // this line has been added
}
我最初使用了 layoutSubviews()
,它有效,但是 Apple Documentation说:
You should not call this method directly. If you want to force a layout update, call the setNeedsLayout() method instead to do so prior to the next drawing update. If you want to update the layout of your views immediately, call the layoutIfNeeded() method.
我尝试了 setNeedsLayout()
这似乎是调用的正确方法(?!?),但由于它不起作用,我使用了 setNeedsLayout():
Call this method on your application’s main thread when you want to adjust the layout of a view’s subviews. This method makes a note of the request and returns immediately. Because this method does not force an immediate update, but instead waits for the next update cycle, you can use it to invalidate the layout of multiple views before any of those views are updated. This behavior allows you to consolidate all of your layout updates to one update cycle, which is usually better for performance.
关于ios - UICollectionViewLayout - invalidateLayout() 仅在屏幕旋转后有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41575304/
我在 TableView 中有一个动态 collectionView,当我添加 invalidateLayout 时出现错误(图片如下)但是如果我删除 invalidateLayout 前四个单元格被
我对 UICollectionViewLayout 进行了子类化以创建日历。我想让用户能够更改一些设置,例如屏幕上显示的天数(默认为 7)。 我将daysToShow保存在UserDefaults中。
我发现在 iOS8 中调用 invalidateLayout 会导致崩溃行为,这可能是由于上次 WWDC 引入了带有上下文的新 invalidateLayout。不过,我还没有找到等效于使整个 Col
我有一个 UICollectionViewController,它有一堆单元格,每个单元格都有屏幕尺寸。 如果我以纵向或横向启动应用程序,一切都会按预期进行。 问题是当我更改屏幕方向并调用 colle
这个问题已被问过几次,但没有一个答案足够详细,让我无法理解为什么/如何工作。作为引用,其他 SO 问题是: How to update size of cells in UICollectionVie
我有一个带有数据源和布局类的 Collection View 。该类链接到 Attributes Inspector 中的 Collection View 。 通过点击按钮,我需要检索集合的数据,这可
在 UICollectionView + UIKit Dynamics 上阅读 objc.io 的第 5 期时,第 2 部分讨论了“Tiling your Dynamic Behaviors for
UICollectionView Programming Guide说: In addition to animating insertions, deletions, and move operat
我想每分钟更新一次 UICollectionView 布局。它在 iOS 10 中运行良好,但在 iOS 9 中崩溃(我在 iPad 2 中测试过) invalidateLayout 方法使 UICo
我正在尝试刷新页脚 (supplementaryElement)。我正在使用 invalidatelayout 方法。基于 SO 建议 here . Apple 文档 here . 我收到以下错误:
问题是 collectionView 中的列数在旋转时不会保持在 7(所需数量)。需要更改什么代码才能解决此问题? 自定义 UICollectionViewFlowLayout 中的 invalida
我一直在阅读this article about using custom UICollectionViewLayouts并试图将这个想法融入我正在从事的项目中。 我们之前使用的是 UICollect
在 UITableViewController、UITableViewCell 中,我有一个网格,每行具有固定数量的静态 UICollectionViewCells(无间距)。 extension N
我是一名优秀的程序员,十分优秀!