KVC,全拼“key value coding”。都知道在字典转模型上有奇效,其实通过它,还能访问私有成员变量,并间接修改替换它的值。
接下来以自定义tabbar做个范例:
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];
}
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中间的发布按钮点击旋转动画是怎么设置的呢?这个其实跟本期主题没关系(我也不会!!!),下次学一下再分享。
网友评论