• 我的大菠萝 – 2,控件及数据绑定


    控件拖放

    背景图片的设置

    现在开始为每个tab page增加控件

    对于"装备",有一个背景图片,按照大菠萝3里面的设定,有5种英雄,每种分为男、女,共10张图片。大小均为宽994,高665。我们选择男性野蛮人作为背景,主要是把各种装备放到对应的位置上。

    从toolbar上拖放一个image view到"装备"的view controller。

    为了管理我们的图片,我们要在程序中新建立一个文件夹

    打开finder,定位到我们的Diablo3Rank文件夹,新建一个sub folder,名字为:Assets

    然后在左侧的工程视图中,选择"Diablo3Rank,右键点击,选择Add Files to "Diablo3Rank"

    在接下来的文件窗口中,点击"Assets",再点击"Add"按钮

    此时,左侧的project视图中,增加了我们的Assets文件夹

    在Assets上点右键,继续选择"Add files to "Diablo3Rank",选择从blizzard官网上下载的文件:该文件原名为barbarian_male.jpg,我们修改为barbarianmale_background.jpg(后面程序设置时需要)

    我们再回到story board中,选中"装备" view controller,点击ImageView(刚才我们拖进去的那个控件),然后点击右侧属性栏上的"Attributes Inspector",再点击Image下拉框,选择我们刚刚加入的barbarianmale_background.jpg

    注意,图片大小会根据你拖放的Image View的大小,进行"Scale to Fill"的缩放,所以我们要修改为原始尺寸大小

    点击Size Inspector,修改宽度和高度为994和665

    然后我们拖动图片,居于屏幕中间(此时会出现一条水平的蓝色线以及垂直的蓝色线)。

    重新点击这个"装备"的controller,选择View

    然后在attribute inspector中设置背景色为黑色

    再次运行程序,我们看到的效果如下:

    下面的4个tab item比较别扭,因为我们还没有设置图片。

    标签及装备的设置

    从tool bar上分别拖放两个Lable及无数个ImgeView。

    Label分别显示该英雄的巅峰等级和名字。

    ImageView主要针对不同位置的装备。每个装备,都有一个底图,有5种颜色,为Blue/Orange/Brown/Green/Yellow,对应装备的不同(如暗金、蓝装等);然后上面一层是该装备的真实图片。对于某些部分,有孔,那么要把镶孔及宝石也画出来。

    最终,我们的UI如下:

    运行时的效果如下

    供后面编程用的outlet生成

    定义新的ViewController类

    然后我们需要对每个控件,生成一个outlet,以方便我们后面的代码进行赋值操作。

    选择"巅峰等级:100"那个label,打开Assistant Editor。咦,怎么是UIViewController.h文件?看起来是Apple自己的东西啊!

    由于我们需要对此界面进行很多编程工作,所以,我们需要定义一个新的UIViewController。

    为了便于管理,同Assets目录一样,我们也在当前工程目录下面,创建一个ViewController文件夹,然后我们Add files的方式,选择这个文件夹加入到工程中。

    然后在此文件夹下面,创建一个新的objective-c类,叫做UIViewControllerItem,继承自UIViewController。

    文件创建成功后,重新打开story board,选择装备ViewController(标记1),在右侧inspector中选择Identity Inspector(左数第三个)(标记2),在class中,输入:UIViewControllerItem,然后回车(标记3)。回车后,我们发现在Assistant Editor中,自动打开了UIViewControllerItem.m文件。(标记4)

    在.m文件中,找到@implementation UIViewControllerItem,输入两个大括号,如图

    增加outlet

    鼠标选择"巅峰等级:100"那个label,按住Ctrl键,。箭头出现后,拖放到两个括号中间,松开鼠标,出现一个弹出窗口,在Name中输入textParagonLevel,然后回车

    回车后,我们发现在两个括号中间,多了一个变量声明。

    此时点击右侧的Inspector,选择最后一个Connection Inspector,我们看到该label与ViewController有了一个reference关系。

    这样,代码中就可以对该label进行赋值操作了。同理,我们把剩下的"英雄的名字"Label以及所有装备相关的ImageView,都创建好outlet。最后,我们的.M文件应该类似于这样

    数据绑定

    实体类的定义

    下一步,我们要开始把英雄的数据显示出来。暴雪有官方的API,都是http get的方式,返回结果是json格式。

    API文档地址是:http://blizzard.github.io/d3-api-docs/

    首先定义一个objective-c的class,名字叫做Profile。它是对于每个暗黑3玩家的一个定义,包括区域、tag、昵称。打开profile.h文件,里面定义方法:GetHeroByID,返回一个Hero实体类型。同时定义三个property.

    再打开profile.m文件,把.h文件中的GetHeroByID那行粘贴过来,去掉最后的分号,然后加上两个大括号。

    对于每个profile下面的各种Hero,我们定义Hero类。

    其他的Stat/Items/Follower就不详述了。

    回到上面话题,我们需要根据英雄ID获取Hero实体信息,那么这个ID如何得到的呢?你可以用http://us.battle.net/api/d3/profile/senjougahara-1375/来得到Profile的json数据,随机挑一个ID,作为我们的英雄ID。

    下载数据的辅助类

    构造英雄的url

    上面调用了NSString类的静态方法stringWithFormat,后面的格式,与传统的C的printf非常类似。唯一要注意的是,如果传递的是NSString*数据,那么要用%@,而不是%s。

    有了URL之后,就可以下载数据了。

    为了提高效率,下载的数据会做缓存,我们调用Helper类的DownlaodBinaryByUrl方法,缓存文件名字是:区域-tag-英雄id格式

    所有缓存数据都放在Library文件夹下面的一个新子文件夹:D3CACHE

    根据URL及缓存文件名称,开始下载文件

    JSON的解析

    根据英雄ID下载下来的数据是NSData类型的,转换为字符串后可以看到,是Json类型。

    对于json数据的读取,主要是objectForKey方法。如

    但是要注意,如果是string类型,那么不要用[objectForKey:keyName] stringValue,而是直接用[objectForKey:keyName即可。如

    对于英雄的基本属性信息,都存放在stats节点中,包括力量/智力/各种防御指数/生命等。

    对于技能,都存放在skills节点中,包括2个鼠标技能、4个键盘技能以及3个被动技能。

    对于追随者,都存放在followers节点中,包括3个追随者的4个技能、6个装备。

    方法的调用

    这些数据处理类都写好了后,我们要开始测试了。取英雄ID:33281470来做测试吧。

    在project中,打开前面定义好的UIViewControllerItem.m,在最上面增加一行profile.h的引用

    然后在didLoad方法中,构造一个profile先(暂时手工构造,因为我们还没有处理profile增加、保存的功能)

    然后再调用GetHeroByID,最终代码如下:

    在最后一个括号上设置断点,运行一下,看hero是否能真正取到?

    当程序运行到断点处后,我们在下面的debug区域,展开hero对象

    Yeah!我们得到了数据!

    展开Items节点,我们发现有Head/Torso/…/Offhand等各种信息。展开head看看

    图片绑定

    现在我们先把头盔的数据绑定到视图上。上面的ICON返回的是一个头盔图片的URL,所以我们要首先能够把图片下载并缓存起来。

    在Hero文件中,定义方法GetItemImageByIconName,利用DownloadBinaryByUrl把图片下载下来并进行缓存。

    然后利用UIImage的相应方法,读取一个UIImage的对象。

    我们先把头盔的图片以及头盔的底图展示出来

    好,头盔出来了!绿色的底图,这个头盔是一个套装。和暴雪标准的展示还有些区别,第一,绿色底图应该有一个边框。

    边框设置是针对UIImage的layer设置的,有两部分组成,包括设置边框颜色以及边框宽度。

    现在还要处理镶孔。头盔只有一个孔,所以我们只需要判断该装备的SocketImage1是否为空即可。如果为空,即没有孔,那么需要把镶孔和宝石图片都隐藏,否则就显示出来。

    再运行一下,效果如下:

    好,头盔好了,剩下的装备,依法炮制,最终运行一下,看看结果。

    等一下,还有几个地方不大一样。巅峰等级、英雄名字还没有设置,而且,背景不正确,这是一个女蛮子。

    So,还有几个地方要修改一下。

    背景图片,则是根据Hero的ClassName拼出一个字符串,以得到对应的背景图片名称。

    最终,我们的"装备"搞好了。看看效果

    上面头盔对应的heroid与本图不是同一个heroID,所以有差异,原因是开始我用的那个heroid,衣服都被扒到其他英雄身上去了,所以后来我找了这个有全部装备的英雄。

  • 相关阅读:
    装饰器模式(Decorator)
    原语:从0到1,从硬件指令集到OS原语,锁原语的哲学
    从Oop-Klass模型看透反射
    从三数之和看如何优化算法,递推-->递推加二分查找-->递推加滑尺
    单例模式-静态内部类实现及原理剖析
    单例模式-DCL双重锁检查实现及原理刨析
    二分查找java实现
    I/O管理杂记
    PCB WCF Web接口增减参数后,在客户端不更新的情况,是否影响客户端,评估测试
    PCB MS SQL 排序应用(row_number rank dense_rank NTILE PARTITION)
  • 原文地址:https://www.cnblogs.com/charju/p/3482823.html
Copyright © 2020-2023  润新知