
扩展第三方类
细心的朋友可能会发现,我们前面计算主角的大小用的总是同一方向第一帧纹理的大小,如果纹理大小有出入的话,会产生较大的偏差,最好的方法是取当前动画帧纹理的大小。不过这有些难度,所以我们退之求其次,计算所有帧的平均大小吧。
这次我们不修改原有的第三方类,因为我们上面已经熟悉了类的内部功能,所以我们直接用Swift写一个类的扩展吧(Objective-C的语法...)。
在项目API组中新建一个Swift文件,名为CAWSpriteLayer+ext.swift。
打开该文件,将其替换为如下内容:
import UIKit
extension CAWSpriteLayer{
func avgSizeForFrameBase(_ frameNameBase:String)->CGSize{
//待实现
}
}
可以看到我们在CAWSpriteLayer类的扩展里新建了方法,该方法唯一的参数为同一方向的纹理名称前缀,即如果是向上,则会传入 "w背" 实参,它会将所有"w背"前缀的纹理大小都加入计算。
我们前面已经了解到,CAWSpriteLayer类中含有一个animationLayer.spriteData变量,其中有我们想要每一帧名称、大小等等所需要的所有信息。
我们现在来实现avgSizeForFrameBase方法,将其中的注释一行替换为如下内容:
let dict = animationLayer.spriteData as! [String:CAWSpriteData]let baseNames = Array(dict.keys)let frameNames = baseNames.filter {$0.hasPrefix(frameNameBase)}var totalWidth:CGFloat = 0var totalHeight:CGFloat = 0let count = CGFloat(frameNames.count)for frameName in frameNames{ let spriteData = dict[frameName]! totalWidth += CGFloat(spriteData.spriteWidth) totalHeight += CGFloat(spriteData.spriteHeight)}return CGSize(width: totalWidth/count, height: totalHeight/count)
回到spriteSize方法,将其中的:
spriteSize = sprite.size(forFrame: "w正0")
之类的方法,换为新的平均值方法:
spriteSize = sprite.avgSizeForFrameBase("w正")
其他方向类似。
好啦!我们已经成功的按我们的需求扩展了第三方的类!!!
结尾
经历了前面这么多的内容,大家看的一定很累,这是自然的。(虽然本猫写的也很累...),希望大家可以略微学到一丢丢新知识,希望大家可以把它应用到实际App开发中去 _
现在!抛开电脑,到了happy的时候了!冲个热水澡,来杯冰镇可乐+至尊大汉堡套餐?之类的美味吧!!!
感谢观赏,再会!
PS:全部代码可以到我的github中下载:
https://gitee.com/hopy/iOS-JingJin/tree/master/TPSupportsTest