2016-10-11 4 views
0

Ich habe ein Today Widget, das die bevorstehenden Zugabfahrten basierend auf einem Paar von Stationen in der Hauptanwendung ausgewählt anzeigt. Da sich die Abfahrtszeiten mit der Zeit ändern, habe ich einen API-Aufruf unter viewWillAppear, um die neuen Zeiten abzurufen und die Zellen einer tableView neu zu füllen.Einstellen der Höhe von Heute App Erweiterung

Momentan beginnt das Widget mit einer Höhe von 150-200 Punkten. Meine Aktualisierungslogik versucht, die preferredContent Höhe einzustellen, aber das funktioniert nicht. Ich habe die TableView auf die oberen/unteren Layout Guides beschränkt. Ich habe versucht, die Rahmenhöhe des TableView auf die Hauptansicht zurückzusetzen, nachdem ich ihm einen neuen preferredContent gegeben habe.

Vermutlich geschieht der Rückruf von meinem Netzwerk nach viewWillAppear, so rufe ich layoutIfNeededviewDidLayoutSubviews auszulösen, wo ich die Tableview laden.

Nichts davon bekommt mich, was ich sehen will. Eine Tabellenansicht mit den Abfahrtszeiten, die N times the height of a cell ist, wobei N die Anzahl der Abfahrtszeiten ist, die zuletzt von meinem API-Aufruf abgerufen wurden.

Was fehlt mir? Jede Hilfe würde sehr geschätzt werden.

EDIT:

Dies ist der entsprechende Code, wo ich versuche, die Erweiterung neu Höhe.

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() 
    } 

Ich habe viewDidLayoutSubviews bemerkt genannt wird, nicht nach layoutIfNeeded in den Abschluss-Handler aufgerufen wird. Obwohl dies möglicherweise nicht das Problem ist, ändert sich die Hauptansicht der App-Erweiterung nicht, nachdem eine neue preferredContentSize festgelegt wurde.

+0

Könnten Sie Ihren Code zeigen? In einer Tabellenansicht kann das Widget nicht mithilfe von Integritätsbedingungen von innen nach außen skaliert werden, sodass Sie _preferredContentSize_ verwenden müssen. Kannst du, wie du das machst? – matt

Antwort

1

Ich hatte das gleiche Problem. Vor ein paar Minuten habe ich es gelöst. Die Standardansicht des Widgets zeigt nicht die maximale Höhe an. Sie müssen mehr anzeigen neben App-Titel drücken.

Entfernen Sie Ihren Code und fügen Sie dies einfach zu Ihrer Widget-Klasse und auf else Zweig stellen Sie die Höhe, was Sie wollen. Dies wird aufgerufen, wenn Sie weniger anzeigen/mehr anzeigen.

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

Editiert: Mein Code:

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 
    } 


} 
+0

Ich habe dies zu meiner Erweiterung hinzugefügt und '(activeDisplayMode == NCWidgetDisplayMode.compact)' ist die einzige Bedingung, die ausgeführt wird, und selbst wenn dies der Fall ist, hat die preferredContentSize-Höhe, die ich gebe, keine Wirkung. –

+0

@ user5797668 Erstens vergessen Sie nicht, super.viewWillAppear (animiert) zu viewwilllappear Funktion und super.viewDidLayoutSubviews() hinzuzufügen. Ich habe self.preferredContentSize = collectionView.contentSize in cellforitem. Wenn Sie tableview oder collectionview haben, versuchen Sie, dort self.preferredContentSize zu setzen. Versuchen wir das –

+0

Heres die Sache. preferredContentSize hat nie einen Effekt, scheint es. Selbst wenn ich ALLEN Code auskommentiere. Und einfach die Höhe in viewDidLoad auf 600 setzen, die Erweiterung bleibt bei 100-200 Punkten, egal was es jetzt ist. –