接着我们思考如何进行封装。前面已经将过了为什么要封装,和封装达到的效果。这里我们主要有两种封装方式,分别是站在不同的角度上看待问题。虽然角度不同但是内部最核心的思想还是一样的,就是屏蔽控件内部是如何构造的细节,为外界提供简单容易理解的接口。方式一:SWPTabBar屏蔽所有内在细节,只需提供要创建的控件个数。就可以创建出SWPTabBar的大体框架。接着有几个方法可以用来设置TabBar内部按钮的数据。简单来说只需提供1.设置按钮个数。2.设置按钮数据的接口。
注意:那么我们如何保证接口的健壮性,要知道如果有用户反复或多次设置按钮个数,那么我们要做到的效果是重新构造TabBar新的内部,而不能造成按钮的重复累加。这也是我们设计接口时候要考虑的一点,该接口是否方便使用,时候多次使用会出错等等许多细节。并不是所设计接口就是随便的提供个方法的调用这么简单,这需要经验的积累。
首先看下面代码和注释:
分析:1.首先我们可以选择在initWithFrame中添加控件。为什么不在init呢,因为用户可能会直接调用initWithFrame方法,这样就不正确了。但是init方法其实还会调用initWithFrame方法,所以我们重写initWithFrame方法是最保险的方式。2.必须在确定了SWPTabBar的尺寸之后再计算其子控件的位置和尺寸,所以我们重写layoutSubViews方法。分析中的1和2代码分别如下:
以下代码为重写layoutSubViews实现内部子控件的位置尺寸的确定。
修改后的代码如下
-(instancetype)initWithFrame:(CGRect)frame{if(self=[superinitWithFrame:frame]){}returnself;}-(void)setNumberOfBarButton:(NSUInteger)numberOfBarButton{_numberOfBarButton=numberOfBarButton;//先删除存在的按钮[selfclear];//先添加按钮[selfsetup];}-(void)clear{[self.subviewsmakeObjectsPerformSelector:@selector(removeFromSuperview)];}效果图如下:
3.改进我们知道,UITabBarController中的几个子控制器是UINavagationController,当点击下面SWPTabBar控件中的按钮时候,进行子控制器的切换,当点击UINavigationController上面的按钮进行跳转时候,实际上是UINavigationController对其子控制器进行压栈操作。现在我们想实现的效果是,当UINavigationController切换其子控制器的时候,新的控制器不显示出UITabBar,我们可以通过SB中操作来勾选新控制器的HideBarButtom…来对UITabBar进行隐藏,然而我们自定义的SWPTabBar并不是UITabBar的子控件而是其兄弟控件,所以设置的效果是作用在UITabBar上,又因为SWPTabBar比较后面添加,盖在了上面,所以是看不到效果的。此时我们只需要换种思路,把SWPTabBar直接加进UITabBar控件中,并完全覆盖它即可实现这样的效果。
-(void)viewDidLoad{[superviewDidLoad];SWPTabBar*tabBar=[[SWPTabBaralloc]init];tabBar.frame=self.tabBar.bounds;tabBar.numberOfBarButton=5;tabBar.delegate=self;[self.tabBaraddSubview:tabBar];}