2016-10-11 2 views
0

주 신청서에서 선택한 한 쌍의 스테이션을 기반으로 예정된 기차 출발을 표시하는 오늘 위젯이 있습니다. 출발 시간이 시간에 따라 변한다는 것을 감안할 때 viewWillAppear에 API 호출을 사용하여 새로운 시간을 가져오고 tableView의 셀을 다시 채 웁니다.오늘 앱 확장의 높이 조절

현재 위젯은 높이가 150-200 포인트 인 모양으로 시작됩니다. 내 업데이트 논리가 preferredContent 높이로 설정하려고 시도하지만 작동하지 않습니다. 상단/하단 레이아웃 가이드에 제약이있는 tableView가 있습니다. 나는 새로운 preferredContent 그것을 말한 후 기본보기로 tableView의 프레임 높이 재설정 시도했다.

아마도 내 네트워크의 콜백은 viewWillAppear 이후에 발생하기 때문에 layoutIfNeeded을 호출하여 viewDidLayoutSubviews을 불러 와서 tableview를 다시로드합니다.

아무 것도보고 싶지 않습니다. 출발 시간으로 채워진 테이블 뷰는 N times the height of a cell입니다. 여기서 N은 가장 최근에 API 호출에서 가져온 출발 시간 수입니다.

무엇이 누락 되었습니까? 어떤 도움이라도 대단히 감사하겠습니다.

편집 :

이 내가 확장을 높이 다시 시도 관련 코드입니다. layoutIfNeeded이 완료 핸들러에서 호출 후

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을 발견했습니다. 그게 문제가되지 않을 수도 있습니다, 왜냐하면 새로운 preferredContentSize을 설정 한 후에 앱 - 확장 메인보기가 바뀌지 않기 때문입니다.

+0

당신이 당신의 코드를 보여줄 수 있을까요? 테이블 뷰는 제약 조건을 사용하여 내부에서 위젯의 크기를 조절할 수 없으므로 반드시 preferredContentSize를 사용해야합니다. 당신은 그 일을 어떻게 할 수 있습니까? – matt

답변

1

같은 문제가있었습니다. 몇 분 전에 나는 그것을 풀었다. 위젯의 기본보기에는 최대 높이가 표시되지 않습니다. 앱 제목 옆의 더보기 표시를 눌러야합니다.

코드를 제거하고 위젯 클래스에 추가하고 다른 경우에는 높이를 원하는대로 설정하십시오. 이것은 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 
    } 


} 
+0

이것을 내 확장 기능에 추가했고'(activeDisplayMode == NCWidgetDisplayMode.compact)'만이 실행되는 유일한 조건이고, 그것이라도 내가 준 preferredContentSize 높이는 아무런 효과가 없다. –

+0

@ user5797668 먼저 super.viewWillAppear (애니메이션)을 viewwillappear 함수에 추가하고 super.viewDidLayoutSubviews()를 추가하는 것을 잊지 마십시오. 나는 self.preferredContentSize = collectionfor.contentSize cellforitem 있습니다. 그래서 tableview 나 collectionview가 있다면 self.preferredContentSize를 설정하십시오. 그것을 시도하자. –

+0

물건 Heres. preferredContentSize는 아무런 영향을 미치지 않습니다. 모든 코드를 주석 처리하더라도. 그리고 viewDidLoad에서 height를 600으로 설정하면, 확장은 현재의 위치에 상관없이 100-200points로 유지됩니다. –