隨筆分享幾個(gè)最近開(kāi)發(fā)中遇到的坑和小技巧:
1. 縮放窗口時(shí)保持首列面板大小
默認(rèn)情況下题诵,當(dāng)用戶(hù)縮放窗口大小時(shí),Split View 會(huì)自動(dòng)調(diào)整中軸的位置缰贝,保持原有左右兩側(cè)的寬度比例不變嘱么,但這樣兩側(cè)面板的大小就都發(fā)生改變了,如果我們想鎖定一側(cè)的面板大小柒傻,可以使用下面這個(gè)小 trick:
首先設(shè)置 NSSplitView
的 delegate
屬性孝赫,為其賦一個(gè)代理對(duì)象,實(shí)現(xiàn) splitView:resizeSubviewsWithOldSize:
方法:
- (void)splitView:(NSSplitView *)splitView resizeSubviewsWithOldSize:(NSSize)oldSize {
CGFloat oldWidth = splitView.arrangedSubviews.firstObject.frame.size.width;
[splitView adjustSubviews];
[splitView setPosition:oldWidth ofDividerAtIndex:0];
}
簡(jiǎn)單解釋一下這段代碼红符,文檔中指出青柄,如果代理實(shí)現(xiàn)了該方法,那么 Split View 在被改變大小時(shí)不會(huì)做出任何布局操作预侯,而是需要開(kāi)發(fā)者自己實(shí)現(xiàn)布局邏輯致开。這里使用 adjustSubviews
方法可以借用一下未實(shí)現(xiàn)該代理方法時(shí)的布局邏輯,但如果單純調(diào)用它萎馅,中軸位置還是會(huì)改變双戳,因此我們可以在調(diào)用它之前先記錄一下中軸的位置,其位置就是第一個(gè)面板的寬度糜芳。然后執(zhí)行默認(rèn)布局邏輯飒货,最后我們?cè)僬{(diào)整中軸位置為之前記錄下的位置就 OK 了!
2. 限制面板最大最小尺寸
通常來(lái)講峭竣,我們不希望兩側(cè)面板的大小可以無(wú)限調(diào)整塘辅,最左側(cè)的面板一般會(huì)被限制在一定范圍內(nèi)。這里我們可以通過(guò)實(shí)現(xiàn) splitView:constrainMinCoordinate:ofSubviewAt:
代理方法來(lái)做出限制皆撩,如果 Split View 中只有兩個(gè) View扣墩,可以這么寫(xiě):
- (CGFloat)splitView:(NSSplitView *)splitView constrainMinCoordinate:(CGFloat)proposedMinimumPosition ofSubviewAt:(NSInteger)dividerIndex {
return 200;
}
這樣,左側(cè)面板的寬度就不能小于 200 了扛吞,最大值同理呻惕。