一位用戶@NaThan INN 反饋了關(guān)于Widget小組件的Bug,他提到日期的一行文字無(wú)法顯示,后來(lái)又收到一位用戶反饋了同樣的問(wèn)題。

我在手機(jī)上試了很多次,在模擬器上也試過(guò)了,都無(wú)法找出是什么問(wèn)題。后來(lái)我發(fā)現(xiàn)用戶給的截圖中,字體的大小和模擬器上有些差別,通過(guò)對(duì)系統(tǒng)設(shè)置字體大小,我發(fā)現(xiàn)了問(wèn)題的根源。
因?yàn)殚_(kāi)發(fā)之初將cell的高定位了固定的55,但是這個(gè)值隨著系統(tǒng)字體大小的設(shè)置,影響了分辨率的處理,Cell在不同的系統(tǒng)字體下有不同的高度。
解決方案:將固定高度改為自適應(yīng)高度。
方案策略:折疊狀態(tài)下的高度作為自適應(yīng)的參考高度。
第一步:檢測(cè)Widget的折疊和展開(kāi)
在Class中添加 NCWidgetProviding,同時(shí)添加一個(gè)儲(chǔ)存高度的變量cellHeight。這樣才能檢測(cè)Widget的狀態(tài),同時(shí)獲取高度儲(chǔ)存后使用。
第二步:獲取Widget總體高度
具體代碼如下,其中NCWidgetDisplayMode.compact表示折疊狀態(tài),NCWidgetDisplayMode.expanded表示展開(kāi)狀態(tài)。
在OneDay中,折疊狀態(tài)只顯示兩行,所以每個(gè)Cell的高度為總體高的的1/2,也就是maxSize.height/2,同時(shí)這個(gè)高度會(huì)作為展開(kāi)狀態(tài)下其他Cell的高度。
當(dāng)然,這個(gè)函數(shù)中我還順便把展開(kāi)狀態(tài)的高度做了,根據(jù)數(shù)據(jù)的個(gè)數(shù)去計(jì)算高度。
//折疊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加載高度
獲取高度之后來(lái)使用就很簡(jiǎn)單了,直接用heightForRowAt。
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return CGFloat(self.cellHeight)
}
第四步:注意事項(xiàng)和重新加載
注意要給 cellHeight一個(gè)初始值,一般推薦50~55;
var cellHeight:Int = 50
因?yàn)閣idget通常是加載好的,所以在viewWillAppear中加入tableview的reloadData方法,以便在用戶改變系統(tǒng)字體后隨時(shí)改變。
self.eventsTable.reloadData()
最后:看看效果

其實(shí),Widget小組件自適應(yīng)的效果,看了幾個(gè)應(yīng)用都沒(méi)有處理得很好,往往容易被忽視。我手機(jī)里的應(yīng)用,workflow應(yīng)該也是這樣類(lèi)似的解決方案,以便應(yīng)對(duì)系統(tǒng)字體設(shè)置帶來(lái)widget適配問(wèn)題。
最后,感謝NaThan INN用戶的反饋,不然真的很難發(fā)現(xiàn),這項(xiàng)特性將在OneDay 2.4.0版本中正式發(fā)布。
GitHub:OneSwift - iOS Tips Based On Swift
微博:xDEHANG