【问题标题】:Adjusting height of Today App Extension调整今日应用扩展的高度
【发布时间】:2016-10-11 03:28:33
【问题描述】:

我有一个 Today 小部件,它根据在主应用程序中选择的一对车站显示即将开出的火车。鉴于出发时间随时间变化,我在viewWillAppear 中有一个 API 调用来获取新时间并重新填充 tableView 的单元格。

目前,小部件的初始高度为 150-200 磅。我的更新逻辑尝试设置 preferredContent 高度,但这不起作用。我将 tableView 限制为顶部/底部布局指南。在告诉它一个新的preferredContent之后,我尝试将tableView的框架高度重置为主视图。

大概,我的网络的回调发生在 viewWillAppear 之后,所以我调用 layoutIfNeeded 来触发 viewDidLayoutSubviews 我重新加载 tableview。

这些都不能让我看到我想看到的东西。由 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 后不会改变。

【问题讨论】:

  • 你能展示你的代码吗?表格视图无法使用约束从内向外调整小部件的大小,因此您必须使用preferredContentSize。你能做到吗?

标签: user-interface autolayout today-extension


【解决方案1】:

我遇到了同样的问题。几分钟前我解决了它。小部件的默认视图不显示最大高度。您需要按应用标题旁边的显示更多。

删除您的代码并将其添加到您的小部件类中,然后在其他分支上设置您想要的高度。当您点击显示更少/显示更多时,这将调用。

@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
    }


}

【讨论】:

  • 我将它添加到我的扩展中,(activeDisplayMode == NCWidgetDisplayMode.compact) 是唯一执行的条件,即使它是,我给它的preferredContentSize 高度也没有效果。
  • @user5797668 首先不要忘记将 super.viewWillAppear(animated) 添加到 viewwillappear 函数和 super.viewDidLayoutSubviews() 中。我在 cellforitem 中有 self.preferredContentSize = collectionView.contentSize。因此,如果您有 tableview 或 collectionview 尝试在那里设置 self.preferredContentSize 。让我们试试
  • 事情就是这样。看起来,preferredContentSize 从来没有效果。即使我注释掉所有代码。并且只需在 viewDidLoad 中将高度设置为 600,扩展保持在 100-200 点高度,无论它现在是什么。
  • 在viewdidload函数中添加这个if #available(iOSApplicationExtension 10.0, *) { self.extensionContext?.widgetLargestAvailableDisplayMode = NCWidgetDisplayMode.expanded } else { // Fallback on earlier versions }
  • 这也不起作用。您能否指导我查看您最初用于处理小部件大小调整的文档。
猜你喜欢
  • 2017-03-31
  • 2014-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多