很多App第一次启动都会有一个欢迎界面,欢迎界面往往决定这用户对App的第一映像,所以欢迎界面的重要性不言而喻。QQ、微博、知乎等App都有制作精良的欢迎界面。
大多数欢迎界面由几个界面组成,通常界面上会有一张背景图和简单的介绍文字,页面直接的切换类似于Android的ViewPager一样,靠左右滑动来切换。通常会提供了一个Skip按钮来让用户跳过欢迎界面。
本文将告诉你如何制作一个欢迎界面。
- EAIntroView(Object-C写的欢迎界面第三方库) https://github.com/ealeksandrov/EAIntroView
- Settings插件 (JamesMontemagno制作的插件之一,用来记录App的设置数据) https://github.com/jamesmontemagno/Xamarin.Plugins/tree/master/Settings
为了使用EAIntroView我们首先需要将源生的Ojbect-C库绑定成Xamarin能用的程序集。Xamarin绑定请参考Xamarin官网的教程,我只会讲主要的操作和贴一些关键的代码。
http://developer.xamarin.com/guides/ios/advanced_topics/binding_objective-c/
在有了Objective Sharpie后绑定已经比较方便了,基本上只要稍微修改下自动生成ApiDefinitions文件即可。
用git命令将EAIntroView克隆下来,并稍微浏览下源生的Ojbect-C代码
git clone https://github.com/ealeksandrov/EAIntroView.git
在XCode中建立新的iOS Cocoa Touch Static Library,名字叫做EAIntroViewStatic。
将EAIntroView的源代码文件(EAIntroView文件夹中,共4个)复制到XCode的工程中。
按下Command+B编译,我们会发现提示缺少了EARestrictedScrollView相关的文件。这是因为EAIntroView依赖于EARestrictedScrollView造成的,EARestrictedScrollView是EAIntroView的作者的另一个第三方库。
和EAIntroView一样,在源生开发中也是利用CocoaPod将源代码文件引用到当前工程中的,所以我们到Example/Pods/EARestrictedScrollView文件夹中将EARestrictedScrollView的源代码复制到我们的工程中来。再修改下头文件的引用就OK了。
再次按下Command+B就提示Build Successed了。
当目标平台为iOS Device时会显示Build Faild,为了在真机中可以使用,我们需要进行签名。点击工程,就可以进入设置界面,在Build Setting中的Code Signing Idtntity中选择iOS Developer。
然后我们需要将.a文件制作成通用类库
参考这篇文章官网的绑定教程中也有提及
为了方便我给出Makefile,按照上述操作进行过代码签名后可以用make命令方便的生成模拟器和真机(32位、64位)都可以使用的.a文件,如果你开始和我的工程名不一样的话请注意修改。
XBUILD=/applications/Xcode.app/Contents/Developer/usr/bin/xcodebuildPROJECT_ROOT=.PROJECT=$(PROJECT_ROOT)/EAIntroViewStatic.xcodeprojTARGET=EAIntroViewStaticall: libEAIntroView.alibEAIntroView-i386.a:$(XBUILD) -project $(PROJECT) -target $(TARGET) -sdk iphonesimulator -configuration Release clean build-mv $(PROJECT_ROOT)/build/Release-iphonesimulator/lib$(TARGET).a $@libEAIntroView-armv7.a:$(XBUILD) -project $(PROJECT) -target $(TARGET) -sdk iphoneos -arch armv7 -configuration Release clean build-mv $(PROJECT_ROOT)/build/Release-iphoneos/lib$(TARGET).a $@libEAIntroView-arm64.a:$(XBUILD) -project $(PROJECT) -target $(TARGET) -sdk iphoneos -arch arm64 -configuration Release clean build-mv $(PROJECT_ROOT)/build/Release-iphoneos/lib$(TARGET).a $@libEAIntroView.a: libEAIntroView-armv7.a libEAIntroView-i386.a libEAIntroView-arm64.alipo -create -output $@ $^clean:-rm -f *.a *.dll
libEAIntroView.a文件就是最终的生成结果。
首先还是在Xamarin中建立iOS Binding Project。
将刚刚生成的.a文件拖入到工程中,并修改linkWith描述文件
using System;using ObjCRuntime;[assembly: LinkWith("libEAIntroView.a", LinkTarget.ArmV7 | LinkTarget.Simulator | LinkTarget.Arm64 | LinkTarget.ArmV7s | LinkTarget.Simulator64, SmartLink = true, ForceLoad = true)]
然后用Objective Sharpie将Object-C的头文件翻译成ApiDefinitions具体的教程我也不写了,官网已经非常详细了,下面是要执行的命令
sharpie bind --output=EAIntroView --namespace=EAIntroView --sdk=iphoneos8.2 [项目的绝对路径]/EAIntroViewStatic/*.h
生成ApiDefinitions.cs和StructsAndEnums.cs后覆盖Binding项目的同名文件。
然后还需要进行少量的修改,主要是同名函数的问题(Object-C的函数名由函数名+参数名决定,所以当函数名相同而参数名不同时C#没办法分辨,只要改改函数名就行),还有几个提示是需要需要用强类型替换NObject类型,这个我们可以先不管。
ApiDefinitions.cs文件太长我就不贴了,到时候会放在Github上。
至此我们生成了Xamarin能使用的dll文件。
有2种方式
- 通过Nuget包管理器下载
- 通过源代码自己编译
这里我们用Nuget省事,在Nuget命令行中输入如下的命令即可。
Install-Package Xam.Plugins.Settings
另外iOS需要这样设置下,启用Generic Value Type Sharing
参考
- http://components.xamarin.com/gettingstarted/settingsplugin
- https://github.com/jamesmontemagno/Xamarin.Plugins/tree/master/Settings
主要是CrossSettings.Current对象和它的2个函数GetValueOrDefault、AddOrUpdateValue,这2个函数的功能看名字应该就非常清楚了。
//%20从设置中获取指定Key的值,并转换成相应的类型。GetValueOrDefault<T>(string%20key);//%20向设置中添加制定key的值,如果已存在key则是更新当前值。AddOrUpdateValue<T>(string%20key,T%20value);
设置的生命周期与应用程序一样,当应用程序被卸载时清空。
using%20System;using%20UIKit;using%20Refractored.Xam.Settings;using%20Refractored.Xam.Settings.Abstractions;using%20CoreGraphics;namespace%20EAIntroView.Sample{%20%20%20%20public%20partial%20class%20EAIntroView_SampleViewController%20:%20UIViewController%20%20%20%20{%20%20%20%20%20%20%20%20public%20EAIntroView_SampleViewController(IntPtr%20handle)%20%20%20%20%20%20%20%20%20%20%20%20:%20base(handle)%20%20%20%20%20%20%20%20{%20%20%20%20%20%20%20%20}%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20///%20<summary>%20%20%20%20%20%20%20%20///%20App设置%20%20%20%20%20%20%20%20///%20</summary>%20%20%20%20%20%20%20%20///%20<value>The%20app%20settings.</value>%20%20%20%20%20%20%20%20private%20static%20ISettings%20AppSettings%20%20%20%20%20%20%20%20{%20%20%20%20%20%20%20%20%20%20%20%20get%20%20%20%20%20%20%20%20%20%20%20%20{%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20CrossSettings.Current;%20%20%20%20%20%20%20%20%20%20%20%20}%20%20%20%20%20%20%20%20}%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20public%20override%20void%20ViewDidLoad()%20%20%20%20%20%20%20%20{%20%20%20%20%20%20%20%20%20%20%20%20base.ViewDidLoad();%20%20%20%20%20%20%20%20%20%20%20%20%20//%20Perform%20any%20additional%20setup%20after%20loading%20the%20view,%20typically%20from%20a%20nib.%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20//在主界面中添加一个UILabel用于区分%20%20%20%20%20%20%20%20%20%20%20%20var%20label%20=%20new%20UILabel(new%20CGRect(0,%20200,%20320,%2060));%20%20%20%20%20%20%20%20%20%20%20%20label.Text%20=%20"这里是主界面哦~";%20%20%20%20%20%20%20%20%20%20%20%20label.TextAlignment%20=%20UITextAlignment.Center;%20%20%20%20%20%20%20%20%20%20%20%20label.Font%20=%20UIFont.SystemFontOfSize(40);%20%20%20%20%20%20%20%20%20%20%20%20this.View.AddSubview(label);%20%20%20%20%20%20%20%20%20%20%20%20//通过Setting获取启动次数,当第一次启动的时候获取到的值为0%20%20%20%20%20%20%20%20%20%20%20%20var%20BootTimes%20=%20AppSettings.GetValueOrDefault<int>("BootTimes");%20%20%20%20%20%20%20%20%20%20%20%20//第一个欢迎页面,我们在上面显示本次是第几次启动App%20%20%20%20%20%20%20%20%20%20%20%20EAIntroPage%20page1%20=%20new%20EAIntroPage();%20%20%20%20%20%20%20%20%20%20%20%20page1.Title%20=%20"Page1";%20%20%20%20%20%20%20%20%20%20%20%20page1.Desc%20=%20"Hello%20World%20%20%20Page1%20no%20Description";%20%20%20%20%20%20%20%20%20%20%20%20page1.BgColor%20=%20UIColor.Orange;%20%20%20%20%20%20%20%20%20%20%20%20//在正常情况下我们可以通过判断BootTimes的值来决定是否显示欢迎界面%20%20%20%20%20%20%20%20%20%20%20%20if%20(BootTimes%20<=%200)%20%20%20%20%20%20%20%20%20%20%20%20{%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20page1.Desc%20=%20"你是第一次启动哦~~~";%20%20%20%20%20%20%20%20%20%20%20%20}%20%20%20%20%20%20%20%20%20%20%20%20else%20%20%20%20%20%20%20%20%20%20%20%20{%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20page1.Desc%20=%20string.Format("本次是你第{0}次启动本程序",%20BootTimes);%20%20%20%20%20%20%20%20%20%20%20%20}%20%20%20%20%20%20%20%20%20%20%20%20%20EAIntroPage%20page2%20=%20new%20EAIntroPage();%20%20%20%20%20%20%20%20%20%20%20%20page2.Title%20=%20"Page2";%20%20%20%20%20%20%20%20%20%20%20%20page2.Desc%20=%20"Hello%20World%20%20%20Page2%20no%20Description";%20%20%20%20%20%20%20%20%20%20%20%20page2.BgColor%20=%20UIColor.Red;%20%20%20%20%20%20%20%20%20%20%20%20EAIntroPage%20page3%20=%20new%20EAIntroPage();%20%20%20%20%20%20%20%20%20%20%20%20page3.Title%20=%20"Page3";%20%20%20%20%20%20%20%20%20%20%20%20page3.Desc%20=%20"Hello%20World%20%20%20Page3%20no%20Description";%20%20%20%20%20%20%20%20%20%20%20%20page3.BgImage%20=%20UIImage.FromBundle("Visual-Studio.jpg"); //欢迎界面 EAIntroView introView = new EAIntroView(this.View.Frame, new []{ page1, page2, page3 }); //显示欢迎界面 introView.ShowInView(this.View); //将启动次数增加1,并保存在配置文件中 AppSettings.AddOrUpdateValue("BootTimes", ++BootTimes); } }}
效果如下:
当第一次运行时,第一个界面显示首次运行本程序,当在后台关闭程序后再打开界面会显示是第二次打开本程序。
有关EAIntroView的详细配置请参
新闻热点
疑难解答