我有一个Today小部件,它根据在主应用程序中选择的一对车站显示即将到来的火车发车。鉴于出发时间随时间变化,我在viewWillAppear中有一个获取新时间并重新填充tableView的单元格的API调用。
目前,这个小部件的起始高度看起来是150-200点。我的更新逻辑尝试设置preferredContent高度,但这不起作用。我将tableView约束到顶部/底部布局辅助线。在告诉它一个新的preferredContent后,我尝试将tableView的框架高度重置为主视图。
大概,我的网络的回调发生在viewWillAppear之后,所以我调用layoutIfNeeded来触发viewDidLayoutSubviews,在那里我重新加载了表视图。
这些都不能让我得到我想要的东西。一个由出发时间填充的表视图,它是N times the height of a cell,其中N是我的API调用最近获取的出发次数。
我遗漏了什么?任何帮助都将不胜感激。
编辑:
这是我尝试重新调整扩展高度的相关代码。
override func viewWillAppear(_ animated: Bool) {
dao.fetchTrips { (trips) in
self.tripsDataSource.dataStore = trips
let numTrips = trips?.count
let rowHeight = 44 // static
let h = numTrips! * rowHeight
self.preferredContentSize = CGSize(width: 0, height: h)
self.view.layoutIfNeeded()
}
}
override func viewDidLayoutSubviews() {
self.tableView.reloadData()
}我注意到在完成处理程序中调用layoutIfNeeded之后,不会调用viewDidLayoutSubviews。尽管这可能不是问题所在,因为在设置新的preferredContentSize之后,应用程序扩展主视图不会改变。
发布于 2016-10-12 13:00:17
我也有同样的问题。几分钟前我解决了这个问题。widget的默认视图不显示最大高度。您需要按下显示更多,旁边的应用程序标题。
删除您的代码,只需将此代码添加到您的小部件类中,然后在else分支上设置您想要的高度。当你点击show less/ show more时,它将会调用。
@available(iOSApplicationExtension 10.0, *)
func widgetActiveDisplayModeDidChange(_ activeDisplayMode: NCWidgetDisplayMode, withMaximumSize maxSize: CGSize){
if (activeDisplayMode == NCWidgetDisplayMode.compact) {
self.preferredContentSize = CGSize(width: 0, height: maxSize.height);
}
else {
self.preferredContentSize = CGSize(width: 0, height: self.tableView.contentSize.height);
}
}编辑:我的代码:
import UIKit
import NotificationCenter
let groupappname = "group.***.***"
class MyCollectionViewController: UICollectionViewController , NCWidgetProviding,UICollectionViewDelegateFlowLayout {
var isEmptyData = true
var array = NSMutableArray()
var defaults = UserDefaults.init(suiteName: groupappname)!
override func viewDidLoad() {
super.viewDidLoad()
if #available(iOSApplicationExtension 10.0, *) {
self.extensionContext?.widgetLargestAvailableDisplayMode = NCWidgetDisplayMode.expanded
} else {
// Fallback on earlier versions
}
registerObserver()
refreshData()
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
removeObserver()
}
func refreshData(){
self.preferredContentSize = (self.collectionView?.contentSize)!
#somecode
self.collectionView?.reloadData()
}
func refreshData_NoData(){
self.preferredContentSize = (self.collectionView?.contentSize)!
self.collectionView?.reloadData()
}
func widgetPerformUpdate(completionHandler: @escaping (NCUpdateResult) -> Void) {
print("widgetperformupdate")
completionHandler(NCUpdateResult.newData)
}
@available(iOSApplicationExtension 10.0, *)
func widgetActiveDisplayModeDidChange(_ activeDisplayMode: NCWidgetDisplayMode, withMaximumSize maxSize: CGSize){
if (activeDisplayMode == NCWidgetDisplayMode.compact) {
self.preferredContentSize = CGSize(width: 0, height: maxSize.height)
}
else {
self.preferredContentSize = CGSize(width: 0, height: (self.collectionView?.contentSize.height)!)
}
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
// MARK: UICollectionViewDataSource
override func numberOfSections(in collectionView: UICollectionView) -> Int {
// #warning Incomplete implementation, return the number of sections
return 1
}
override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
// #warning Incomplete implementation, return the number of items
return array.count
}
override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
#somecode
self.preferredContentSize = collectionView.contentSize
return cell
}
}https://stackoverflow.com/questions/39970091
复制相似问题