iOS上的include --- PlaceHolderView

前言

小弟从事移动开发,从Android入门,再兼做iOS,总的来说Android和iOS的思路是相同的,但细节上还是有不少出入.iOS的xib非常强大,特别是User Defined Runtime Attributes,相对于Android只能通过attrs更是有过之无不及,当然,有好就有坏,使用iOS的时候,最不习惯的,就是没有include,后来Google了一下,也只能通过代码硬编码,初始化一个view并且自行实现约束,无法直接映射,直到有天发现了awakeAfterUsingCoder:这个方法,也就有了PlaceHolderView这个库


项目链接:

https://github.com/Halin-Lee/PlaceHolderView.git

pod 'PlaceHolderViewLib'

简单实现

1.在任意.m文件添加 PlaceHolderViewClass 宏,参数为xib文件名称,如图:


iOS上的include --- PlaceHolderView_第1张图片

宏将自动添加一个名为HLSimpleDemoSubView和一个名为PHHLSimpleDemoSubView的类


2.在xib中需要使用到的地方,添加一个view,改名为 PH+宏参数名称,如PHHLSimpleDemoSubView,


iOS上的include --- PlaceHolderView_第2张图片

3.运行,可以看到,PHHLSimpleDemoSubView已经被直接替换


iOS上的include --- PlaceHolderView_第3张图片

进阶

很多时候,我们可能不止需要简单的替换view,还需要为view初始化一些效果,这时候,可以使用进阶方式构造

1.新建一个子类及xib,继承PlaceHolderInitDelegate,并在commonInitCallByPlaceHolderView实现自定义方法,如图


iOS上的include --- PlaceHolderView_第4张图片

2.将xib的根view定义为上面构建的类,如HLBaseDemoView,拉出outlet


iOS上的include --- PlaceHolderView_第5张图片

3.在xib中需要使用到的地方,添加一个view,改名为 PH+宏参数名称,如PHHLSimpleDemoSubView,同简单实现的第二步


4.运行,可以看到,PHHLBaseDemoView已经被直接替换,点击文本,能看到在commonInitCallByPlaceHolderView设置的动画效果,如图

iOS上的include --- PlaceHolderView_第6张图片



多屏适配

PlaceHolderView不止可以实现view的映射,如果有需要,还能实现多屏适配,具体实现

1.添加与原xib同名的适配xib,具体名称为,名称_长_宽,如图


iOS上的include --- PlaceHolderView_第7张图片

2.运行效果,


iOS上的include --- PlaceHolderView_第8张图片
在iPhone 6sp上
iOS上的include --- PlaceHolderView_第9张图片
其他尺寸效果



为什么需要使用commonInitCallByPlaceHolderView

苹果建议的View初始化是在awakeFromNib中实现,但因为使用了awakeAfterUsingCoder来替换View,导致了view在awakeAfterUsingCoder初始化的时候调用了一次awakeFromNib,接着在被添加到父类的时候,又调用了一次awakeFromNib,容易导致异常,所以需要使用commonInitCallByPlaceHolderView


后语

苹果在推行storyboard的时候,有一个比较坑的问题就是所有的UI几乎都在同一个storyboard文件上实现,很容易导致storyboard文件臃肿,牵一发动全身,PlaceHolderView提供了另一种解决这个问题的办法,那就是storyboard只定义页面跳转和UIViewController的层级关系,具体的UI实现通过映射,在xib上实现,示例代码里面的Main就是以这种方式实现,storyboard的View只是一个壳,具体的实现在HLMainView做

第一次写技术文章,第一次发技术库,望多多指教,感谢...

你可能感兴趣的:(iOS上的include --- PlaceHolderView)