-- 第七课:制作引导滑页与定制主题

这是本应用的最后一节课,我们将添加一些最终的方案来优化用户体验。我们将添加一个滑页手册来向用户展示如何使用本应用(只会在第一次打开应用的时候展示),然后添加一些样式让应用看起来漂亮一些。 我们先来看看滑页。

滑动组件

使用滑动卡片手册来向用户做应用介绍说非常通用的一个做法。Ionice有一个内置的滑动组件,所以我们将用它来实现,然后确保用户不用每次打开应用都看到他。 滑动组件本身就很简单,可以用来展示一系列的图片,最后一个滑动页里面是一个按钮用于进入应用。 首先,我们创建好滑动组件,然后我们研究如何将他整合到我们的应用中。我们从创建模板开始。 > 修改src/pages/intro/intro.html 如下:

<ion-content>
    <ion-slides [options]="slideOptions">
        <ion-slide>
            <img src="assets/images/slide1.png" />
        </ion-slide>

        <ion-slide>
            <img src="assets/images/slide2.png" />
        </ion-slide>

        <ion-slide>
            <img src="assets/images/slide3.png" />
        </ion-slide>

        <ion-slide>
            <ion-row>
                <ion-col>
                    <button ion-button color="light" (click)="goToHome()" style="margin-top:20px;">Start Using Quicklists</button>
                </ion-col>
            </ion-row>

            <ion-row>
                <ion-col>
                    <img src="assets/images/slide4.png" />
                </ion-col>
            </ion-row>
        </ion-slide>
    </ion-slides>
</ion-content>

这是个比较简单的范例,我们只是想让按钮显示到图片的顶部,但是你也可以通过给列提供宽度来制作更复杂的布局:

<ion-row>
    <ion-col width-10></ion-col>
    <ion-col width-50></ion-col>
</ion-row>

现在我们来定义intro组件的类。 > 修改 src/pages/intro/intro.ts为如下:

import { Component } from '@angular/core';
import { NavController } from 'ionic-angular';
import { HomePage } from '../home/home';

@Component({
    selector: 'page-intro',
    templateUrl: 'intro.html'
})

export class IntroPage {

    slideOptions: any;
    constructor(public nav: NavController){
        this.slideOptions = {
            pager: true
        };
    }

    goToHome(): void {
        this.nav.setRoot(HomePage);
    }
}

这是不是迄今为止见过的最简单的类?他所作的知识导入home页面,给我们的slider设置pager属性,当调用goToHome的时候通过NavController改变根页面。这样我们在最后一个滑动页点击按钮的时候就可以跳转到home页面,但是我们可能会遇到点问题。当用户每次打开这个原因的时候都要看一遍这个用户手册。要解决这个问题的时候,我们需要对home.ts做一个改动。 > 修改 src/pages/home/home.ts为如下:

import { Component } from '@angular/core';
import { NavController, AlertController, Platform } from 'ionic-angular';
import { ChecklistPage } from '../checklist/checklist';
import { ChecklistModel } from '../../models/checklist-model';
import { Data } from '../../providers/data';
import { Keyboard } from 'ionic-native';
import { IntroPage } from '../intro/intro';
import { Storage } from '@ionic/storage';

> 修改 src/pages/home/home.ts 的ionViewDidLoad方法如下:

checklists: ChecklistModel[] = [];

constructor(public nav: NavController, public dataService: Data, public alertCtrl: AlertController, public storage: Storage, public platform:Platform) {

}

ionViewDidLoad(){

    this.platform.ready().then(() => {
        this.storage.get('introShown').then((result) => {
            if(!result){
                this.storage.set('introShown', true);
                this.nav.setRoot(IntroPage);
            }
        });

        this.dataService.getData().then((checklists) => {
            let savedChecklists: any = false;
            if(typeof(checklists) != "undefined"){
                savedChecklists = JSON.parse(checklists);
            }

            if(savedChecklists){
                savedChecklists.forEach((savedChecklist) => {

                    let loadChecklist = new ChecklistModel(savedChecklist.title, savedChecklist.items);

                    this.checklists.push(loadChecklist);

                    loadChecklist.checklist.subscribe(update => {
                        this.save();
                    });
                });
            }
        });
    });
}

我们再次导入和用到了Storage。我们会用他来存储一个标记告诉我们是否有展示过用户手册。 这样我们设置好了新的存储,检查introShown标记的存在。如果不存在的话我们将转到介绍页面然后将标记值设为true这样下次他就不会展示了。 注意:测试的时候,如果你想清除此标记值,那么直需要删除浏览器创建的WebSQL就可以了。在Chrome上,访问chrome://settings/cookies,查找localhost,然后删除其中的_ionicstorage。这样当然会删除在WebSQL中存储的所有数据,不不止是introShown标记。

定制主题

当前应用的功能已经100%完成了。我们需要给应用添加一个样式让他比现在看起来更漂亮些。 你应该记得基础部分里面有一些不同的给应用添加样式的方法。我们将给每个组件添加指定的样式,我们将在核心文件中添加一些通用样式,然后在变量文件内覆盖一些SASS变量。如果你跳过了那部分,或者还不大清楚我讲的什么的话,建议你回去重新读一下基础部分的定制主题。 由于我们在Ionic 2中用SASS来制作CSS,我们可以嵌入CSS样式。由于每个页面是他自己的组件,我们可以在组件里有目的的针对元素。尽管如此,我们的每个组件都有独立的.scss文件,CSS规则还是全局应用的。如果在其中一个组件中添加如下样式:

p {
    font-size: 1.2em !important;
}

他将会被应用到应用内的每个组件。 > 修改 src/pages/intro/intro.scss 为如下:

page-intro {

    ion-slide {
        background-color: #32db64;
    }

    ion-slide img {
        height: 85vh !important;
        width: auto !important;
    }

}

我们在page-intro里面定义了页面的样式,这样一来他只会在页面添加到DOM的时候应用到元素(因为这个组件有一个page-intro 选择器selector)里面的元素上,而不是整个应用。这个样式会把滑动组件的背景色设为绿色,将滑动页里面的图片设置为视图高度的85%。 其他组件需要添加其他一些类到模板中,这里我直接po代码了。 > 修改 src/pages/home/home.html 为如下:

<ion-header>
    <ion-navbar color="secondary">
        <ion-title>
        <img src = "assets/images/logo.png" />
        </ion-title>
        <ion-buttons end>
        <button ion-button icon-only (click)="addChecklist()"><ion-icon name="add-circle"></ion-icon></button>
        </ion-buttons>
    </ion-navbar>
</ion-header>

<ion-content>
    <ion-list no-lines>
    <ion-item-sliding *ngFor="let checklist of checklists">
        <button ion-item (click)="viewChecklist(checklist)" class="home-item">
        {{checklist.title}}
        <span class="secondary-detail">{{checklist.items.length}} items</span>
        </button>
        <ion-item-options>
        <button ion-button icon-only color="light" (click)="renameChecklist(checklist)"><ion-icon
        name="clipboard"></ion-icon></button>
        <button ion-button icon-only color="danger" (click)="removeChecklist(checklist)"><ion-icon
        name="trash"></ion-icon></button>
        </ion-item-options>
    </ion-item-sliding>
    </ion-list>
</ion-content>

> 修改 src/pages/home/home.scss 为如下:

page-home {

    ion-item-sliding {
        margin: 5px;
    }

    .home-item {
        font-size: 1.2em;
        font-weight: bold;
        color: #282828;
        padding-top: 10px;
        padding-bottom: 10px;
    } 

    .secondary-detail {
        display: block;
        color: #cecece;
        font-weight: 400;
        margin-top: 10px;
    }
}

我们这里没有做什么疯狂的事情,只是对边距,间隔和颜色做了一些调整。接着我们对checklist页面做相同的事情。 > 修改 src/pages/checklist/checklist.scss 为如下:

page-checklist {
    ion-item-sliding {
        margin: 5px;
    }

    ion-checkbox {
        font-size: 0.9em;
        font-weight: bold;
        color: #282828;
        padding-top: 0px;
        padding-bottom: 0px;
        padding-left: 4px;
        border: none !important;
    }

    ion-item-content {
        border: none !important;
    }

    ion-checkbox {
        border-bottom: none !important;
    }

    ion-checkbox .item-inner {
        border-bottom: none !important;
    }
}

同样,只是一些轻微的调整。我们现在来对整个应用添加一些样式。 > 添加以下样式到 src/app/app.scss :

ion-content {
    background-color: #32db64 !important;
} 

.logo {
    max-height: 39px;
}

button {
    border: none !important;
}

这里我们让整个应用的背景色变成了绿色,我们设置了logo的最大高度,然后移除了按钮的边缘。最后,我们将覆盖一些SASS变量。 > 修改 src/theme/variables.scss 命名颜色变量部分为如下:

$colors: (
    primary: #387ef5,
    secondary: #32db64,
    danger: #f53d3d,
    light: #f4f4f4,
    dark: #222,
    favorite: #69BB7B
);

$list-background-color: #fff;
$list-ios-activated-background-color: #3aff74;
$list-md-activated-background-color: #3aff74;
$checkbox-ios-background-color-on: #32db64;
$checkbox-ios-icon-border-color-on: #fff;
$checkbox-md-icon-background-color-on: #32db64;
$checkbox-md-icon-background-color-off: #fff;
$checkbox-md-icon-border-color-off: #cecece;
$checkbox-md-icon-border-color-on: #32db64;

注意:一个比较便利的查看iOS和Android不同的途径是利用Ionic Lab,可以通过命令ionic serve -l来激活。可以发现通过Ionic Lab查看应用的时候侧边有滚动条,我觉得这是个bug,他在真实设备上运行的时候不会出现(Chrome Dev Tools模拟器也不会有)。 可以看到,Ionic 2自动适配应用当前运行平台的规范。

总结

就这样!应用现在就宣告完成,看起来也挺不错的。

Last updated