一位用戶@NaThan INN 反饋了關(guān)于Widget小組件的Bug婆廊,他提到日期的一行文字無法顯示臭脓,后來又收到一位用戶反饋了同樣的問題。
我在手機上試了很多次,在模擬器上也試過了,都無法找出是什么問題。后來我發(fā)現(xiàn)用戶給的截圖中邑时,字體的大小和模擬器上有些差別,通過對系統(tǒng)設(shè)置字體大小特姐,我發(fā)現(xiàn)了問題的根源晶丘。
因為開發(fā)之初將cell的高定位了固定的55,但是這個值隨著系統(tǒng)字體大小的設(shè)置唐含,影響了分辨率的處理铣口,Cell在不同的系統(tǒng)字體下有不同的高度滤钱。
解決方案:將固定高度改為自適應(yīng)高度。
方案策略:折疊狀態(tài)下的高度作為自適應(yīng)的參考高度脑题。
第一步:檢測Widget的折疊和展開
在Class
中添加 NCWidgetProviding
件缸,同時添加一個儲存高度的變量cellHeight
。這樣才能檢測Widget的狀態(tài)叔遂,同時獲取高度儲存后使用他炊。
第二步:獲取Widget總體高度
具體代碼如下,其中NCWidgetDisplayMode.compact
表示折疊狀態(tài)已艰,NCWidgetDisplayMode.expanded
表示展開狀態(tài)痊末。
在OneDay中,折疊狀態(tài)只顯示兩行哩掺,所以每個Cell的高度為總體高的的1/2凿叠,也就是maxSize.height/2
,同時這個高度會作為展開狀態(tài)下其他Cell的高度嚼吞。
當(dāng)然盒件,這個函數(shù)中我還順便把展開狀態(tài)的高度做了,根據(jù)數(shù)據(jù)的個數(shù)去計算高度舱禽。
//折疊change size
func widgetActiveDisplayModeDidChange(_ activeDisplayMode: NCWidgetDisplayMode, withMaximumSize maxSize: CGSize) {
if activeDisplayMode == NCWidgetDisplayMode.compact {
self.preferredContentSize = CGSize(width:maxSize.width,height: maxSize.height)
self.activeDisplayIndex = 0
self.cellHeight = Int(maxSize.height/2)
print("cellHeight",self.cellHeight)
}else{
let hei = CGFloat((self.cellHeight * self.number)+self.cellHeight+5)
self.preferredContentSize = CGSize(width: maxSize.width,height:hei )
self.activeDisplayIndex = 1
print("cellHeight",self.cellHeight)
}
// self.eventsTable.reloadData()
}
第三步:給Tableview加載高度
獲取高度之后來使用就很簡單了炒刁,直接用heightForRowAt。
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return CGFloat(self.cellHeight)
}
第四步:注意事項和重新加載
注意要給 cellHeight一個初始值誊稚,一般推薦50~55翔始;
var cellHeight:Int = 50
因為widget通常是加載好的,所以在viewWillAppear
中加入tableview
的reloadData
方法里伯,以便在用戶改變系統(tǒng)字體后隨時改變城瞎。
self.eventsTable.reloadData()
最后:看看效果
其實,Widget小組件自適應(yīng)的效果疾瓮,看了幾個應(yīng)用都沒有處理得很好脖镀,往往容易被忽視。我手機里的應(yīng)用爷贫,workflow應(yīng)該也是這樣類似的解決方案认然,以便應(yīng)對系統(tǒng)字體設(shè)置帶來widget適配問題补憾。
最后漫萄,感謝NaThan INN用戶的反饋,不然真的很難發(fā)現(xiàn)盈匾,這項特性將在OneDay 2.4.0版本中正式發(fā)布腾务。
GitHub:OneSwift - iOS Tips Based On Swift
微博:xDEHANG