我有一个今日小工具,根据主应用程序中选择的一对工作站显示即将到来的火车离港。鉴于出发时间随时间而变化,我在and
中进行API调用以获取新的时间并重新填充tableView的单元格。
目前,小部件的起点高度为150-200点。我的更新逻辑尝试设置viewWillAppear
高度,但这不起作用。我将tableView约束到顶部/底部布局指南。我告诉它一个新的preferredContent后,我尝试将tableView的帧高重置为主视图。
据推测,我的网络回调发生在viewWillAppear之后,所以我调用preferredContent
来触发layoutIfNeeded
我重新加载tableview。
这些都没有让我想要看到的东西。由出发时间填充的tableview viewDidLayoutSubviews
,其中N是我的API调用最近提取的出发时间数。
我错过了什么?任何帮助将不胜感激。
这是我尝试重新调整扩展名的相关代码。
N times the height of a cell
我注意到在完成处理程序中调用 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()
}
后未调用viewDidLayoutSubviews
。虽然这可能不是问题,因为在设置新的layoutIfNeeded
后,应用扩展程序主视图不会更改。
答案 0 :(得分:1)
我遇到了同样的问题。几分钟前我解决了它。小部件的默认视图不显示最大高度。你需要在App title旁边按show more。
删除你的代码,然后将其添加到你的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
}
}