2016-10-11 2 views
0

У меня есть виджет Сегодня, который отображает предстоящие поезда, исходя из пары станций, выбранных в основном приложении. Учитывая, что время отправления меняется со временем, у меня есть вызов API в viewWillAppear, получающий новое время и повторное заполнение ячеек таблицыView.Регулировка высоты расширения приложения Today

В настоящее время виджет начинается с высоты примерно 150-200 точек в высоту. Моя логика обновления пытается установить высоту preferredContent, но это не сработает. У меня есть tableView, ограниченный верхними/нижними макетами. Я попытался сбросить высоту кадра tableView на главный вид, указав ему новый preferredContent.

Предположительно, обратный вызов моей сети происходит после просмотраWillAppear, поэтому я вызываю layoutIfNeeded, чтобы вызвать viewDidLayoutSubviews, где я перезаряжаю табличное представление.

Ничего из этого не дает мне того, что я хочу видеть. Таблица, заполненная временем вылета, которое составляет N times the height of a cell, где N - это количество времени отправления, последнее из которых было вызвано моим вызовом API.

Что мне не хватает? Любая помощь будет принята с благодарностью.

EDIT:

Это соответствующий код, где я пытаюсь повторно ВЫСОТА расширение.

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 вызывается в обработчике завершения. Хотя это может и не быть проблемой, поскольку основной вид приложения расширения не изменяется после установки нового preferredContentSize.

+0

Не могли бы вы показать код? В представлении таблицы не может быть размер виджета изнутри с использованием ограничений, поэтому вы _must_ используете 'preferredContentSize'. Можете ли вы, как вы это делаете? – matt

ответ

1

У меня была та же проблема. Несколько минут назад я решил это. Вид виджета по умолчанию не показывает максимальную высоту. Вам нужно нажать еще раз, рядом с названием приложения.

Удалите свой код и просто добавьте его в свой класс виджетов, а на ветке else установите высоту, что вы хотите. Это вызовет, когда вы нажмете показывать меньше/показать больше.

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


} 
+0

Я добавил это к моему расширению, и '(activeDisplayMode == NCWidgetDisplayMode.compact)' является единственным условным, который выполняется, и даже когда это так, высота preferredContentSize, которую я ему даю, не имеет никакого эффекта. –

+0

@ user5797668 во-первых, не забудьте добавить super.viewWillAppear (анимированный) в функцию viewwillappear и super.viewDidLayoutSubviews(). У меня есть self.preferredContentSize = collectionView.contentSize в cellforitem. Поэтому, если у вас есть tableview или collectionview, попробуйте установить self.preferredContentSize. Давайте попробуем это –

+0

Вот и все. Кажется, у preferredContentSize никогда не бывает эффекта. Даже если я прокомментирую ВСЕ код. И просто установите высоту до 600 в viewDidLoad, расширение остается на отметке 100-200 точек, что бы это ни было сейчас. –

Смежные вопросы