Widget小組件如何自適應(yīng)高度

OneSwift - iOS Tips Based On Swift

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

Widget小部件顯示日期異常

我在手機(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中加入tableviewreloadData方法,以便在用戶改變系統(tǒng)字體后隨時(shí)改變。

self.eventsTable.reloadData()

最后:看看效果

系統(tǒng)最大字體和最小字體的適配結(jié)果對(duì)比

其實(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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容