干货!老司机工作中用到的自定义控件,总有一个适合你的(一)
2016-11-10 本文已影响4976人
杂雾无尘
今天总结了一下平时工作中为那些奇葩的UI设计自定义的控件,下面一个个分享给大家。
一、第一个是tableView的透明度渐变效果
1、效果:
很多app用到了这种效果,比如歌词显示、直播间聊天记录等。
大致效果如下:
除此之外还在.h放出了这些属性
// 所有title
@property (nonatomic, strong, readonly) NSArray *titles;
// 底部的滑块
@property (nonatomic, strong, readonly) UIView *backgroundView;
// 辅助属性,当前选中的Button
@property (nonatomic, strong, readonly) UIButton *selectButton;
// 为选中的button颜色
@property (nonatomic, strong) UIColor *normalColor;
// 选中的button颜色
@property (nonatomic, strong) UIColor *selectColor;
// 滑块颜色
@property (nonatomic, strong) UIColor *sliderColor;
// 边框颜色
@property (nonatomic, strong) UIColor *edgingColor;
// 边框颜色
@property (nonatomic, assign) CGFloat edgingWidth;
以便使用者可以单独设置某个颜色
// 点击title的block回调
@property (nonatomic, copy) void(^tClick)(NSInteger index);
// 点击title的block回调,selectButton:选中的button
@property (nonatomic, copy) void(^titleClick)(NSInteger index, UIButton *selectButton);
还有这两个block,一个block只有选中下标参数,另外一个有选中下标和选中的button两个参数
好吧!我承认很多人喜欢用代理而不是block,为什么不提供代理方法呢?OK,Here!
@protocol WZBSegmentedControlDelegate <NSObject>
@optional
// segmented点击的时候调用,selectIndex:选中的index
- (void)segmentedValueDidChange:(WZBSegmentedControl *)segment selectIndex:(NSInteger)selectIndex;
// segmented点击的时候调用,selectIndex:选中的index,fromeIndex:从哪个index点过来的
- (void)segmentedValueDidChange:(WZBSegmentedControl *)segment selectIndex:(NSInteger)selectIndex fromeIndex:(NSInteger)fromeIndex;
// segmented点击的时候调用,selectIndex:选中的index,fromeIndex:从哪个index点过来的,selectButton:选中的button
- (void)segmentedValueDidChange:(WZBSegmentedControl *)segment selectIndex:(NSInteger)selectIndex fromeIndex:(NSInteger)fromeIndex selectButton:(UIButton *)selectButton;
// segmented点击的时候调用,selectIndex:选中的index,fromeIndex:从哪个index点过来的,selectButton:选中的button,allButtons:所有的button
- (void)segmentedValueDidChange:(WZBSegmentedControl *)segment selectIndex:(NSInteger)selectIndex fromeIndex:(NSInteger)fromeIndex selectButton:(UIButton *)selectButton allButtons:(NSArray *)allButtons;
@end
注释很清楚
简单给大家讲下拖动的时候颜色渐变的实现,直接上代码
// 根据颜色拿到RGB数值
void getRGBValue(CGFloat colorArr[3], UIColor *color) {
unsigned char data[4];
// 宽,高,内存中像素的每个组件的位数(RGB应该为32),bitmap的每一行在内存所占的比特数
size_t width = 1, height = 1, bitsPerComponent = 8, bytesPerRow = 4;
// bitmap上下文使用的颜色空间
CGColorSpaceRef space = CGColorSpaceCreateDeviceRGB();
// 指定bitmap是否包含alpha通道
uint32_t bitmapInfo = 1;
// 创建一个位图上下文。当你向上下文中绘制信息时,Quartz把你要绘制的信息作为位图数据绘制到指定的内存块。一个新的位图上下文的像素格式由三个参数决定:每个组件的位数,颜色空间,alpha选项。alpha值决定了绘制像素的透明性
CGContextRef context = CGBitmapContextCreate(&data, width, height, bitsPerComponent, bytesPerRow, space, bitmapInfo);
// 设置当前上下文中填充颜色
CGContextSetFillColorWithColor(context, [color CGColor]);
// 在此区域内填入当前填充颜色
CGContextFillRect(context, CGRectMake(0, 0, 1, 1));
CGContextRelease(context);
CGColorSpaceRelease(space);
for (NSInteger i = 0; i < 3; i++) {
colorArr[i] = data[i];
}
}
这是写的一个c语言函数,每句基本都有注释,说白了就是把RGB颜色拆分开,R是多少,G是多少,B是多少,然后放数组里。
// 找出要操作的两个button设置颜色
NSMutableArray *buttonArr = [NSMutableArray array];
for (UIButton *button in self.allButtons) {
CGFloat overLapWidth = CGRectIntersection(button.frame, self.backgroundView.frame).size.width;
if (overLapWidth > 0) {
[buttonArr addObject:button];
}
}
// 切换的时候
if (buttonArr.count > 1) {
UIButton *leftButton = buttonArr.firstObject;
UIButton *rightButton = buttonArr.lastObject;
// 设置要渐变的两个button颜色
[rightButton setTitleColor:WZBColor([self getRGBValueWithIndex:0 button:rightButton], [self getRGBValueWithIndex:1 button:rightButton], [self getRGBValueWithIndex:2 button:rightButton]) forState:UIControlStateNormal];
[leftButton setTitleColor:WZBColor([self getRGBValueWithIndex:0 button:leftButton], [self getRGBValueWithIndex:1 button:leftButton], [self getRGBValueWithIndex:2 button:leftButton]) forState:UIControlStateNormal];
}
先找到两个需要更改颜色的button,按照button和底部滑块交叉区域的宽度比例,切换每个R、G、B的值,具体大家可以下载最新的源码
有不懂或者任何疑问的地方都可以在下方评论,或者随时联系我,您还可以用QQ扫描底部的二维码加入我们的技术交流群,我在那里等着你!
想看更多,请点击:干货!老司机工作中用到的自定义控件,总有一个适合你的(二)
怎么样,这些您学会怎么用了吗?
请不要吝惜,随手点个喜欢或者关注一下吧!您的支持是我最大的动力😊!
此系列文章持续更新,您可以关注我以便及时查看我的最新文章或者您还可以加入我们的群,大家庭期待您的加入!