调整Today App Extension的高度

时间:2016-10-11 03:28:33

标签: user-interface autolayout today-extension

我有一个今日小工具,根据主应用程序中选择的一对工作站显示即将到来的火车离港。鉴于出发时间随时间而变化,我在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后,应用扩展程序主视图不会更改。

1 个答案:

答案 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
    }


}