美文网首页
六、iWriter 布局的设定

六、iWriter 布局的设定

作者: Jiangyouhua | 来源:发表于2022-02-22 10:16 被阅读0次

大家好,我是姜友华,前面两章我们实现了两类视图,一个是标签视图,一个是分割视图。这一节我们来实现布局的控制。

在进行布局控制之前,我们先来了解一下布局。

一、布局的设定。

布局的构成

上图是我们对当前应用进行的布局设定,它有以下特征。

  1. 布局是由分割视图(SplitView)和标签视图(BlockView)组成,前者为枝节点,后者为叶节点。
  2. 每一个BlockView会加载一组功能视图。
  3. 每个SplitView必须至少包含有一个BlockView,如果没有,则该SplitView可被移除。

二、 数据的设定。

1)数据的定义。

通过布局的设定,我们可以理解为布局是加载一组树状结构的数据。所以我们将这下数据抽取出来,表现如下:

struct Layout: Codable {
    static func == (lhs: Layout, rhs: Layout) -> Bool {
        return lhs.id == rhs.id
    }
    var id = Date.id
    var children: [Layout] = [] // 为空时为叶节点
    var kind: Kind = .hSplit
    var bar: Bar = Bar()
    var length: CGFloat? = nil
    
    enum Kind: Codable, Equatable, Hashable {
        case hSplit  // 横的
        case vSplit  // 竖的
        case chapter // 章节窗口
        case assist  // 辅助功能窗口
    }
    
    struct Bar: Codable, Equatable, Hashable{
        var tags: [Int] = [0]
        var current: Int = 0
    }
}
  • id、kind、bar、length,都是附加数据。分别表示创建的时间、视图的类型、占宽或高等信息。
  • children,表示为布局视图的子节点。
  • kind,表示叶节点加载的视图的类型。暂时定义了4种:
    1. hSplit水平分割的视图;
    2. vSplit垂直分割的视图;
    3. chapter章节视图;
    4. assist辅助功能视图。
  • Bar结构体,需要说明一下。
    1. tags,打开的标签。
    2. current,当前的标签。

2)对应用的视图。

  • LayoutView,对应用kind = hSplitkind = vSplit, 加载layout,并实现布局的分割与嵌套, 与其实类型的实例化。
  • ChapterView,对应用kind = chapter, 加载章节内容。
  • AssistView,对应用kind = assist, 为辅助功能视图。具体到每个辅助功能,则都有自己的视图,暂定的有:
  1. CatalogView,目录。
  2. MindView, 导图。
  3. ReminderView,备忘。
  4. SymbolView,符号。
  5. CollectView,收藏。
  6. SearchView,搜索。
  • Layout数据示例:
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
    )

我们定义一个layout,它水平显示3栏:

  1. 加载目录,宽200;
  2. 加载文章,宽400;
  3. 加载其它辅助功能,宽400.
    需要注意的是,首先,为什么是宽?因为这是水平的kind: hSplit布局,如果是垂直的布局则为高;其次,为什么第一栏加载的是目录?因为我们初始化了一组辅助功能数据。
let assists = [
        Assist(kind: .catalog),
        Assist(kind: .mind),
        Assist(kind: .reminder),
        Assist(kind: .symbol),
        Assist(kind: .collect),
        Assist(kind: .search)
    ]

运行一下,看看效果。


布局的显示效果

三、操作的设定。

从布局的设定可以看出,界面的表面会被ChapterViewAssistView所覆盖,也就是说,我们无论将标签拖到哪个位置,其下必然有ChapterViewAssistView。因此我们只需要在ChapterViewAssistView上对拖移作反应即可。这种反映叫热区反映。

`BlockView`的反应区
热区分上下左右中和顶部,其中顶部为标签栏。
  1. 左、右热区。表示随标签移动的FunctionView将与热区BlockView水平排列,并放置其左或其右。
  2. 上、下热区。处理逻辑同上,位置为其上或其下。
  3. 中、顶热区。表示随标签移动的FunctionView将加入到热区BlockView里,作为标签方式呈现。
  4. 经过左热区时,BlockView 视图区左则显示蒙版。右、上、下如之类推。
  5. 经过中热区时,BlockView 视图区显示全蒙版。
  6. 经过顶热区时,BlockView 标题区显示位置蒙版。

好,这一节就这些,我是姜友华,下次见。

相关文章

  • gobox中的log操作

    今天来说下使用gobox中的log操作 log级别定义 重要的interface IWriter 定义消息写入到哪...

  • [前端学习]移动web部分学习笔记,第二天

    网页布局方法总结: 目前已经学习了两种布局方式:固定宽度布局:常见于PC端,设定固定的宽度作为版心来布局流式布局:...

  • Android布局动画简单应用

    Android 布局动画 Android的布局动画主要用在ViewGroup上,使其对内部子view运行设定的动画...

  • 11.21学习日志

    关于vim的使用 如何commit 下午的布局的n种方法,蕾蕾分享了六种水平居中样式,分别是设定行内块元素、flo...

  • View的getWidth()和getMeasuredWidth

    getWidth(): View在设定好布局后整个View的宽度。getMeasuredWidth(): 对Vie...

  • Android的前期(一)学习——布局

    布局的创建——关于布局1.在Android程序中界面是通过布局文件设定的,在每个应用程序创建时都会默认包含一个主界...

  • Android通用圆角布局

    该布局是一个可以任意设定布局圆角的大小,宽度,颜色等。可满足基于的开发工作中遇到的圆角布局需求。 效果图 特点 包...

  • 六、目标设定

    1.好处:清晰定义出需要做什么,将经理的期望和员工的期望保持一致,绩效回顾的依据,为工作的调整和学习的提升提供依据...

  • CSS3中的flex布局

    通过设定外部盒子为flex布局,并设定flex规则,来实现对内部元素排列的控制 flex相关的属性有以下几点 主轴...

  • 两栏&三栏&双飞翼&圣杯

    两栏自适应布局(左边固定,右边自适应) 利用CSS中的calc()方法来动态设定宽度 双float布局 缺点:要清...

网友评论

      本文标题:六、iWriter 布局的设定

      本文链接:https://www.haomeiwen.com/subject/grdglrtx.html