我有一个延伸我已经取下了骨头,这使得自己处于不正确的状态,在那里它会说"显示更少"当它崩溃时。
这种情况发生在两种情况下
我还试图让其他扩展程序处于活动状态(天气)并展开,并且一旦展开就会一直展开,而我的扩展程序正在崩溃并显示错误的状态。
无论天气小工具是否存在,都会发生这种情况。
当我在代码中放置断点时,在步骤#1中再次调用ViewDidLoad。
这里是代码,我一点一点地删除了所有内容,直到剩下这一切并仍然导致问题。
class TodayController: UICollectionViewController, NCWidgetProviding {
let reuseIdentifier = "TimeGridCell"
override func viewDidLoad() {
super.viewDidLoad()
self.extensionContext?.widgetLargestAvailableDisplayMode = NCWidgetDisplayMode.expanded
}
override func numberOfSections(in collectionView: UICollectionView) -> Int {
return 1
}
override func collectionView(_ collectionView: UICollectionView,
numberOfItemsInSection section: Int) -> Int {
return 3
}
override func collectionView(_ collectionView: UICollectionView,
cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: reuseIdentifier,
for: indexPath) as! ArtistTimeGridTableViewCell
cell.nameLabel.text = "blah blah"
return cell
}
func widgetActiveDisplayModeDidChange(_ activeDisplayMode: NCWidgetDisplayMode, withMaximumSize maxSize: CGSize) {
if activeDisplayMode == .expanded {
self.preferredContentSize = (self.collectionView?.contentSize)!
} else if activeDisplayMode == .compact {
self.preferredContentSize = maxSize
}
}
}
请注意,如果我删除self.extensionContext?.widgetLargestAvailableDisplayMode = NCWidgetDisplayMode.expanded
,那么我根本无法选择展开或折叠,因此需要这样做。
这是问题的图像。第一张图片是正确的,第二张图片不正确。
答案 0 :(得分:1)
发现另一个人谈论按钮不正常的问题,他们的解决方案似乎对我有用,虽然没有好的解释实际上有什么问题?这似乎可能是操作系统错误?
iOS10 widget "Show more" "Show less" bug
延迟设置内容大小可以防止出现问题
let deadlineTime = DispatchTime.now() + 0.2
if activeDisplayMode == .expanded {
DispatchQueue.main.asyncAfter(deadline: deadlineTime) {
self.preferredContentSize = (self.collectionView?.contentSize)!
}
} else if activeDisplayMode == .compact {
DispatchQueue.main.asyncAfter(deadline: deadlineTime) {
self.preferredContentSize = maxSize
}
}
答案 1 :(得分:0)
我遇到了完全相同的问题,但我使用布局约束来设置扩展状态的高度。对于遇到此问题的人来说,修复只是将layoutIfNeeded添加到widgetActiveDisplayModeDidChange的末尾。
使用示例:
func widgetActiveDisplayModeDidChange(_ activeDisplayMode: NCWidgetDisplayMode, withMaximumSize maxSize: CGSize) {
switch activeDisplayMode {
case .compact:
heightContstraint.constant = 0
case .expanded:
heightContstraint.constant = 44 * CGFloat((items.count))
}
view.layoutIfNeeded()
}
答案 2 :(得分:0)
刚刚找到了正确答案。
由于您允许扩展程序在 viewDidLoad 中具有扩展的大小,因此可以直接从 viewDidLoad 调用 widgetActiveDisplayModeDidChange 。
问题在于访问 widgetActiveDisplayModeDidChange 方法中的集合/表视图属性(大小/元素编号),因为只有在 viewWillAppear 之后才能完全初始化集合/表视图
所以,就我而言,我只是在 widgetActiveDisplayModeDidChange 中重复了 numberOfRowsInSection 计算,一切都按预期开始工作。
答案 3 :(得分:0)
在Swift 3和4中
override func viewDidLoad() {
super.viewDidLoad()
self.extensionContext?.widgetLargestAvailableDisplayMode = NCWidgetDisplayMode.expanded
}
func widgetActiveDisplayModeDidChange(_ activeDisplayMode: NCWidgetDisplayMode, withMaximumSize maxSize: CGSize) {
if activeDisplayMode == .expanded {
self.preferredContentSize = (self.myTableView?.contentSize)!
//Instead of table content you can user user own size
} else if activeDisplayMode == .compact {
self.preferredContentSize = maxSize
}
}
答案 4 :(得分:0)
真正的问题是,在widgetActiveDisplayModeDidChange期间,collectionView尚不知道contentSize,因此它将为您提供较小的值。如果您在函数中将其打印出来,并将其与viewWillAppear进行比较,则会看到不同之处。
0.2秒的延迟似乎很棘手,所以我更喜欢这种方式:
override func viewWillAppear(_ animated: Bool) {
if (extensionContext?.widgetActiveDisplayMode == .expanded) {
self.preferredContentSize = self.collectionView.contentSize
}
}
它同样适用于tableView,这是我正在使用的小部件。如果您滑过主屏幕并向后滑回,上面的代码将处理这种情况。但是,如果您仅单击显示更多/更少,则不会触发它,因此您仍然需要在widgetActiveDisplayModeDidChange中维护相同的代码。