整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

转载《关于移动端布局和pc端写法》

:移动端准备工作

<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
<meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1">
<!-- 设置在苹果手机上以应用模式启动时,是否全屏 -->

<meta name='apple-touch-fullscreen' content='yes'>
<!-- ios 系统 作用未知 -->
<meta name="apple-mobile-web-app-capable" content="yes" />
<!-- iso 系统 作用未知 -->
<meta content="fullscreen=yes,preventMove=no" name="ML-Config">
<!-- iso 系统 作用未知 -->
<meta name="apple-mobile-web-app-status-bar-style" content="black" />
 <!-- 是否识别 手机号码、 电子邮件 地址 等-->

 <meta name="format-detection" content="telephone=no,email=no,address=no" />
<!-- 让360双核浏览器用webkit内核渲染页面 -->  
<meta name="renderer" content="webkit"> 
<!-- 避免IE使用兼容模式 -->  
<meta http-equiv="X-UA-Compatible" content="IE=edge"> 
 允许全屏模式浏览,隐藏浏览器导航栏--><meta name="apple-mobile-web-app-capable" content="yes" />
<!--微信缓存-->      <meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" />      <meta http-equiv="Pragma" content="no-cache" />      <meta http-equiv="Expires" content="0" />  
<!--[if lt IE 9]>
  <script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script>
  <script src="https://oss.maxcdn.com/libs/respond.js/1.3.0/respond.min.js"></script>
<![endif]-->

二:pc端准备工作

<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
<meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1">
<!-- 让360双核浏览器用webkit内核渲染页面 -->  <meta name="renderer" content="webkit"> <!--[if lt IE 9]>  <script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script>  <script src="https://oss.maxcdn.com/libs/respond.js/1.3.0/respond.min.js"></script><![endif]-->

三:base.css公共样式pc端

body, div, span, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, abbr, address, cite, code, del, dfn, em, img, ins, kbd, q, samp, small, strong, sub, sup, var, b, i, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td, article, aside, canvas, details, figcaption, figure, footer, header, hgroup, menu, nav, section, summary, time, mark, audio, video { margin:0;padding:0;border: 0;}
ol,li,ul,dl,dt,dd{list-style:none;}
table{border-collapse:collapse;border-spacing:0}

h1,h2,h3,h4,h5,h6,i,strong {font-weight: normal;}  
img {vertical-align: middle;border: none;width: 100%;}  i {font: inherit;}  
a {color: #fff;text-decoration: none;-webkit-tap-highlight-color: rgba(0, 0, 0, 0); background-color:transparent;}
a:hover {text-decoration: underline; outline: none;}  
select::-ms-expand { display: none; }  
a:active,a:hover{outline:0}
.clearfix::before,.clearfix::after{    content: '';    display: block;    height: 0;    line-height: 0;    visibility: hidden;    clear: both;
}
.fl{ float:left;}.fr{float:right;}
input,select,option{vertical-align:middle;border-radius:0px;-moz-appearance:none;-webkit-appearance:none;appearance:none;-webkit-tap-highlight-color: rgba(0, 0, 0, 0);outline: none;}
input[type="text"],input[type="button"],input[type="submit"],input[type="reset"]{-webkit-appearance: none;appearance: none;border-radius: 0;outline: none;}  
.overflow {overflow:hidden; }  

四:base.css公共样式移动端

body, div, span, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, abbr, address, cite, code, del, dfn, em, img, ins, kbd, q, samp, small, strong, sub, sup, var, b, i, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td, article, aside, canvas, details, figcaption, figure, footer, header, hgroup, menu, nav, section, summary, time, mark, audio, video { margin:0;padding:0}
ol,li,ul,dl,dt,dd{list-style:none;}.fl {float: left;}  .fr {float: right;} 
table{border-collapse:collapse;border-spacing:0}
html {  
    -webkit-text-size-adjust: 100%;  
    -ms-text-size-adjust: 100%;  
    /* 解决IOS默认滑动很卡的情况 */  
    -webkit-overflow-scrolling : touch;  
}  
  
/* 禁止缩放表单 */  
input[type="submit"], input[type="reset"], input[type="button"], input {  
    resize: none;  
    border: none;  
}  
  
/* 取消链接高亮  */  
body, div, ul, li, ol, h1, h2, h3, h4, h5, h6, input, textarea, select, p, dl, dt, dd, a, img, button, form, table, th, tr, td, tbody, article, aside, details, figcaption, figure, footer, header, hgroup, menu, nav, section {  
    -webkit-tap-highlight-color: rgba(0, 0, 0, 0);  
}  
  
/* 设置HTML5元素为块 */  
article, aside, details, figcaption, figure, footer, header, hgroup, menu, nav, section {  
    display: block;  
}  
  
/* 图片自适应 */  
img {  
    width: 100%;  
    height: auto;  
    width: auto\9; /* ie8 */  
    -ms-interpolation-mode: bicubic;/*为了照顾ie图片缩放失真*/  
}  
em, i {  
    font-style: normal;  
}  
textarea {  
    resize:none; /*禁用了文本的拖拉,尤其在谷歌下*/  
}   
p {  
    word-wrap:break-word; /* 不够的单词自动换行 而不会被截掉 */  
}  
.clearfix:after {  
    content: "";  
    display: block;  
    visibility: hidden;  
    height: 0;  
    clear: both;  
}  
.clearfix {  
    zoom: 1;  
}  
a {  
    text-decoration: none;  
    color: #fff;  
    font-family: 'Microsoft YaHei', Tahoma, Arial, sans-serif;  
}  
a:hover {  

    text-decoration: none;  outline: none;
}  
 
h1, h2, h3, h4, h5, h6 {  
    font-size: 100%;  
    font-family: 'Microsoft YaHei';  
}  
img {  
    border: none;  
}  
input{  
    font-family: 'Microsoft YaHei';  
}  
/*单行溢出*/  
.one-txt-cut{  
    overflow: hidden;  
    white-space: nowrap;  
    text-overflow: ellipsis;  
}  
/*多行溢出 手机端使用*/  
.txt-cut{  
    overflow : hidden;  
    text-overflow: ellipsis;  
    display: -webkit-box;  
    /* -webkit-line-clamp: 2; */  
    -webkit-box-orient: vertical;  
}  
/* 移动端点击a链接出现蓝色背景问题解决 */  
a:link,a:active,a:visited,a:hover {  
    background: none;  
    -webkit-tap-highlight-color: rgba(0,0,0,0);  
    -webkit-tap-highlight-color: transparent;  
}  

.overflow {overflow:hidden; }
.w50{  
    width: 50%;  
}  
.w25{  
    width: 25%;  
}  
.w20{  
    width: 20%;  
}  
.w33{  
    width: 33.333333%;  

}  

五:移动端布局使用方法rem

第一种:js控制html字体大小, js代码放在head里面

html设置初始font-size:320px的字体大小

var html = document.getElementsByTagName('html')[0];
if (html) {
    var w = window.innerWidth;
    var fontSize = (w > 640 ? 640 : w) / 640 * 30;
    html.style.fontSize = fontSize + 'px';
}
window.onload = function () {
    window.onresize = function () {
        var w = window.innerWidth;
        console.log(w);
        var fontSize = (w > 640 ? 640 : w) / 640 * 30;
        html.style.fontSize = fontSize + 'px';
    }
}


第二种:js控制html字体大小常用 ,js代码放在head里面

html设置初始font-size:320px的字体大小

(function (doc, win) {
    var docEl = doc.documentElement;
    var resizeEvt = 'orientationchange' in window ? 'orientationchange' : 'resize';
    var recalc = function () {
        var clientWidth = docEl.clientWidth;
        if (!clientWidth) return;
        docEl.style.fontSize = (clientWidth > 640 ? 640 : clientWidth) / 320 * 20 + 'px';
    }; // 不同浏览器resize事件处理机制不同      // 使用定时器延迟处理resize回调函数以降低重复响应     
    var recalcTimer = null;
    var delaycalc = function () {
        win.clearTimeout(recalcTimer);
        recalcTimer = win.setTimeout(recalc, 100);
    }; // 移动端不需要考虑事件注册函数的兼容性    
    if (!doc.addEventListener) return;
    win.addEventListener(resizeEvt, delaycalc, false); // DOMContentLoaded事件只在DOM文档树加载完毕触发,此处不用延迟处理 
    doc.addEventListener('DOMContentLoaded', recalc, false);
})(document, window);


第三种:用媒体查询控制html字体大小

一:字体大小为15px开始 常用

html {
    font-size: 15px
}

html {
    font-size: 4.7vw;
    /* rem(root element)配合vw(viewport width)  */
}

@media only screen and (min-width:320PX) and (max-width:359PX) {

    html {

        font-size: 15px
    }

}

@media only screen and (min-width:360PX) and (max-width:374PX) {

    html {

        font-size: 16.875px
    }

}

@media only screen and (min-width:375PX) and (max-width:389PX) {

    html {

        font-size: 17.5781px
    }

}

@media only screen and (min-width:390PX) and (max-width:400PX) {

    html {

        font-size: 18.75px
    }

}

@media only screen and (min-width:401PX) and (max-width:414PX) {

    html {

        font-size: 19.4063px
    }

}

@media only screen and (min-width:415PX) and (max-width:640PX) {

    html {

        font-size: 22.5px
    }

}

@media screen and (min-width:641PX) {

    html {

        font-size: 30px
    }

}

二:字体大小为13.65px 不常用

html {

    font-size: 4.2vw;

    /* rem(root element)配合vw(viewport width) */

}

html {

    font-size: 13.65px
}

@media only screen and (min-width:320PX) and (max-width:360PX) {

    html {

        font-size: 13.65px
    }

}

@media only screen and (min-width:360PX) and (max-width:375PX) {
    html {
        font-size: 15.36px
    }
}

@media only screen and (min-width:375PX) and (max-width:390PX) {
    html {
        font-size: 16px
    }
}

@media only screen and (min-width:390PX) and (max-width:414PX) {
    html {
        font-size: 16.64px
    }
}

@media only screen and (min-width:414PX) and (max-width:460PX) {
    html {
        font-size: 17.664px
    }
}

@media only screen and (min-width:460PX) and (max-width:640PX) {
    html {
        font-size: 20px
    }
}

@media screen and (min-width:640PX) {
    html {
        font-size: 27.31px
    }
}

六:移动端布局用flex和自动缩放

新旧版本兼容:这里设置flex容器为.box,子元素为.item

1、Flex 布局

.box {
    display: -ms-flexbox;
    display: -webkit-flex;
    display: flex;
    display: -webkit-box;
    display: -moz-box;
}

旧版:display:box

新版:display:flex

2、定义主轴的方向

水平方向:

.box {
    -moz-flex-direction: row;
    -webkit-flex-direction: row;
    flex-direction: row;
    -webkit-box-direction: normal;
    -webkit-box-orient: horizontal;
}

垂直方向:

.box {
    -moz-flex-direction: column;
    -webkit-flex-direction: column;
    flex-direction: column;
    -webkit-box-direction: normal;
    -webkit-box-orient: vertical;
}

旧版:box-direction: normal 水平方向 | reverse 垂直方向 | inherit ,跟子元素的方向一致; 定义子元素的显示方向。

box-orient: horizontal 水平排列| vertical 垂直排列| inline-axis 默认 | block-axis 快方式排列 | inherit继承父元素; 定义子元素是否应水平或垂直排列。

这两种要同时设置才能确定排列方式;

水平方向:box-direction: normal;box-orient: horizontal

垂直方向:box-direction: normal; box-orient:vertical

新版:flex-direction:row(默认值):主轴为水平方向,起点在左端。

row-reverse:主轴为水平方向,起点在右端。
column:主轴为垂直方向,起点在上沿。

column-reverse:主轴为垂直方向,起点在下沿。

3、子元素主轴对齐方式

.box {
    -moz-justify-content: center;
    -webkit-justify-content: center;
    justify-content: center;
    -webkit-box-pack: center;
}

旧版: box-pack: start | end | center | justify;

注意:兼容写法新版语法的space-around是不可用的

新版:justify-content:flex-start(默认值):左对齐

flex-end:右对齐
center: 居中
space-between:两端对齐,项目之间的间隔都相等。

space-around:每个项目两侧的间隔相等。所以,项目之间的间隔比项目与边框的间隔大一倍。

4、子元素交叉轴对齐方式

.box {
    -moz-align-items: center;
    -webkit-align-items: center;
    align-items: center;
    -webkit-box-align: center;
}

旧版: box-align: start | end | center | baseline | stretch;

新版:align-items:flex-start:交叉轴的起点对齐。
flex-end:交叉轴的终点对齐。
center:交叉轴的中点对齐。
baseline: 项目的第一行文字的基线对齐。
stretch(默认值):如果项目未设置高度或设为auto,将占满整个容器的高度。

5、子元素属性:子元素在水平或者垂直方向占几分

.item{ -moz-flex: 1;
      -webkit-flex: 1; flex: 1; 
      -webkit-box-flex: 1.0;}

旧版:box-flex:1.0浮点数字

新版:flex:1 数字

6、超出要不要换行 不兼容,就是兼容了也无效

要求换行

.box{ flex-wrap:wrap; box-lines: multiple; }

旧版: box-lines: single默认不允许 | multiple 允许;

新版:flex-wrap: nowrap 不换行

wrap 换行,第一行在上方

wrap-reverse 换行,第一行在下方

7.新版的其他语法

01、行内元素也可以定义flex语法:不常用

.box{  display: -webkit-inline-flex;  display: inline-flex;}:

02、父元素属性align-content属性 定义在多跟抽线的对齐方式,一般是换行以后的对齐方式,只有一条抽线改属性不生效,常用在换行以后有间距的问题:设置align-content:flex-start; 不常用

align-content:flex-start:与交叉轴的起点对齐。 flex-end:与交叉轴的终点对齐。 center:与交叉轴的中点对齐。 space-between:与交叉轴两端对齐,轴线之间的间隔平均分布。 space-around:每根轴线两侧的间隔都相等。所以,轴线之间的间隔比轴线与边框的间隔大一倍。

stretch(默认值):轴线占满整个交叉轴。

03、子元素属性flex,是flex-grow, flex-shrink 和 flex-basis的简写,一般只定义子元素占多少份,常用

04、子元素属性flex-grow 定义子元素占一行的多少份,值为数字 不常用

05、子元素属性flex-basis属性 定义了在分配多余空间之前,项目占据的主轴空间 像素单位和百分比,默认auto

06、子元素属性flex-shrink属性 定义了子元素的缩小比例,如果所有项目的flex-shrink属性都为1,当空间不足时,都将等比例缩小。如果一个项目的flex-shrink属性为0,其他项目都为1,则空间不足时,前者不缩小。负值无效

07、 子元素属性order属性 定义子元素的排列方式,数值越小,越靠前排列,数字

08、子元素属性align-self属性 定义允许单个项目有与其他项目不一样的对齐方式,会覆盖algin-items属性 不常用

align-self: auto 默认 表示继承父元素

flex-start 与交叉轴的起点对齐。

flex-end 与交叉轴的终点对齐。

center 与交叉轴的中点对齐

baseline: 项目的第一行文字的基线对齐。

stretch(默认值):如果项目未设置高度或设为auto,将占满整个容器的高度。


8、兼容无效:

justify-content: space-around 不能用

flex-wrap: wrap 不能用

9、flex兼容的标准写法

-webkit-前缀标准版-moz-前缀标准版标准版-webkit-前缀09版

示例:

.box {
    display: -ms-flexbox;
    display: -webkit-flex;
    display: flex;
    display: -webkit-box;
    display: -moz-box;
}

10、新版的语法:

定义flex:

.box {
    display: -webkit-flex;
    /*webkit*/
    display: flex;
}

/*行内flex*/
.box {
    display: -webkit-inline-flex;
    /*webkit*/
    display: inline-flex;
}

父元素属性:

.box {
    flex-direction: row | row-reverse | column | column-reverse;
    /*主轴方向:左到右(默认) |   右到左    | 上到下 | 下到上*/
    flex-wrap: nowrap | wrap | wrap-reverse;
    /*换行:不换行(默认) | 换行 | 换行并第一行在下方*/
    flex-flow: <flex-direction> || <flex-wrap>;
    /*主轴方向和换行简写*/
    justify-content: flex-start | flex-end | center | space-between | space-around;
    /*主轴对齐方式: 左对齐(默认) |  右对齐  | 居中对齐 |     两端对齐  | 平均分布*/
    align-items: flex-start | flex-end | center | baseline | stretch;
    /*交叉轴对齐方式:顶部对齐(默认) | 底部对齐 | 居中对齐 | 上下对齐并铺满 | 文本基线对齐*/
    align-content: flex-start | flex-end | center | space-between | space-around | stretch;
    /*多主轴对齐:顶部对齐(默认) | 底部对齐   | 居中对齐  | 上下对齐并铺满  | 上下平均分布*/
}

子元素属性:

.item {
    order: <integer>;
    number
    /*排序:数值越小,越排前,默认为0*/
    flex-grow: <number>;
    /* default 0 */
    /*放大:默认0(即如果有剩余空间也不放大,值为1则放大,2是1的双倍大小,以此类推)*/
    flex-shrink: <number>;
    /* default 1 */
    /*缩小:默认1(如果空间不足则会缩小,值为0不缩小)*/
    flex-basis: <length> | auto;
    /* default auto */
    /*固定大小:默认为0,可以设置px值,也可以设置百分比大小*/
    flex: none | [ <'flex-grow'> <'flex-shrink'>? || <'flex-basis'>]
        /*flex-grow, flex-shrink 和 flex-basis的简写,默认值为0 1 auto,*/
        align-self: auto | flex-start | flex-end | center | baseline | stretch;
    /*单独对齐方式:自动(默认) | 顶部对齐   | 底部对齐 | 居中对齐 | 上下对齐并铺满 | 文本基线对齐*/
}


原文链接:https://blog.csdn.net/xgb0610/article/details/80416024

数字化转型的浪潮下,MISBoot低代码开发平台正成为越来越多企业的首选,其拖拉拽自定义表单功能更是成为业务人员的利器,实现了零代码开发的理想。这项革新技术不仅让业务人员轻松上手,还能直接挂载菜单应用,结合流程引擎、数据报表、电子签章等功能,适配移动端,拥有40种组件并可自行扩展,每个组件都有独立属性设置,列表字段、查询字段、列表配置都可以独立配置,同时还具备添加显隐规则、加载表单时触发、提交表单前触发、提交表单后触发等js、css代码的功能。这篇文章将深入探讨低代码开发平台拖拉拽自定义表单功能的强大之处,以及它对企业数字化转型的重要意义。

低代码开发平台的崛起

随着数字化转型的推进,企业对快速、灵活地开发应用程序和解决方案的需求日益增长。传统的软件开发过程往往耗时费力,需要专业的编程技能和繁琐的代码编写,这给业务人员带来了很大的挑战。然而,低代码开发平台的崛起改变了这一局面。低代码开发平台为业务人员提供了一种全新的开发范式,使他们可以通过直观的图形界面和拖拉拽操作就能创建应用程序,无需编写一行代码。其中的拖拉拽自定义表单功能更是低代码开发平台的一大特色,让业务人员可以轻松定制和调整表单布局,设定字段的验证规则,配置列表显示和查询条件,实现了真正意义上的零代码开发。

拖拉拽自定义表单的魅力

基于MISBoot低代码开发平台的拖拉拽自定义表单功能简直是让业务人员拥有了无限的可能性。这项功能使得业务人员能够根据实际需求,轻松创建符合自身业务流程的数据输入界面,无需编写一行代码。通过简单的拖拉拽和配置,就能完成一个完整的数据输入表单,包括40种组件可供选择,并且每个组件都有独立的属性设置,满足了各种不同的业务需求。同时,拖拉拽自定义表单功能适配移动端,使得用户可以在手机端便捷地进行表单操作,大大提升了工作效率和灵活性。

灵活性与扩展性的兼顾

拖拉拽自定义表单的灵活性和扩展性也是其独特之处。每个组件都可以执行扩展,使得平台可以适应各种复杂的业务场景。同时,列表字段、查询字段、列表配置都可以独立配置,为用户提供了更多的个性化选择,满足了不同用户的特定需求。此外,拖拉拽自定义表单还具备添加显隐规则、表单时触发、提交表单前触发、提交表单后触发等js、css代码的功能,让用户可以根据实际需求进行更加灵活的定制和扩展,实现更多样化的业务逻辑。

未来展望

MISBoot低代码开发平台 - 基于Spring Cloud微服务架构的拖拉拽自定义表单功能正在成为企业数字化转型的利器,它将业务人员从繁琐的编程工作中解放出来,使他们能够更专注于业务需求的实现和创新。随着技术的不断演进和平台功能的不断完善,相信拖拉拽自定义表单将在未来发挥越来越重要的作用,成为企业应用开发的标配工具之一。

结语

MISBoot低代码开发平台 - 基于Spring Cloud微服务架构的拖拉拽自定义表单功能不仅实现了零代码开发的梦想,更让业务人员轻松上手,为企业数字化转型注入了强大的活力和创造力。其灵活性、扩展性以及适配移动端的特点,将为企业带来更高效的业务流程和更好的用户体验,助力企业持续创新与发展。随着其不断的演进和普及,必将成为企业信息化建设的重要推动力量,为企业赢得更多商业机会和竞争优势。

图片展示

表单分类使业务更清晰

在线设计管理

表单在线系统配置界面

表单数据配置界面

桌面端表单设计区,丰富的组件及属性配置

移动端表单设计区,丰富的组件及属性配置

丰富的桌面端、移动端列表字段、查询字段、列表配置

多种表单预览方式

直接挂载菜单,挂载直接使用

直接绑定数据报表功能

直接绑定数据报表功能在线打印等

表单预览功能

toryboard是苹果一直推荐使用的界面开发方式。在近几年的 Xcode 更新中可以看出,苹果对 Storyboard 的开发力度也不断增强,添加了更多功能和特性,大大方便了界面的开发、适配以及提升代码性能。

Storyboard 最大的好处就是把界面和代码分离,如同 Web 开发中 CSS 描述界面,HTML 描述内容,JavaScript 描述行为一样,能让代码变得更清晰易读,界面的行为以及相互的逻辑也变得更直观。这对团队开发来说是大大的好事。

在我们准备着手开发 Catfan App 的时候,由于刚好 iOS 9 发布不久,而且 Swift 语言也逐渐稳定成熟,所以决定抛弃以往纯手写或 xib 来构建界面的历时包袱,完全使用纯 Storyboard 来进行开发。

在团队开发中,由于每个成员对 Storyboard 都有不一样的理解,这往往会导致在使用的时候出现各种冲突。这时候就需要要引入一套 Storyboard 的使用规范来避免。

目前使用纯 Storyboard 开发的大型开源项目不多,我们主要参考了 WordPress、Wikipedia 以及 IBAnimateable 官方项目的用法,并且在实践中不断研究探索来进行调整。

Storyboard 分离规范

除非是单页面应用,在大多数情况下,使用单一 Storyboard 往往是不可行的,因为每个 App 通常由各种不一样的复杂模块构成,每当里面的一个元素的属性或位置产生变化,都会导致整个 Storyboard 文件产生多处代码的变动。尤其在 Git 代码版本的控制下,处理分支合并产生的冲突会变得非常麻烦。

所以,把 Storyboard 分离有一个 1 - 5 原则:把每一个 Storyboard 尽量分离成一个人处理范围,每一个 Storyboard 尽量控制少于 5 个 View。例如,设置页面、注册页面、信息详情页、发布页面等,基本上只需要一人就能负责,而且页面大多数情况下都会少于 5 个 View (如果超过 5 个的时候,就可以考虑是不是在里面可以考虑把它们再分离)。把该模块的所有 View 都放在同一个的 Storyboard 文件里进行管理。这样就能大大减少相互冲突的情况,并且 Storyboard 的读取和渲染性能也比单独打开一个大型 Storyboard 的要快不少。

Storyboard 命名规范

一套优秀的代码项目,变量的命名,代码的语言风格都会有一套对应的规范,以便于成员之间进行沟通和开发。在 Storyboard 里面,各种的元素标识同样地也需要一套命名的规范,以便于开发之间的沟通。

尽管我们可以通过元素的 Identity Inspector 页面中的 Label 属性对元素进行强制命名标识。但 Xcode 有一个特性,当元素拖拉到代码处进行 IBOutlet 的变量绑定时候,该元素的标识会自动根据变量的名字进行自动命名,无需在 Label 属性中进行指定。其命名规则是把驼峰写法的变量的每个单词添加空格分隔,并且每个单词的首字母大写。例如:albumCollectionViewController -> Album Collection View Controller,passwordLabel -> Password Label。简单来说,元素标识的命名等同于在代码中的变量名称。

所以,根据这个特性,我们只需要在代码的元素变量命名中应用一套规范,就能同时规范在 Storyboard 中的命名了。

通常情况下,IBOutlet 变量使用【控件作用的名称 + Xcode 控件默认名】来命名会有不少的好处。

例如:

album + CollectionView

username + Label

avatar + ImageView

content + TextView

  • 规则简单,可读性强。

  • 自动转化成 Storyboard 的名称,如 Album Collection View、 Username Label、 Avatar Image View 等等,都符合 Xcode 默认的命名规范,显得一致。

  • 在代码中调用方法时,很容易就能识别出该变量在界面中是什么类型的元素,包含什么属性和方法。(当输入 avatarImageView. 的时候,你就能知道它会有 image 这个属性了)

(点击放大图像)

Storyboard 界面规范

Storyboard 除了作为 UI 界面的构建语言之外,还担当着界面预览的角色。界面规范有一个原则,就是当把 Storyboard 展示给其他人的时候,尽量做到能让别人一看就知道这个 Storyboard 是干什么的,界面之间的逻辑是怎样的,界面大致的效果是如何的。

布局规范

Xcode 本身就有就有布局辅助线提示的功能,当进行拖动的时候,可以根据提示的辅助线来进行 View 或控件之间的对齐,合理利用此特性能方便我们调整出整齐的布局。

View 和 View 之间的摆放,可以遵循从左往右,从上到下的原则,进行逻辑排列。因为在 Storyboard 里 View 之间的连线算法都是从 View 的右边缘出发,到另外一个 View 的左边缘结束,如果调转了,就会出现很多交叉的连线,让界面看起来很乱。

其次,View 之间最好也留有足够的间隔,不要太挤,也不需要太远。大概在大于四分之一,小于四分之三 View Contrller 的宽度(默认是 600 * 600)较佳。

在 Xcode 7 里,新增加了 Storyboard Reference 控件(虽然是在 iOS 9 新增加的,但 iOS 8 也可用)。合理使用此控件,能让 Storyboard 描述出 View 与其它 Storyboard 的跳转逻辑。并且可以通过 Segue 来进行 View 之间的数据传递,统一规范 View 之间跳转的代码,让逻辑更清晰。

但总的来说,布局的位置基本上因人而异,没有完全正确的布局方式。只要在摆放的时候,花点时间思考如何让人看起来舒服,有逻辑性,那基本上就能达到目的了。

(点击放大图像)

设置规范

为了达到在 Storyboard 里,能呈现出 View 在运行时大致的界面,在设置 View 与各种控件的时候,同样需要制定一些规范,以达到统一的展示效果。

例如在设置 Label、Text View 等作为内容 Placeholder 的时候,text 属性所填写的最好是实际运行时所呈现内容的例子。如展示用户名的 Lable 就填写 Username,展示时间的 Label 就填写 2010-01-01,展示内容的 Text View 就填写一些 Lorem ipsum dolor sit ... 等默认内容之类的。如果不这样区分,界面中一大堆默认的 Label 会是怎样的一种感觉?

对于展示固定内容的 text 属性,那最好都统一基于 Based Language 来设置,否则如果在后期需要对程序进行多国语言化的时候,会非常麻烦。

在新版的 Xcode 里,还新增加了 IBDesignable 和 IBInspectable 两个特性,只需要添加一些代码,就能让 Storyboard 里的控件呈现出更加接近运行时所呈现的效果。有兴趣的,可以参考相关的文章介绍。

全局开发规范

除了上述的规范外,还有更多细节的地方是会可能涉及到整个项目所有 Storyboard 的设置的。例如:

  • 文字字体,字体大小,各元素的颜色

  • 语言定义

  • Autolayout 设置方式

  • 界面自适应设置

  • UITest 相关设置

  • 更多

这些都需要在统一开发之前,预先进行团队协商和定义。最好能把它写成一个团队文档,让所有成员都遵循这个方式进行设定,这样就能减少开发中可能产生的冲突,透过 Storyboard 的方式,让 iOS 开发变得更加便捷。

总结

尽管使用规范会因团队、项目、技术等的不同要素而有所差异。但总的来说,在开发时订立一套团队Storyboard的使用规范,将会大大提升项目整体开发的质量以及速度。