PPiFlatSegmentedControl项目是一个很流行的开源iOS控件库,提供了 扁平化风格(Flat style)的SegmentedControl,可以自定义segment的颜色,图标、大小等等,十分灵活美观。
效果如下:
但是作为一个OC项目,在我们进行OC和Swift混合编程时,由于 PPiFlatSegmentedControl的创建实例方法中使用了Block,产生了一些问题。
首先,根据官方文档,Swift中采用闭包来替代Block,但是我水平有限,使用闭包来调用时,程序并不能正常运行。同时Swift中的@Selector经过验证是可以正常使用的,于是我采用了使用@Selector替代Block的方案。
1.修改/添加 PPiFlatSegmentedControl源码中的实例化方法
在这里,为 PPiFlatSegmentedControl添加了全新的方法,其中最大变化是采用了@Selector。
- (id)initWithFrame:(CGRect)frame items:(NSArray*)items iconPosition:(IconPosition)position target:(id)target andSelection:(SEL)action;
同时根据需求,为 PPiFlatSegmentedControl对象添加了target和selAction属性。
@property (nonatomic) SEL selAction; @property (nonatomic) id target;
最后就是修改项目返回SelectIndex的方法 segmentSelected: ,这里有两种方案可以采用,分别是 objc_msgSend()和[id performSelector : withObject :]。
-(void)segmentSelected:(id)sender{ if(sender){ NSUInteger selectedIndex=[self.segments indexOfObject:sender]; [self setEnabled:YES forSegmentAtIndex:selectedIndex]; //Calling block if(self.selBlock){ self.selBlock(selectedIndex); } if(_selAction!=nil){ //objc_msgSend(_target,_selAction,[NSNumber numberWithInteger:selectedIndex],selectedIndex); [_target performSelector:_selAction withObject:[NSNumber numberWithInt:selectedIndex]]; } } }
到这里,我们对OC源码的修改就完成了,下面进行Swift调用的演示。
var data=[["text":"test1"],["text":"test2"]]; var segmentControl = PPiFlatSegmentedControl(frame: CGRectMake(Yunshouyi.SCREEN_WIDTH/4, 10, Yunshouyi.SCREEN_WIDTH/2, 25), items: data, iconPosition: IconPositionRight, target:self, andSelection:"segmentControlSelected:") segmentControl.color=TextServcie.getcolorfromHEX("#36b5fc") segmentControl.borderWidth=0 segmentControl.selectedColor=TextServcie.getcolorfromHEX("#0193e6") segmentControl.selectedTextAttributes=[NSFontAttributeName:UIFont.systemFontOfSize(13), NSForegroundColorAttributeName:UIColor.whiteColor()] segmentControl.textAttributes=[NSFontAttributeName:UIFont.systemFontOfSize(13), NSForegroundColorAttributeName:TextServcie.getcolorfromHEX("#0971b0")] self.navigationItem.titleView=segmentControl;
调用@Selector代码:
func segmentControlSelected(index:NSNumber){ if(index.intValue==0){ switchToFoundation() }else{ switchToP2P() } }
PPiFlatSegmentedControl项目地址: https://github.com/pepibumur/PPiFlatSegmentedControl