六运褪、iWriter 布局的設(shè)定

大家好惊楼,我是姜友華,前面兩章我們實(shí)現(xiàn)了兩類(lèi)視圖秸讹,一個(gè)是標(biāo)簽視圖胁后,一個(gè)是分割視圖。這一節(jié)我們來(lái)實(shí)現(xiàn)布局的控制嗦枢。

在進(jìn)行布局控制之前,我們先來(lái)了解一下布局屯断。

一文虏、布局的設(shè)定侣诺。

布局的構(gòu)成

上圖是我們對(duì)當(dāng)前應(yīng)用進(jìn)行的布局設(shè)定,它有以下特征氧秘。

  1. 布局是由分割視圖(SplitView)和標(biāo)簽視圖(BlockView)組成年鸳,前者為枝節(jié)點(diǎn),后者為葉節(jié)點(diǎn)丸相。
  2. 每一個(gè)BlockView會(huì)加載一組功能視圖搔确。
  3. 每個(gè)SplitView必須至少包含有一個(gè)BlockView,如果沒(méi)有灭忠,則該SplitView可被移除膳算。

二、 數(shù)據(jù)的設(shè)定弛作。

1)數(shù)據(jù)的定義涕蜂。

通過(guò)布局的設(shè)定,我們可以理解為布局是加載一組樹(shù)狀結(jié)構(gòu)的數(shù)據(jù)映琳。所以我們將這下數(shù)據(jù)抽取出來(lái)机隙,表現(xiàn)如下:

struct Layout: Codable {
    static func == (lhs: Layout, rhs: Layout) -> Bool {
        return lhs.id == rhs.id
    }
    var id = Date.id
    var children: [Layout] = [] // 為空時(shí)為葉節(jié)點(diǎn)
    var kind: Kind = .hSplit
    var bar: Bar = Bar()
    var length: CGFloat? = nil
    
    enum Kind: Codable, Equatable, Hashable {
        case hSplit  // 橫的
        case vSplit  // 豎的
        case chapter // 章節(jié)窗口
        case assist  // 輔助功能窗口
    }
    
    struct Bar: Codable, Equatable, Hashable{
        var tags: [Int] = [0]
        var current: Int = 0
    }
}
  • id、kind萨西、bar有鹿、length,都是附加數(shù)據(jù)谎脯。分別表示創(chuàng)建的時(shí)間葱跋、視圖的類(lèi)型、占寬或高等信息穿肄。
  • children年局,表示為布局視圖的子節(jié)點(diǎn)。
  • kind咸产,表示葉節(jié)點(diǎn)加載的視圖的類(lèi)型矢否。暫時(shí)定義了4種:
    1. hSplit水平分割的視圖;
    2. vSplit垂直分割的視圖脑溢;
    3. chapter章節(jié)視圖僵朗;
    4. assist輔助功能視圖。
  • Bar結(jié)構(gòu)體屑彻,需要說(shuō)明一下验庙。
    1. tags,打開(kāi)的標(biāo)簽社牲。
    2. current粪薛,當(dāng)前的標(biāo)簽。

2)對(duì)應(yīng)用的視圖搏恤。

  • LayoutView违寿,對(duì)應(yīng)用kind = hSplitkind = vSplit, 加載layout湃交,并實(shí)現(xiàn)布局的分割與嵌套, 與其實(shí)類(lèi)型的實(shí)例化。
  • ChapterView藤巢,對(duì)應(yīng)用kind = chapter, 加載章節(jié)內(nèi)容搞莺。
  • AssistView,對(duì)應(yīng)用kind = assist, 為輔助功能視圖掂咒。具體到每個(gè)輔助功能才沧,則都有自己的視圖,暫定的有:
  1. CatalogView绍刮,目錄温圆。
  2. MindView, 導(dǎo)圖。
  3. ReminderView录淡,備忘捌木。
  4. SymbolView,符號(hào)嫉戚。
  5. CollectView刨裆,收藏。
  6. SearchView彬檀,搜索帆啃。
  • Layout數(shù)據(jù)示例:
let layout: Layout = Layout(
        children:[Layout(
            kind: .assist,
            bar: Layout.Bar(tags: [0], current: 0),
            length: 200
        ),Layout(
            kind: .chapter,
            bar: Layout.Bar(tags: [0], current: 0),
            length: 400
        ),Layout(
            kind: .assist,
            bar: Layout.Bar(tags: [1,2,3,4,5], current: 1),
            length: 400
        )],
        kind: .hSplit
    )

我們定義一個(gè)layout,它水平顯示3欄:

  1. 加載目錄窍帝,寬200;
  2. 加載文章努潘,寬400;
  3. 加載其它輔助功能,寬400.
    需要注意的是坤学,首先疯坤,為什么是寬?因?yàn)檫@是水平的kind: hSplit布局深浮,如果是垂直的布局則為高压怠;其次,為什么第一欄加載的是目錄飞苇?因?yàn)槲覀兂跏蓟艘唤M輔助功能數(shù)據(jù)菌瘫。
let assists = [
        Assist(kind: .catalog),
        Assist(kind: .mind),
        Assist(kind: .reminder),
        Assist(kind: .symbol),
        Assist(kind: .collect),
        Assist(kind: .search)
    ]

運(yùn)行一下,看看效果布卡。


布局的顯示效果

三雨让、操作的設(shè)定。

從布局的設(shè)定可以看出忿等,界面的表面會(huì)被ChapterViewAssistView所覆蓋栖忠,也就是說(shuō),我們無(wú)論將標(biāo)簽拖到哪個(gè)位置,其下必然有ChapterViewAssistView娃闲。因此我們只需要在ChapterViewAssistView上對(duì)拖移作反應(yīng)即可虚汛。這種反映叫熱區(qū)反映。

`BlockView`的反應(yīng)區(qū)

熱區(qū)分上下左右中和頂部皇帮,其中頂部為標(biāo)簽欄。

  1. 左蛋辈、右熱區(qū)属拾。表示隨標(biāo)簽移動(dòng)的FunctionView將與熱區(qū)BlockView水平排列,并放置其左或其右冷溶。
  2. 上渐白、下熱區(qū)。處理邏輯同上逞频,位置為其上或其下纯衍。
  3. 中、頂熱區(qū)苗胀。表示隨標(biāo)簽移動(dòng)的FunctionView將加入到熱區(qū)BlockView里襟诸,作為標(biāo)簽方式呈現(xiàn)。
  4. 經(jīng)過(guò)左熱區(qū)時(shí)基协,BlockView 視圖區(qū)左則顯示蒙版歌亲。右、上澜驮、下如之類(lèi)推陷揪。
  5. 經(jīng)過(guò)中熱區(qū)時(shí),BlockView 視圖區(qū)顯示全蒙版杂穷。
  6. 經(jīng)過(guò)頂熱區(qū)時(shí)悍缠,BlockView 標(biāo)題區(qū)顯示位置蒙版。

好耐量,這一節(jié)就這些飞蚓,我是姜友華,下次見(jiàn)拴鸵。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末玷坠,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子劲藐,更是在濱河造成了極大的恐慌八堡,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,482評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件聘芜,死亡現(xiàn)場(chǎng)離奇詭異兄渺,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)汰现,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)挂谍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)叔壤,“玉大人,你說(shuō)我怎么就攤上這事口叙×痘妫” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,762評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵妄田,是天一觀的道長(zhǎng)俺亮。 經(jīng)常有香客問(wèn)我,道長(zhǎng)疟呐,這世上最難降的妖魔是什么脚曾? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,273評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮启具,結(jié)果婚禮上本讥,老公的妹妹穿的比我還像新娘。我一直安慰自己鲁冯,他們只是感情好拷沸,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評(píng)論 5 373
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著晓褪,像睡著了一般堵漱。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上涣仿,一...
    開(kāi)封第一講書(shū)人閱讀 49,046評(píng)論 1 285
  • 那天勤庐,我揣著相機(jī)與錄音,去河邊找鬼好港。 笑死愉镰,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的钧汹。 我是一名探鬼主播丈探,決...
    沈念sama閱讀 38,351評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼拔莱!你這毒婦竟也來(lái)了碗降?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 36,988評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤塘秦,失蹤者是張志新(化名)和其女友劉穎讼渊,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體尊剔,經(jīng)...
    沈念sama閱讀 43,476評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡爪幻,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評(píng)論 2 324
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片挨稿。...
    茶點(diǎn)故事閱讀 38,064評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡仇轻,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出奶甘,到底是詐尸還是另有隱情篷店,我是刑警寧澤,帶...
    沈念sama閱讀 33,712評(píng)論 4 323
  • 正文 年R本政府宣布甩十,位于F島的核電站船庇,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏侣监。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評(píng)論 3 307
  • 文/蒙蒙 一臣淤、第九天 我趴在偏房一處隱蔽的房頂上張望橄霉。 院中可真熱鬧,春花似錦邑蒋、人聲如沸姓蜂。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,264評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)钱慢。三九已至,卻和暖如春卿堂,著一層夾襖步出監(jiān)牢的瞬間束莫,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,486評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工草描, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留览绿,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,511評(píng)論 2 354
  • 正文 我出身青樓穗慕,卻偏偏與公主長(zhǎng)得像饿敲,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子逛绵,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容