用Button子类化封装假的分段控件
来源:互联网 发布:google网站数据统计 编辑:程序博客网 时间:2024/06/10 06:22
本文写的是用button封装一个继承自UI view的控件,达到的效果就是看上去是分段控件,但是可以自定义不同状态下各个button的背景图片,可以设置是否需要下划线标识,采用代理的方式,让控制器拿到当前选中的button的下标进行接下来的操作。
首先,我在继承自UI view的类中定义了一个数组:控件标题的数组,然后定义了set方法。因为我要设置button的图片,所以,还定义了normal和selected状态下的图片名数组,还有是否需要下划线标识属性
@interface CustomContrlBtnView : UIView{ NSArray *_menuArray;//标题数组 //是否需要底部划线 BOOL _isNeedLine;}//正常状态的背景图片@property (nonatomic, strong) NSArray *imgArr;//选中时的背景图片@property (nonatomic, strong) NSArray *selectImgArr;//是否需要底部划线@property BOOL isNeedLine;//delegate@property (nonatomic, strong)id <MenuProtocol> myDelegate;- (void)setNameWithArray:(NSArray *)menuArray; //set 方法
bool类型的属性定义还要在.m文件中写入:
@synthesize isNeedLine = _isNeedLine;
代理要遵循协议,所以定义一个协议
//协议@protocol MenuProtocol <NSObject>@optional //可选的@required //必选的- (void)getTag:(NSInteger)tag;//获取当前选中下标@end
然后,在set方法的实现方法中,分别创建button,设置button的frame:
- (void)setNameWithArray:(NSArray *)menuArray{ _menuArray = menuArray; //计算每个button的宽度 CGFloat btnW = self.frame.size.width / [_menuArray count]; for (int i = 0; i < menuArray.count; i++) { UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom]; btn.frame = CGRectMake(i * btnW, 0, btnW, self.frame.size.height); btn.backgroundColor = [UIColor clearColor]; //设置tag值 btn.tag = 1501 + i; //设置默认第一个选中 if (btn.tag == 1501) { btn.selected = YES; } //判断是否有背景图片 if (self.imgArr.count > 0) { //设置背景图片 [btn setBackgroundImage:[UIImage imageNamed:self.imgArr[i]] forState:UIControlStateNormal]; [btn setBackgroundImage:[UIImage imageNamed:self.selectImgArr[i]] forState:UIControlStateSelected]; } //根据有无下划线确定按钮颜色 if (_isNeedLine) { //设置按钮的字体大小 颜色 状态 [btn setTitleColor:kContrlColor forState:UIControlStateNormal]; [btn setTitleColor:kItemColor forState:UIControlStateSelected]; }else { //设置按钮的字体大小 颜色 状态 [btn setTitleColor:kskyBlueColor forState:UIControlStateNormal]; [btn setTitleColor:[UIColor whiteColor] forState:UIControlStateSelected]; } //设置标题 [btn setTitle:_menuArray[i] forState:UIControlStateNormal]; //添加点击事件 [btn addTarget:self action:@selector(btnClick:) forControlEvents:UIControlEventTouchUpInside]; [self addSubview:btn]; } //创建底部划线(先判断是否有划线) if (_isNeedLine) { UIView *markLine = [[UIView alloc] initWithFrame:CGRectMake(0, self.frame.size.height - 2, btnW, 2)]; markLine.tag = 999; markLine.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"矩形-2-3.png"]]; [self addSubview:markLine]; }}
点击事件触发的方法中,改变selected状态,若有下划线标识,动画移动,然后触发代理方法即可:
- (void)btnClick:(UIButton *)button{ //遍历子视图数组,把选中button的选中值设为yes,其他设为no for (UIView *subView in self.subviews) { if ([subView isKindOfClass:[UIButton class]]) { UIButton *subBtn = (UIButton *)subView; if (subBtn.tag == button.tag) { [subBtn setSelected:YES]; }else { [subBtn setSelected:NO]; } } } if (_isNeedLine) { //动画移动底部划线(判断) UIView *markView = (UIView *)[self viewWithTag:999]; [UIView animateWithDuration:0.2f animations:^{ markView.frame = CGRectMake((button.tag - 1501) * (button.frame.size.width), self.frame.size.height - 2, button.frame.size.width, 2); }]; } //实现代理方法 if ([self.myDelegate respondsToSelector:@selector(getTag:)]) { [self.myDelegate getTag:button.tag]; }}
0 0
- 用Button子类化封装假的分段控件
- VC控件的子类化
- Android基础知识之控件系列(3)——Button的非直接子类们
- 控件子类化的两种方式
- 通过子类化的方法定制控件
- iphone开发之基本UI控件(Button控件,开关控件,分段控件,滑块控件,WebView)
- 分段控件的属性详解
- 控件子类化
- 子类化控件
- MFC-- 子类化控件
- MFC子类化控件
- EasySegmentedBarView简单易用的自定义分段控件,方便快速实现分段效果
- VC控件-子类化控件
- 子类化Button[Control.OnMouseMove 方法]
- BUTTON控件的应用
- JavaFX 的 Button 控件
- vc控件子类的例子
- 用窗口子类化技术改进Windows编辑框控件的功能
- JS中的双向数据绑定及Object.defineProperty方法
- 1029. Median (25)
- 获知局域网内他人的上网数据和行为
- IOS NSString 装 NSData两种方式的不同
- Javascript面向对象编程(二):构造函数的继承
- 用Button子类化封装假的分段控件
- 测试相关,上线相关 经验总结odps sqltask(自己看的)
- 少量修改
- Java并发编程 - Latch和Barrier的区别
- mysql遇到错误: "too many connections" 错误
- 【LEETCODE】66-Plus One
- Javascript面向对象编程(三):非构造函数的继承
- 【android_温故知新】Git的常用命令
- addChildVC使用及个人分析