通过KVC修改私有成员变量,自定义tabbar

KVC,全拼“key value coding”。都知道在字典转模型上有奇效,其实通过它,还能访问私有成员变量,并间接修改替换它的值。

接下来以自定义tabbar做个范例:


通过KVC修改私有成员变量,自定义tabbar_第1张图片

KVC如何实现上面的效果?

1、写一个MJTarbar继承于UITabBar;

2、在MJTabbar 上加一个按钮,设置按钮的image、size,中心点在tabbar的中心点,按钮点击事件可用delegate或者block传递;

3、在layoutSubviews重新排布MJTarbar上的UITabBarButton的frame(size.width,origin.x);

- (void)layoutSubviews{

[superlayoutSubviews];

// 1.设置按钮的位置

CGPointtemp =self.plusBtn.center;

temp.x=self.frame.size.width/2;

temp.y=self.frame.size.height/2-25;

self.plusBtn.center=temp;

// 2.设置其它UITabBarButton的位置和尺寸

CGFloattabbarButtonW =self.frame.size.width/5;

CGFloattabbarButtonIndex =0;

for(UIView*childinself.subviews) {

NSLog(@"child:%@",child);

Class class =NSClassFromString(@"UITabBarButton");

if([childisKindOfClass:class]) {

//设置宽度

CGRecttemp1=child.frame;

temp1.size.width=tabbarButtonW;

temp1.origin.x=tabbarButtonIndex * tabbarButtonW;

child.frame=temp1;

//增加索引

tabbarButtonIndex++;

if(tabbarButtonIndex ==2) {

tabbarButtonIndex++;

}

}

}

}

4、关键步骤,在UITabBarController中利用KVC,替换tabbar;

MJTabbar*tabbar = [[MJTabbaralloc]init];

tabbar.tabbarDelegate=self;

[selfsetValue:tabbarforKeyPath:@"tabBar"];

5、执行代理方法;

-(void)tabbarDidClickPlusBtn:(MJTabbar*)tabbar{

NSLog(@"--------------------点击了中间按钮---------------------");

[self presentViewController:[MJViewControllernew] animated:YEScompletion:nil];

}



通过KVC修改私有成员变量,自定义tabbar_第2张图片

6、到这一步UI部分差不多了,但是发现超出tabbar的那部分(上图红色区域)点击事件是没有响应的,这就需要在下1 API转化成相对中间按钮的坐标newPoint,通过下2 API判断newPoint是否在按钮的bounds区域内。

1、- (CGPoint)convertPoint:(CGPoint)point toView:(nullableUIView*)view;

2、CG_EXTERN bool CGRectContainsPoint(CGRect rect, CGPoint point)

至此,UI及逻辑基本完成了。

那么像闲鱼APP中间的发布按钮点击旋转动画是怎么设置的呢?这个其实跟本期主题没关系(我也不会!!!),下次学一下再分享。

你可能感兴趣的:(通过KVC修改私有成员变量,自定义tabbar)